1 spring cloud 远程调用
没有看过的小伙伴可以点击传送门先去了解Nacos。有了Nacos做注册中心后,我们就可以获取其他服务的地址进行调用了。远程调用就需要用到我们今天的主角OpenFeign,如果被调用服务存在多个实例就需要进行负载均衡,负载均衡会使用Ribbon。
2 什么是OpenFeign
OpenFeign是用来让微服务之间远程调用的。是一种声明式、模板化的HTTP客户端。提供HTTP远程调用的方法,让远程调用更简单。
OpenFeign底层内置了Ribbon,用来完成调用时的负载均衡。
OpenFeign是在消费者端进行使用的。
调用流程:
1.生产者和消费者启动时会向Nacos进行服务注册。
2.消费者需要调用生产者时,会从Nacos拉取生产者地址列表。
3.消费者通过OpenFeign来调用生产者接口。当生产者有多个实例时,会通过Ribbon进行负载均衡,选择一台生产者服务器进行调用。
Nginx和Ribbon的区别:
Nginx主要负责的是服务端的负载均衡,Ribbon主要负责的是客户端的负载均衡。也就是说Nginx主要将用户请求负载到不同的服务器,Ribbon主要将各个微服务之间的调用进行负载
3 实战演练
1.在消费者pom文件中引入OpenFeign。
由于OpenFeign已经引入了Ribbon,所以我们只需要引入OpenFeign即可。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在消费者启动类上加@EnableFeignClients注解。
3.在生产者服务写一个被调用的接口
4.在消费者服务写一个OpenFeign远程调用的接口
注意:
@FeignClient注解中的value值是生产者在Nacos中注册的服务名。
@FeignClient注解中path值加上方法上的mapping值就是被调用接口的url。
5.在消费者服务调用生产者服务的接口即可。
4 超时时间设置
OpenFeign的超时时间是由底层的Ribbon控制的,Ribbon默认的超时时间是1秒,所以OpenFeign的默认超时时间也是1秒。我们可以通过直接修改Ribbon的超时时间来控制OpenFeign的超时时间。
在配置文件中添加下列配置即可修改OpenFeign超时时间。
ribbon.ReadTimeout=5000 #建立连接的时间5s
ribbon.ConnectTimeout=5000 #建立连接后到获取数据的时间5s
5 日志打印
使用OpenFeign进行服务调用时,默认是不打开日志的。如果需要查看调用参数等信息,可以配置OpenFeign自带的日志。
OpenFeign日志默认有四个等级:
1.NONE:不记录任何日志(默认值)。
2.BASIC:仅记录请求方法、URL、响应状态代码以及执行时间。
3.HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
4.FULL:记录请求和响应的header、body和元数据。
第一步:添加一个OpenFeign配置类,如下图所示。
注意:
1.如果想要全局配置,针对所有调用的服务,就在配置类上添加@Configuration注解。
2.如果想要局部配置,针对某个服务,就不要加@Configuration注解
第二步:如果是局部配置,需要在服务调用接口处添加配置,如下图所示。
第三步:由于OpenFeign日志是debug级别,而SpringBoot日志默认是info级别,所以需要在配置文件中将日志级别改为debug级别。只需要修改上图中ProducterControllerFacade所在的包的日志级别即可
#将com.springcloudalibaba.user.openFeign包下的日志级别修改为debug
logging.level.com.springcloudalibaba.user.openFeign=debug
6 负载均衡算法
Ribbon的负载均衡都是实现了IRule接口,如下图所示。
主要有7种负载均衡策略:
RoundRobinRule: 默认轮询的方式。
RandomRule: 随机方式。
WeightedResponseTimeRule: 根据响应时间来分配权重的方式,响应的越快,分配的值越大。
BestAvailableRule: 选择并发量最小的方式。
RetryRule: 在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server。
ZoneAvoidanceRule: 根据性能和可用性来选择。
AvailabilityFilteringRule: 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)。
修改负载均衡策略:
修改负载均衡策略有两种,一种是配置类,需要在代码中写配置类设置负载均衡算法。第二种是在配置文件中修改,本文只介绍配置文件修改负载均衡算法。
#将调用服务名为payService的服务的负载均衡策略改为随机策略
payService.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule