Spring Cloud---Feign

mac2024-05-23  56

我们在微服务之间调用用的是RestTemplate,但是这个存在一个问题,就是在调用时是通过拼接字符串的方式构造URL的,该URL只有一个参数,然而在现实中肯定不会是一个参数,所以用起来很不友好。 Feign是声明式、模板化的Http客户端。可以让我们更加便捷的调用Http API。

服务消费者整合Feign

(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注解。

自定义Feign配置

在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支持对请求和响应的压缩。配置如下:

feign.compression.request.enabled = true feign.compression.response.enabled = true

使用Feign构造多参数请求

Get请求

假如要请求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?

Feign整合了Ribbon和Hystrix,可以让我们不再需要显示地使用这两个组件。

最新回复(0)