什么是Feign

Feign是spring cloud提供的一个声明式的伪http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一天注解即可。

Nacos很好的兼容了Feign,Feign默认默认继承了Ribbon,所以在nacos下使用Feign默认就实现了负载均衡的效果。

Ribbon支持的负载均衡策略

负载均衡就是将请求分摊给多个实例进行进行处理。

根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。

服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡。

客户端负载均衡指的是发生在服务请求的一方,也就是在服务请求之前已经选好了由哪个实例进行处理。

我们在微服务中一般会选择客户端负载均衡,Ribbon就是在客户端进行了负载。

Ribbon内置了多种负载均衡策略,内部负载均衡的顶级接口为:com.netflix.loadbalancer.IRule,具体的负载策略如下图所示:
image.png

如何使用Feign

我们使用第一章中的nacos-discovery-server作为服务提供者,提供了一个“/hello”的接口。新建一个alibaba-client-feign的服务作为消费者。

  1. pom文件中假如openfeign的依赖


    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  2. 在启动类上加上支持feign的注解

@EnableFeignClients // 开启feign

  1. 创建一个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的两种实现方式

  1. 第一种就是本文中介绍的,Feign和生产者的RequestMapping保持一致

  2. 第二种是在feignClient中提供所有请求的接口,然后controller实现这个feignClient,这样就不必要写重复代码了。

注意点

  1. 请求参数为对象是,使用@requestbody

  2. 请求参数用@requestParam接收时,必须加上value属性,如@requestParam("name")

  3. 请求参数用@pathVariable接收时,必须加上value属性,如@pathVariable("name")


转载自:https://segmentfault.com/a/1190000022625034

公众号【Java旅途】


赞助本站,网站的持续发展离不开你们的支持!一分也是爱ヾ(◍°∇°◍)ノ゙
登陆
      正在加载评论