03-08、SpringCloud第八章,升级篇,负载均衡与服务调用Ribbon和OpenFeign

SpringCloud第八章,升级篇,负载均衡与服务调用Ribbon和OpenFeign

一、Ribbon

1、概述

XML 复制代码
SpringCloud Ribbon是给予NetFlex Ribbon 实现的一套客户端负载均衡工具。

简单的说,主要功能是提供客户端的负载均衡算法和服务调用。Ribbon客户端组件提供一系列配置项如:连接超时、重试等。简单地说,就是在配置文件中列出Load Balance后面所有的机器,Ribbon会自动的帮助你基于某种规则去连接这些机器(简单轮询、随机等)。

目前Ribbon官网上也显示处于维护状态,以后SpringCloud可能会使用LoadBalancer替代

2、负载均衡

XML 复制代码
1、什么是负载均衡?
LoadBanlance简单说就是将用户请求平均分配到多个服务器上。从而达到系统的高可用。
常用的如在均衡有Nginx和LVS等。

2、Nginx和Ribbon有何区别?
Nginx是服务器负载均衡,客户端的所有请求都会交给Nginx,然后由Nginx实现请求的转发,即负载均衡是由服务端实现的。
Ribbon是本地负载均衡,在调用微服务接口时,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用。

3、演示

之前我们已经演示了cloud-consumer-order-80项目通过RestTemplate分别调用cloud-provider-payment-8001和cloud-provider-payment-8002的过程。

虽然我们没有引用Ribbon,但是Eureka-client其实已经在内部整合了Ribbon。

Ribbon具体使用,以及IRule自定义负载规则可以看 《SpringCloud第三章,负载均衡Ribbon和Feign

XML 复制代码
<!--正常引用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

MyRule

java 复制代码
@Configuration
public class MyRule {

    @Bean
    public IRule getRule(){
        return new RandomRule();
    }
}

主启动类

java 复制代码
package com.lee.springcloud;

import com.lee.rules.MyRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

/**
 * consumer主启动类
 */
//表示自己是Eureka的客户端
@EnableEurekaClient
@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration = MyRule.class)
@SpringBootApplication
public class OrderMain80 {

    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class,args);
    }
}

二、OpenFeign

1、概述

xml 复制代码
原来我们使用Dubbo实现远程RPC调用时都是Service之间互调。但是Ribbon是在Controller层和RestTemplate结合使用,不太符合我们的使用习惯。因此引出了OpenFeign.

Feign是一个声明式webservice客户端。使用feign能让编写webservice客户端更简单。
它的使用方法是定义一个服务接口,然后在上面添加注解。SpringCloud对Feign进行了封装,使其支持了springmvc标准注解和HttpMessageConverters.Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

openFeign也在内部整合了Ribbon。

2、Feign和OpenFeign两者区别

XML 复制代码
Feign
Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。feign的使用方式是:使用Feign注解定义一个接口,调用这个接口,就可以调用服务注册中心的服务。

OpenFeign
OpenFeign是springcloud在feign的基础上支持了springmvc注解,如@RequestMapping等等。openFeign的@FeignClient注解可以解析springmvc的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务

3、cloud-consumer-order-80构建

pom新增

XML 复制代码
<!--openFeign-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

主启动类新增:

java 复制代码
@EnableFeignClients

PaymenService

java 复制代码
package com.lee.springcloud.feign.service;


import com.lee.springcloud.entities.CommonResult;
import com.lee.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@Service
@FeignClient(name="CLOUD-PAYMENT-SERVICE")
public interface PaymentService {

    @PostMapping("/payment/create")
    CommonResult create(@RequestBody Payment payment);

    @GetMapping("/payment/get/{id}")
    CommonResult getPaymentById(@PathVariable("id") Long id);

}

Controller

java 复制代码
@Resource
private PaymentService paymentService;

@PostMapping("/openFeign/payment/create")
public CommonResult<Payment> create2(@RequestBody Payment payment) {
    return paymentService.create(payment);
}

@GetMapping("/openFeign/payment/get/{id}")
public CommonResult<Payment> getPaymentById2(@PathVariable("id") Long id) {
    return paymentService.getPaymentById(id);
}

测试:

XML 复制代码
启动eureka7001  eureka7002  payment-8001  payment-8002   order-80

调用:http://localhost/consumer/openFeign/payment/get/1

结果:
{"code":200,"message":"查询数据成功 serverPort:8002Payment(id=1, serial=001)","data":null}

4、OpenFeign超时控制

在远程调用的过程中,默认feign客户端只等待1s,但是很多时候服务端处理需要超过1s。导致feign客户端不想等待了。直接反会报错。

为了避免这种情况,我们需要为feign设置超时控制。

4.1、cloud-provider-payment-8001

controller新增

java 复制代码
@GetMapping("/getTimeOutMethos")
public CommonResult getTimeOutMethos(){
    try {
        TimeUnit.SECONDS.sleep(3);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return new CommonResult(404,"超时了",null);
}
4.2、cloud-consumer-order-80

service

java 复制代码
@Service
@FeignClient(name="CLOUD-PAYMENT-SERVICE")
public interface PaymentService {

    @PostMapping("/payment/create")
    CommonResult create(@RequestBody Payment payment);

    @GetMapping("/payment/get/{id}")
    CommonResult getPaymentById(@PathVariable("id") Long id);

    @GetMapping("/payment/getTimeOutMethos")
    CommonResult getTimeOutMethos();

}

controller新增

java 复制代码
@GetMapping("/openFeign/payment/getTimeOutMethos")
public CommonResult getTimeOutMethos(){
    return paymentService.getTimeOutMethos();
}

测试:

xml 复制代码
启动eureka7001 eureka7002  provider-8001  order-80
调用:
http://localhost/consumer/openFeign/payment/getTimeOutMethos

解决:

cloud-consumer-order-80的application.yml新增:

yaml 复制代码
# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
  # 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
  # 指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000

结果:

XML 复制代码
{"code":404,"message":"超时了","data":null}

ication.yml新增:

yaml 复制代码
# 设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
  # 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间
  ReadTimeout: 5000
  # 指的是建立连接后从服务器读取到可用资源所用的时间
  ConnectTimeout: 5000

结果:

XML 复制代码
{"code":404,"message":"超时了","data":null}
相关推荐
m0_675447082 小时前
Java版企电子招标采购系统源业码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
java·spring cloud·企业电子招投标系统源码·招投标系统源码
LUCIAZZZ2 小时前
EasyExcel快速入门
java·数据库·后端·mysql·spring·spring cloud·easyexcel
黄名富4 小时前
Spring Cloud — 深入了解Eureka、Ribbon及Feign
分布式·spring·spring cloud·微服务·eureka·ribbon
LUCIAZZZ5 小时前
SkyWalking快速入门
java·后端·spring·spring cloud·微服务·springboot·skywalking
m0_748245175 小时前
SpringCloud-使用FFmpeg对视频压缩处理
spring·spring cloud·ffmpeg
黄名富8 小时前
Spring Cloud — Hystrix 服务隔离、请求缓存及合并
java·分布式·spring·spring cloud·hystrix·微服务
LUCIAZZZ9 小时前
简单说一下什么是RPC
java·网络·网络协议·计算机网络·spring cloud·rpc
致奋斗的我们11 小时前
Nginx反向代理及负载均衡
linux·运维·mysql·nginx·负载均衡·shell·openeluer
Ares-Wang11 小时前
负载均衡 方式
运维·负载均衡
不要吃栗子李12 小时前
高级运维:1. 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 。2. 基于 openEuler 构建 LVS-DR 群集。
运维·负载均衡·lvs