SpringCloud Ribbon和OpenFeign组件的使用加示意图和详细讲解

目录

SpringCloud Ribbon

Ribbon 介绍

 LB(Load Balance)

LB 分类

1. 集中式LB

2. 进程内LB

实例-前面member-consumer 轮询负载访问10000/10002 底层就是Ribbon 默认的轮询负载算法

Ribbon 架构图&机制

Ribbon 机制

Ribbon 常见负载算法 

替换负载均衡算法-应用实例 

需求分析/图解

1.创建member-service-consumer-80 com/springcloud/config/RibbonRule.java

2.修改member-service-consumer-80 com/springcloud/MemberConsumerApplication.java

SpringCloud OpenFeign

OpenFeign 介绍

Feign 和OpenFeign 区别

Feign

OpenFeign

OpenFeign-应用实例

示意图

创建服务消费模块-通过OpenFeigen 实现远程调用

创建application.yml 内容如下

创建主启动类MemberConsumerOpenfeignApplication80.java

创建com/springcloud/service/MemberFeignService.java,

创建com/springcloud/controller/MemberConsumerFeignController.java

注意事项和细节

日志配置

基本介绍

配置日志-应用实例

1. 在member-service-consumer-openfeign-80 创建com/springcloud/config/OpenFeignConfig.java 

2. 在member-service-consumer-openfeign-80 修改application.yml

测试

OpenFeign 超时

先看一个问题

设置超时时间

1. 修改member-service-consumer-openfeign-80 的application.yml

测试


SpringCloud Ribbon

本篇前言 本篇的项目是跟前面的博客 SpringCloud Eureka 的详细讲解及示意图_尘觉的博客-CSDN博客 是Ribbon结合Eureka

Ribbon 介绍

1. Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具
2. Ribbon 主要功能是提供客户端负载均衡算法和服务调用
3. Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试等。
4. Ribbon 会基于某种规则(如简单轮询,随机连接等)去连接指定服务
5. 程序员很容易使用Ribbon 的负载均衡算法实现负载均衡
6. 一句话: Ribbon: 负载均衡+RestTemplate 调用

官网
1. https://github.com/Netflix/ribbon
2. Ribbon 进入维护状态
3. 官网地址: https://github.com/Netflix/ribbon

 4. Ribbon 目前进入维护模式, 未来替换方案是Spring Cloud LoadBalancer

 LB(Load Balance)

LB 分类

1. 集中式LB

即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如Nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;LB(Load Balance 负载均衡)

2. 进程内LB

将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些服务地址可用,然后再从这些地址中选择出一个合适的服务地址。
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址

实例-前面member-consumer 轮询负载访问10000/10002 底层就是Ribbon 默认的轮询负载算法

Ribbon 架构图&机制

Ribbon 机制

1. 先选择EurekaServer,它优先选择在同一个区域内负载较少的server
2. 再根据用户指定的策略,在从server 取到的服务注册列表中选择一个地址
3. Ribbon 提供了多种策略∶ 比如轮询、随机和根据响应时间加权

Ribbon 常见负载算法 

替换负载均衡算法-应用实例 

需求分析/图解

1. 需求: 将默认的轮询算法改成随机算法RandomRule
2. 浏览器输入: http://localhost/member/consumer/get/1
3. 要求访问的10000/10002 端口的服务是随机的

1.创建member-service-consumer-80 com/springcloud/config/RibbonRule.java

/**
 * RibbonRule: 配置自己的负载均衡算法
 */
@Configuration
public class RibbonRule {

    //配置注入自己的负载均衡算法
    @Bean
    public IRule myRibbonRule() {
        //这里返回的是RandomRule,当然也可以自己指定
        return new RandomRule();
    }
}

2.修改member-service-consumer-80 com/springcloud/MemberConsumerApplication.java

//@EnableEurekaClient 将程序标识为eureka client
@EnableEurekaClient
@SpringBootApplication
@EnableDiscoveryClient //启用服务发现
//指定Ribbon的负载均衡算法
@RibbonClient(name = "MEMBER_SERVICE_PROVIDER_URL",configuration = RibbonRule.class)
public class MemberConsumerApplication {
    public static void main(String[] args) {

        SpringApplication.run(MemberConsumerApplication.class,args);
    }
}

测试
1. 浏览器输入: http://localhost/member/consumer/get/1
2. 观察访问的10000/10002 端口的服务是随机的

图片上面有 这里就不展示了


SpringCloud OpenFeign

