Spring cloud整合OpenFeign

一. 什么是 OpenFeign

想知道什么是OpenFeign,首先要知道何为Feign?

Feign是SpringCloud组件中一个轻量级RESTFul的HTTP客户端。

Feign内置了Ribbon实现客户端请求的负载均衡。但是Feign是不支持Spring MVC注解的,所以便有了OpenFeign,OpenFeign在Feign的基础上支持Spring MVC注解比如 @RequestMapping等。

OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,通过动态代理生成实现类,实现类做负载均衡并调用其他服务。

二. 项目引入OpenFeign

1. 引入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>com.squareup.okhttp3</groupId>
  7. <artifactId>okhttp</artifactId>
  8. </dependency>

2. Feign调用

  1. @FeignClient("micro-auth")
  2. public interface MicroAuthService {
  3. @PostMapping(value = "/oauth/token")
  4. JsonData getAccessToken(@RequestParam("parameters") Map<String, String> parameters);
  5. }

3. 配置feign底层http调用

  1. feign:
  2. okhttp:
  3. enabled: true

4. feign请求头丢失token,请求头根据实际使用修改

  1. @Configuration
  2. public class OpenFeignConfig {
  3. /**
  4. * feign调用丢失token解决方式,新增拦截器
  5. * @return
  6. */
  7. @Bean
  8. public RequestInterceptor requestInterceptor(){
  9. return template -> {
  10. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
  11. if(attributes!=null){
  12. HttpServletRequest httpServletRequest = attributes.getRequest();
  13. if(httpServletRequest == null){
  14. return;
  15. }
  16. String token = httpServletRequest.getHeader("Access-Token");
  17. template.header("Access-Token",token);
  18. }
  19. };
  20. }
  21. }