我们在微服务之间调用用的是RestTemplate,但是这个存在一个问题,就是在调用时是通过拼接字符串的方式构造URL的,该URL只有一个参数,然而在现实中肯定不会是一个参数,所以用起来很不友好。 Feign是声明式、模板化的Http客户端。可以让我们更加便捷的调用Http API。
(1)在pom中添加依赖
<dependency> <groupId>org.springframwork.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency>(2)创建一个Feign接口,并添加@FeignClient注解
@FeignClient(name="provider-user") public interface UserFeignClient{ @RequestMapping(value="/{id}",method=RequestMethod.GET) public User findById(@PathVariable("id") Long id); }@FeignClient注解中的provider-user,是一个任意的客户端名称,用于创建Ribbon负载均衡器。 (3)在controller中调用FeignClient接口。 (4)在启动类上添加@EnableFeignClients注解。
在Spring Cloud中,Feign的默认配置类是FeignClientsConfiguration,该类定义了默认使用的编码器,解码器,使用的契约等。 (1)创建Feign的配置类
/** *该类是Feign的配置类 *不应该在主应用程序的@CompontScan中 *将契约修改为feign原生的契约 */ @Configuration public class FeignConfiguration{ @Bean public Contract feignContract(){ return new feign.Contract.Default(); } }(2)将上边的FeignClient接口修改为下边的
@Feign(name="provider-user",configuration="FeignConfiguration.class") public interface UserFeignClient{ @RequestLine("Get /{id}") public User findById(@Param("id") Long id); }feign支持对请求和响应的压缩。配置如下:
feign.compression.request.enabled = true feign.compression.response.enabled = true假如要请求http://provider-user/get?id=1&name=a 最为直接的就是有几个参数,Feign方法接口就有几个参数
@FeignClient(name="provider-user") public interface UserFeignClient{ @RequestMapping(value="/get",method = RequestMethod.GET) public User get1(@RequestParam("id") Long id,@RequestParam("name") String name); }这种可能麻烦点,还可以构造一个参数Map,Feign接口中传入这个参数Map
.... Map paramMap = new HashMap(); paramMap.put("id",id); paramMap.put("name",name); UserFeignClient.get2(paramMap); @FeignClient(name="provider-user") public interface UserFeignClient{ @RequestMapping(value = "/get",method = RequestMethod.GET) public User get2(@RequestParam Map map); }Feign整合了Ribbon和Hystrix,可以让我们不再需要显示地使用这两个组件。