OpenFeign 介绍

  1. OpenFeign 是个声明式WebService 客户端,使用OpenFeign 让编写Web Service 客户端更简单
  2. 它的使用方法是定义一个服务接口然后在上面添加注解
  3. OpenFeign 也支持可拔插式的编码器和解码器
  4. Spring Cloud 对OpenFeign 进行了封装使其支持了Spring MVC 标准注解和HttpMessageConverters
  5. OpenFeign 可以与Eureka 和Ribbon 组合使用以支持负载均衡
  6. 官网 https://github.com/spring-cloud/spring-cloud-openfeign

Feign 和OpenFeign 区别

Feign

  1.  Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端
  2.  Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务
  3.  Feign的使用方式是:使用Feign的注解定义接口,调用服务注册中心的服务
  4.  Feign支持的注解和用法请参考官方文档:https://github.com/OpenFeign/feign
  5.  Feign本身不支持Spring MVC的注解,它有一套自己的注解
  6.  引入依赖
        <!--引入feign-starter 就是场景启动器 使用版本仲裁-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
        </dependency>

OpenFeign

  1. OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
  2. OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口
  3. OpenFeign通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务
  4. 引入依赖
        <!--引入openfeign-starter 就是场景启动器 使用版本仲裁-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

精简一句话:OpenFeign 就是在Feign 基础上做了加强, 有些程序员为了方便,说Feign就是指的OpenFeign

OpenFeign-应用实例

示意图

创建服务消费模块-通过OpenFeigen 实现远程调用

1. 参考member-service-consumer-80 创建member-service-consumer-openfeign-80(具体步骤参考以前)

SpringCloud Eureka 的详细讲解及示意图_尘觉的博客-CSDN博客

2. 修改pom.xml

拷贝member-service-consumer-80 的pom.xml 内容,加入openfeign-starter 

    <!--引入相关的依赖: 我们引入了当前需要的依赖,后面如果有其它需要,再灵活调整-->
    <dependencies>

        <!--引入openfeign-starter 就是场景启动器 使用版本仲裁-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--引入eureka client 场景启动器starter-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--引入web-starter 说明我们使用版本仲裁(从父项目继承了版本)
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <!--说明:starter-actuator 是springboot程序的监控系统, 可以实现系统的健康检测
        可以通过http://localhost:80/actuator 看到相关的连接,和信息
        -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>


        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--引入e_commerce_center-common-api-->
        <dependency>
            <groupId>com.wyxedu.springcloud</groupId>
            <artifactId>e_commerce_center-common-api</artifactId>
            <version>${project.version}</version>
        </dependency>

    </dependencies>

创建application.yml 内容如下

server:
  port: 80
spring:
  application:
    name: e-commerce-consumer-openfeign-80

#配置eureka-client
eureka:
  client:
    register-with-eureka: true #将自己注册到Eureka-Server
    fetch-registry: true
    service-url:
      #表示将自己注册到哪个eureka-server
      #这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

创建主启动类MemberConsumerOpenfeignApplication80.java

@SpringBootApplication
@EnableEurekaClient
//启动OpenFeignClient
@EnableFeignClients
public class MemberConsumerOpenfeignApplication {
    public static void main(String[] args) {
        SpringApplication.run(MemberConsumerOpenfeignApplication.class, args);
    }
}

先测试一下看看程序有没有报错在执行后面的配置

创建com/springcloud/service/MemberFeignService.java,

注意:这里是OpenFeign 的核心

@Component
//这里MEMBER-SERVICE-PROVIDER 就是Eureka Server 服务提供方注册的名称
@FeignClient(value = "MEMBER-SERVICE-PROVIDER")
public interface MemberFeignService {

    //这里定义方法-就是远程调用的接口

    /**
     * 1. 远程调用的方式是get
     * 2. 远程调用的url http://MEMBER-SERVICE-PROVIDER/member/get/{id}
     * 3. MEMBER-SERVICE-PROVIDER 就是服务提供方在Eureka Server 注册的服务
     * 4. openfeign 会根据负载均衡来决定调用10000/10002-默认是轮询
     * 5. 因为openfeign 好处是支持了springmvc注解 + 接口解耦
     */
    @GetMapping("/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id);
}

创建com/springcloud/controller/MemberConsumerFeignController.java

@RestController
public class MemberConsumerFeignController {

    //装配MemberFeignService
    @Resource
    private MemberFeignService memberFeignService;

