什么是Feign
Feign是spring cloud提供的一个声明式的伪http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
Nacos很好的兼容了Feign,Feign默认默认继承了R% & 6 a O J mibbon,所以在nacos下使用Feign默认就实现了负载均衡的e 9 g l $效果。
Ribbon支持的负载均衡策略
负载均衡就是将请求分摊给多个实例! q _进行进行处理。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如| * `常见的nginx负载均衡。
客户端负载均衡指的是发生在服务请求的一方,也就是L c 8 n在服务请求之前已经选好了由哪个实例进行处理。
我们在微服务中一般会选择客户端负载均衡,Ribbon就是在客户端进行了负载。
Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为:com.netflix.loadbalancer.IRu~ % p + ;le,具体的负载策略如下图所示:
策略类 | 命名_ p A J m d } S 0 | 描述 |
---|---|---|
RandomRule | 随机策略 | 随机选择server |
RoundRobinRule | 轮询策略 | 按照顺序选择server(ribbon默认策略) |
RetryRule | 重试策略 | 在一个配置时间段内,当选择server不成功d : . 8 / : P e,则一直尝试选择一个可用的server |
Bp L [ E @ ? G J @estAvaiJ D C c Q t -lableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server |
AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为ci9 i H ) r Lrcuit tripped的server,过滤掉那些高并发链接的serv0 8 J e Qer(active connections超过配置的阈值)? 6 b n } 6 # |
ResponseTimeWeightedRule | 响应时7 % ! c K间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低+ / D N ,。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
ZoneAvoidanceRule | 区域权重* ; .策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server |
如何使用Feign
我们~ / 1 ~使用第一章中的nv 4 B T ^ B U dacos-discovery_ c # w i [-server作为服务提供者,提供了一个“/hello”的接口。新建一个alib4 : G | ; xaba-c[ P @ O 1 R N liC J v u X H n nent-feign的服务作为消费者。
- pom文件中假如openfeign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfN 9 + keign<| q L 3 D . p 7 +/artifactId>
</dependency>
- 在启动类上加上支持feign的注解
@EnableFeignClients // 开启feign
- 创建一个feign客户端并使用feign调用微服务
@RestController
class TestController{
@Autowired
Client client;
@GetMapping("/test")
String test(){
return client Z j ` y ( ( Kt.hello("hahaha");
}
}
@FeignClient(name="nacos-discovery-server")
interface Client{
@GetMappin: x A s Y hg("/hello")
String hello(@RequestParam String name);
}
注意:1 i D在实际开发中Q ) b W U b,feign客户端都是写c n n在公共模块当中,哪个服务需要c m X ? i h J I *调用y 5 K q 4引入公共模块即可。
Feign的两种U p + V ~ ] H实现方式
- 第一种就是本文中介绍的,Feign和! m ( 4 V Z f d )生产者的RequestMapping保持一致。
- 第二种是在feignClient中提供所有请求的接口,然后controller实现这个feignClient,这样就不必要写重复代码了。
注意点
- 请求参数为对象是,使用@requestbody
- 请求参数用@requestParam接收时,必须加上value属性,如@requestParam("name")
- 请求参数用@pathVh 6 M 6 k 8 h Aariable接收时,必须加上value属性,如@pathVariable("name")k , } 4 l x