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


版权声明:本文为zhanglixin999原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/zhanglixin999/article/details/128742313