    @GetMapping(value = "/member/consumer/openfeign/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id) {
        return memberFeignService.getMemberById(id);
    }
}

测试

1. 浏览器输入: http://localhost/member/consumer/openfeign/get/1
2. 观察访问的10000/10002 端口的服务是轮询的

注意事项和细节

1. 配Openfeign的使用特点是微服务调用接口+@FeignClient , 使用接口进行解耦

2. @FeignClient(value = "MEMBER-SERVICE-PROVIDER")

这里MEMBER-SERVICE-PROVIDER就是Eureka Server服务提供方注册的名称, 不要写错了

3. 接口方法上: value是不能乱写

远程调用的url 为http://MEMBER-SERVICE-PROVIDER/member/get/{id} 

@GetMapping(value = "/member/get/{id}")
public Result<Member> getMembertById(@PathVariable("id") Long id);

日志配置

基本介绍

1. 说明: Feign 提供了日志打印功能,可以通过配置来调整日志级别,从而对Feign 接口的调用情况进行监控和输出

2. 日志级别

  1. NONE∶默认的,不显示任何日志
  2. BASIC∶仅记录请求方法、URL、响应状态码及执行时间;
  3. HEADERS∶除了BASIC中定义的信息之外,还有请求和响应的头信息;
  4. FULL∶除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。

配置日志-应用实例

1. 在member-service-consumer-openfeign-80 创建com/springcloud/config/OpenFeignConfig.java 

@Configuration
public class OpenFeignConfig {

    @Bean
    public Logger.Level loggerLevel() {
       //日志级别指定为FULL
       return Logger.Level.FULL;
    }
}

2. 在member-service-consumer-openfeign-80 修改application.yml

常见的日志级别有5 种,分别是error、warn、info、debug、trace

.

  1. error:错误日志,指比较严重的错误,对正常业务有影响,需要运维配置监控的;
  2. warn:警告日志,一般的错误,对业务影响不大,但是需要开发关注;
  3. info:信息日志,记录排查问题的关键信息,如调用时间、出参入参等等;
  4. debug:用于开发DEBUG 的,关键逻辑里面的运行时数据;
  5. trace:最详细的信息,一般这些信息只记录到日志文件中。
server:
  port: 80
spring:
  application:
    name: e-commerce-consumer-openfeign-80

#配置eureka-client
eureka:
  client:
    register-with-eureka: true #将自己注册到Eureka-Server
    fetch-registry: true
    service-url:
      #表示将自己注册到哪个eureka-server
      #这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

logging:
  level:
    #对MemberFeignService 接口调用过程打印信息-Debug
    com.wyxedu.springcloud.service.MemberFeignService: debug

测试

1 浏览器: http://localhost/member/consumer/openfeign/get/1
2 结果页面

别忘了,撤销测试日志配置 

OpenFeign 超时

先看一个问题

1. 修改member-service-provider-10000/10002 的com/wyxedu/springcloud/controller/MemberController.java

   //查询的方法/接口
    //这里使用url占位符+@PathVariable
    @GetMapping("/member/get/{id}")
    public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {

        //模拟超时, 休眠5s
        try {
           TimeUnit.MILLISECONDS.sleep(5000);
        } catch (InterruptedException e) {
           e.printStackTrace();
        }

        Member member = memberService.queryMemberById(id);

        //使用Result把查询到的结果返回
        if (member != null) {
            //return Result.success("查询会员成功 member-service-provider-10000 " + color + "-" + address, member);
            return Result.success("查询会员成功 member-service-provider-10000", member);
        } else {
            return Result.error("402", "ID= " + id + "不存在");
        }

    }

2.浏览器访问http://localhost/member/consumer/openfeign/get/1

原因分析: OpenFeign 默认超时时间1 秒钟,即等待返回结果1 秒

设置超时时间

说明: 在某些情况下,一个服务调用时间可能要超过1 秒,就需要重新设置超时时间

1. 修改member-service-consumer-openfeign-80 的application.yml

server:
  port: 80
spring:
  application:
    name: e-commerce-consumer-openfeign-80

#配置eureka-client
eureka:
  client:
    register-with-eureka: true #将自己注册到Eureka-Server
    fetch-registry: true
    service-url:
      #表示将自己注册到哪个eureka-server
      #这里我们将本微服务注册到EurekaServer 集群,使用逗号间隔
      defaultZone: http://eureka9001.com:9001/eureka,http://eureka9002.com:9002/eureka

#logging:
#  level:
#    #对MemberFeignService 接口调用过程打印信息-Debug
#    com.wyxedu.springcloud.service.MemberFeignService: debug

ribbon:
  #1. 设置feign客户端超时时间(openfeign默认支持ribbon)
  #2. ReadTimeout: 8000: 建立连接从服务提供方获取可用资源的所用的全部时间
  #3. 时间单位是毫秒
  ReadTimeout: 8000
  #两端连接所用时间
  ConnectionTimeout: 8000

测试

1. 浏览器输出: http://localhost/member/consumer/openfeign/get/1, 不会出现超时,会轮询访问10000/10002

别忘了,撤销超时测试代码和配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值