什么是Feign
Feign是spring cloud提供的一个声明式的伪http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一天注解即可。
Nacos很好的兼容了Feign,Feign默认默认继承了Ribbon,所以在nacos下使用Feign默认就实现了负载均衡的效果。
Ribbon支持的负载均衡策略
负载均衡就是将请求分摊给多个实例进行进行处理。
根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。
客户端负载均衡指的是发生在服务请求的一方,也就是在服务请求之前已经选好了由哪个实例进行处理。
我们在微服务中一般会选择客户端负载均衡,Ribbon就是在客户端进行了负载。
Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为:com.netflix.loadbalancer.IRule,具体的负载策略如下图所示:
如何使用Feign
我们使用第一章中的nacos-discovery-server作为服务提供者,提供了一个“/hello”的接口。新建一个alibaba-client-feign的服务作为消费者。
pom文件中假如openfeign的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
在启动类上加上支持feign的注解
@EnableFeignClients // 开启feign
创建一个feign客户端并使用feign调用微服务
@RestController class TestController{ @Autowired Client client; @GetMapping("/test") String test(){ return client.hello("hahaha"); } } @FeignClient(name="nacos-discovery-server") interface Client{ @GetMapping("/hello") String hello(@RequestParam String name); }
注意:在实际开发中,feign客户端都是写在公共模块当中,哪个服务需要调用引入公共模块即可。
Feign的两种实现方式
第一种就是本文中介绍的,Feign和生产者的RequestMapping保持一致。
第二种是在feignClient中提供所有请求的接口,然后controller实现这个feignClient,这样就不必要写重复代码了。
注意点
请求参数为对象是,使用@requestbody
请求参数用@requestParam接收时,必须加上value属性,如@requestParam("name")
请求参数用@pathVariable接收时,必须加上value属性,如@pathVariable("name")
转载自:https://segmentfault.com/a/1190000022625034
公众号【Java旅途】