本文主要讲解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代理接口,调用对应方法,跟调用本地方法一样。
@RestControllerpublic class TestController {@AutowiredFeignCilentProxy 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,领取干货



本文详细介绍了Spring Cloud中的Feign组件,它是用于微服务间通信的一种简化调用方式,具备负载均衡功能。通过引入依赖、启用Feign、定义服务接口和实际调用来展示其使用步骤。Feign默认使用Ribbon实现客户端负载均衡,支持多种策略。相较于RestTemplate+Ribbon,Feign提供了更简洁的调用体验。
167万+

被折叠的 条评论
为什么被折叠?



