学习笔记视频:https://www.bilibili.com/video/BV1VW4y1o7n5 本课程使用的是目前最新版本2022.0.0.0-RC2。基于Spring Boot 3.0与JDK20的开发环境。 课程内容涵盖了SpringCloudAlibaba所有的技术点,主要讲述包括Nacos Discovery、Nacos Config、OpenFeign、Spring Cloud Loadbalancer、Spring Cloud
4 OpenFeign与负载均衡
前面消费者对于微服务的消费是通过RestTemplate完成的,这种方式的弊端是很明显的:
- 消费者对提供者的调用无法与业务接口完全吻合。例如,原本Service接口中的方法是有返回值的,但经过RestTemplate相关API调用后没有了其返回值,最终执行是否成功用户并不清楚。再例如RestTemplate的对数据的删除与修改操作方法都没有返回值。
- 代码编写不方便,不直观。提供者原本是按照业务接口提供服务的,而经过RestTemplate一转手,变为了URL,使得程序员在编写消费者对提供者的调用代码时,变得不直接、不明了。没有直接通过业务接口调用方便、清晰。
4.1 概述
4.1.1 OpenFeign简介
【翻译】声明式REST客户端:Feign通过使用JAX-RS(Java Api eXtensions of RESTful web Servivces)或SpringMVC注解的修饰方式,生成接口的动态实现。 【解析】Feign,假装、伪装。OpenFeign可以将提供者提供的Restful服务伪装为接口进行消费,消费者只需使用“feign接口 + 注解”的方式即可直接调用提供者提供的Restful服务,而无需再使用RestTemplate。 【总结】对于OpenFeign,可简单总结为以下几点:
- OpenFeign只涉及Consumer与Provider无关。因为其是用于Consumer调用Provider的
- OpenFeign仅仅就是一个伪客户端,其不会对请求做任务的处理
- OpenFeign是通过注解的方式实现RESTful请求的
4.1.2 OpenFeign与Ribbon
OpenFeign具有负载均衡功能,其可以对指定的微服务采用负载均衡方式进行消费、访问。之前老版本Spring Cloud所集成的OpenFeign默认采用了Ribbon负载均衡器。但由于Netflix已不再维护Ribbon,所以从Spring Cloud 2021.x开始集成的OpenFeign中已彻底丢弃Ribbon,而是采用Spring Cloud自行研发的Spring Cloud Loadbalancer作为负载均衡器。
4.2 OpenFeign用法
4.2.1 消费者工程使用
这里无需修改提供者工程,只需修改消费者工程即可。
4.2.1.1 创建工程
复制02-consumer-nacos-8080,并重命名为04-consumer-feign-8080。
4.2.1.2 添加openfeign依赖
注意, 这里使用的是spring-cloud-starter-openfeign依赖,而非spring-cloud-starter-feign依赖。
| <!--feign依赖--><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency> |
---|
4.2.1.3 定义Feign接口
注意,这里的接口名可以是任意的名称,接口中的方法名也可以是任意的名称。但@FeignClient参数指定的提供者服务名称是不能修改的,接口与方法上添加的@XxxMapping中的参数是不能修改的,必须与提供者相应的请求URI相同。 由于其充当的是业务接口,所以一般其定义在service包中。
4.2.1.4 删除Config类
由于这里使用的是Feign,所以无需再定义RestTemplate了,所以就将原来的Config类删除即可。
4.2.1.5 修改处理器
这里使用Feign接口来消费微服务。
4.2.1.6 修改启动类
在启动类上添加@EnableFeignClients注解。
4.2.2 超时设置
4.2.2.1 全局超时设置
在04-consumer-feign-8080工程的配置文件中直接添加如下内容:
4.2.2.2 局部超时设置
在全局设置的基础之上,若想单独对某些微服务单独设置超时时间,只需要将前面配置中的default修改为微服务名称即可。局部设置的优先级要高于全局设置的。
4.2.3 Gzip压缩设置
OpenFeign可对请求与响应进行压缩设置。在04-consumer-feign-8080工程的配置文件中直接添加如下内容:
4.2.4 选择远程调用的底层实现技术
4.2.4.1 理论基础
feign的远程调用底层实现技术默认采用的是JDK的URLConnection,同时还支持HttpClient与OkHttp。 由于JDK的URLConnection不支持连接池,通信效率很低,所以生产中是不会使用该默认实现的。所以在Spring Cloud OpenFeign中直接将默认实现变为了HttpClient,同时也支持OkHttp。 用户可根据业务需求选择要使用的远程调用底层实现技术。
4.2.4.2 配置说明
在spring.cloud.openfeign.httpclient下有大量HttpClient的相关属性设置。其中可以发现,spring.cloud.openfeign.httpclient.enabled默认为true。 在spring.cloud.openfeign.okhttp.enabled默认值为false,表明默认没有启动OkHttp。OkHttp的读超时设置共用了HttpClient的读超时设置属性。
4.3 负载均衡
前面的消费者例子是通过Feign接口来消费微服务的,但没体现出其负载均衡的功能。所以,下面将进行Feign负载均衡功能展示。
4.3.1 需求
下面将构建这样一个系统:一个微服务由三个提供者提供,而消费者对这三个提供者进行负载均衡访问。
4.3.2 启动提供者工程
将02-provider-nacos-8081工程启动三个实例,它们的端口号分别为8081、8082与8083。
4.3.3 默认负载均衡策略
在nacos及三个提供者均启动的前提下,直接启动运行04-consumer-feign-8080消费者工程即可。然后再访问消费者工程。每刷新一次页面,其显示的部门名称后的端口号就发生变化,说明实现了负载均衡。再仔细查看其变化顺序,一定是8082、8083、8084,循环变化。那是因为,OpenFeign的负载均衡器Ribbon默认采用的是轮询算法。
4.3.4 更换负载均衡策略
在04-consumer-feign-8080项目上直接修改。
4.3.4.1 定义一个Config类
4.3.4.2 修改启动类
在启动类上添加@LoadBalancerClients注解,并指定前面定义的配置类。
标签:负载,OpenFeign,4.2,springcloud,提供者,feign,接口,Alibaba From: https://blog.51cto.com/u_12349365/6940911