多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## **1.Feign的作用** 1. Feign是Netflix公司开源的轻量级Rest(https://github.com/OpenFeign/feign ),使用 Feign 可以非常方便、简单的实现 Http 客户端,使用 Feign 只需要定义一个接口,然后在接口上添加注解即可。 2. Spring Cloud 对 Feign 进行了封装,***Feign 默认集成了 Ribbon 实现了客户端负载均衡调用。*** * **微服务间的调用就有两种方式:** 1\. 通过微服务名称,获得服务的调用地址 2\. 通过接口+注解,获得服务的调用 ——Feign (为适应业界其它程序员提出的,还是遵循面向接口编程) 类似于以前Mapper接口上使用@Mapper注解进行标识,而使用Feign就只要在接口上标注@FeignClient注解。 ## **2. Feign使用** Feign是发起调用,所以依然在服务消费端配置 **1. 在消费端pom引入Feign启动器依赖** ``` <!--feign 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` **2. 新建 ProductClientService 接口** 新建 ProductClientService 接口,**使用 @FeignClient("服务名称")** 注解标识,来指定调用哪个服务 比如:在代码中调用了 MICROSERVICE-PRODUCT 服务的 /product/list 、/product/get/{id}、/product/add 接口,代码如下: ~~~ @FeignClient(value = "microservice-product") //指定调用的微服务名称 public interface ProductClientService { @RequestMapping(value = "/product/add", method = RequestMethod.POST) boolean add(@RequestBody Product product); @RequestMapping(value = "/product/get/{id}", method = RequestMethod.GET) Product get(@PathVariable("id") Long id); @RequestMapping(value = "/product/list", method = RequestMethod.GET) List<Product> list(); } ~~~ **3. controller直接利用service调用服务提供端即可** ![](https://img.kancloud.cn/16/47/16473e8c56a97ed1f17f38a2d7168dfc_968x231.png) **4. 修改启动类** 添加注解 : @EnableFeignClients ~~~ @SpringBootApplication @EnableFeignClients(basePackages = "com.tuna.springcloud.consumer.service") @EnableEurekaClient //标识 是一个Eureka客户端,测试没有这个注解也可以 public class ProductConsumer_80 { public static void main(String[] args) { SpringApplication.run(ProductConsumer_80.class, args); } } ~~~ 测试 [http://localhost/consumer/product/get/1](http://localhost/consumer/product/get/1) 可以正常负载 ![](https://img.kancloud.cn/f9/77/f97716578def47ff1ea8c353db4a256f_528x141.png)![](https://img.kancloud.cn/ff/d5/ffd573fd09a929095909d80f9b150112_499x119.png) ## **3. Feign原理** 1. 启动类添加@EnableFeignClients注解,Spring会扫描标记了@FeignClient注解的接口,并生成此接口的代理 对象 2. @FeignClient("服务名称 ") 即指定了 product 服务名称,Feign会从Eureka注册中心获取 product 服务列表, 并通过**负载均衡算法进行服务调用.** 3. 在接口方法中使用注解 @RequestMapping(value = "/product/list",method = RequestMethod.GET),指定调 用的url,Feign 会根据url进行远程调用 ## **4. Feign注意事项** SpringCloud对Feign进行了增强兼容了SpringMVC的注解 ,我们在使用SpringMVC的注解时需要注意: 1. @FeignClient接口方法有基本类型参数在参数必须加@PathVariable("XXX") 或 @RequestParam("XXX") 2. @FeignClient接口方法返回值为复杂对象时,此类型必须有无参构造方法。