本文主要讲解spring-cloud-openfeign介绍,以及微服务之间通过Feign如何调用。SpringBoot与Cloud版本:2.6.1->2021.0.0,微服务系列文章持续更新中......
1、什么是Feign
Feign是由Netflix开发出来的另外一种实现负载均衡的开源框架,它封装了Ribbon和RestTemplate,实现了WebService的 面向接口编程,进一步的减低了项目的耦合度,因为它封装了Riboon和RestTemplate,所以它具有这两种框架的功能,可以 实现负载均衡和Rest调用。
2、为什么需要Feign
多个微服务是互相隔离的,那么微服务和微服务之间如何互相调用呢?
显然两个微服务都可以采用http通信,可以通过restTemplate+Ribbon组合进行互相访问,并实现负载均衡。但是这种方式对参数传递和使用都不是很方便,我们需要配置请求head、body,获得响应体后,还需解析等操作,十分繁琐。采用Feign进行服务之间的调用,可以简化调用流程,真正感觉到是在同一个项目中调用另一个类的方法的欢快感。本文主要讲解Feign的方式调用。
3、如何使用
第一步 :引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
第二步: 在启动类上面加上注解:@EnableFeignClients,开启Feign
第三步: 然后编写一个service接口加上@FeignClient()注解 参数就是你的微服务服务名
服务我使用上篇中的cloud-client =》SpringCloud之服务注册与发现(下)
/**
* @Author Mr.Fire
* @Desc Feign调用代理
* @Date 2021/12/5
*/
@FeignClient("cloud-client")
public interface FeignCilentProxy {
@RequestMapping("/order")
public String feignTest();
}
第五步:调用
直接引入写好的Feign代理接口,调用对应方法,跟调用本地方法一样。
@RestController
public class TestController {
@Autowired
FeignCilentProxy feignCilentProxy;
@GetMapping("/getOrder")
public String orderTest(){
String order = feignCilentProxy.feignTest();
System.out.println(order);
return "success";
}
}
第四步:测试
由于我只写了一个服务cloud-client,因此我通过不同端口启动四个服务来测试负载均衡的效果。
测试效果:可以看到Feign已经实现了负载均衡
4、负载均衡
负载均衡就是将请求分摊给多个实例进行进行处理。根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。客户端负载均衡指的是发生在服务请求的一方,也就是在服务请求之前已经选好了由哪个实例进行处理。
我们在微服务中一般会选择客户端负载均衡,Ribbon就是在客户端进行了负载。Feign默认继承了Ribbon,所以自带负载均衡效果,默认轮询策略。
Ribbon支持的负载均衡策略
策略类 | 命名 | 描述 |
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(ribbon默认策略) |
RetryRule | 重试策略 | 在一个配置时间段内,当选择server不成功,则一直尝试选择一个可用的server |
BestAvailableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值) |
ResponseTimeWeightedRule | 响应时间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server |
如何修改策略:
#cloud-client为服务名称,指明对哪个服务进行配置
cloud-client.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
5、总结
目前,在Spring cloud 中服务之间通过restful方式调用有两种方式 restTemplate+Ribbon 或者feign。Feign 是一个使用起来更加方便的 HTTP 客戶端,使用起来就像是调用自身工程的方法,而感觉不到是调用远程方法,写起来更加思路清晰和方便,采用注解方式进行配置,配置熔断等方式方便。
关注公众号,回复666,领取干货