一、Feign简介

Feign是一个声明式WebService客户端.使用Feign能让编写WebService客户端更加简单。Feign基于Ribbon实现,是Ribbon的Java社区版,即面向接口编程,使用时只需定义一个接口,然后在上面添加注解即可。

Feign旨在使编写Java Http客户端变得更容易
前面在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步封装,由他 来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它(类似于以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可。)即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon时,自动封装服务调用客户端的开发量。

二、Feign 实现负载均衡

1. 创建Feign消费者模块

创建springcloud-consumer-dept-feign模块,整体与笔者本系列第一篇博客中的springcloud-consumer-dept-80类似,这里还需要导入Feign依赖

<!--Feign相关-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
    <version>1.4.6.RELEASE</version>
</dependency>
2. 修改springcloud-api 模块

我们还需要到公共的springcloud-api模块中添加接口,因此也要在springcloud-api模块下导入Feign依赖

新建一个service包并编写接口 DeptClientService,并增加新的注解 @FeignClient

spring cloud alibaba 负载均衡组件 spring cloud 负载均衡算法_微服务


接口内容与服务提供者一致,如下,@FeignClient注解中的value值为微服务名

@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {
    @GetMapping("/dept/get/{id}")
    public Dept queryById(@PathVariable("id") Long id);

    @GetMapping("/dept/list")
    public List<Dept> queryAll();

    @PostMapping("/dept/add")
    public boolean addDept(Dept dept);
}
4. springcloud-consumer-dept-feign模块中修改Controller类
@RestController
public class DeptConsumerController {

    @Autowired
    DeptClientService service;

    @RequestMapping("/consumer/dept/add")
    public boolean add(Dept dept) {
        return service.addDept(dept);
    }

    @RequestMapping("/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id) {
        return service.queryById(id);
    }


    @RequestMapping("/consumer/dept/list")
    public List<Dept> list(){
        return this.service.queryAll();
    }
}
5. 修改主启动类
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = "cn.mitaowulong.springcloud")
public class DeptConsumer_feign {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_feign.class,args);
    }
}

至此,使用Feign实现负载均衡已经实现,默认情况下Feign使用轮询算法,可以看出使用Feign更加简便,只需要在公共模块中创建接口并使用 @FeignClient 注解标注上服务提供者的服务名,同时在消费者主启动类上使用 @EnableFeignClients 注解开启Feign即可

三、Feign 修改默认轮询负载均衡算法

由于Feign是基于Ribbon实现的,所以我们修改Feign的默认轮询负载均衡算法,只需要在配置文件中指定使用的负载均衡算法的路径(自定义负载均衡算法同理),如下,例如我们想要修改为随机算法只需要在配置文件中增加如下配置,其中SPRINGCLOUD-PROVIDER-DEPT是微服务名,表示作用到哪个微服务,com.netflix.loadbalancer.RandomRule 即前面介绍 Ribbon 时里面的随机策略,当然,我们也可以指定为其他策略,包括我们自己定义的,只要把相应的包路径写到这即可

SPRINGCLOUD-PROVIDER-DEPT:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule