Spring Cloud OpenFeign 是声明式的服务调用工具,它整合了Ribbon和Hystrix,拥有负载均衡和服务容错功能.

参考:
https://blog.csdn.net/ThinkWon/article/details/103735751

(一)RestTemplate缺点


ResponseEntity responseEntity = restTemplate.getForEntity(“http://order­
service/order/queryOrdersByUserId/“+userId,List.class);
①:我们不难发现,我们构建上诉的URL 是比较简单的,假如我们业务系统十分复杂,类似如下节点https://www.baidu.com/s?
wd=asf&rsv_spt=1&rsv_iqid=0xa25bbeba000047fd&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-
8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=3&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=328&rsv_sug4=328那么我们构建这个请求的URL是不是很复杂,若我们请求的参数有可能变动,那么是否这个URL是不是很复杂
②:如果系统业务非常复杂,而你是一个新人,当你看到这行代码,恐怕很难一眼看出其用途是什么!此时,你很可能需要寻求老同事的帮助(往往是这行代码的作者,哈哈哈,可万一离职了呢?),或者查阅该目标地址对应的文档(文档常常还和代码不匹配),才能清晰了解这行代码背后的含义!否则,你只能陷入蛋疼的境地!

 使用OpenFeign

(一)入门使用


依赖

org.springframework.cloud
spring‐cloud‐starter‐openfeign


修改打包方式(因为该工程式一个普通的jar 不需要打可执行的jar)




org.apache.maven.plugins
maven‐jar‐plugin




编写声明式接口

@FeignClient(name = “product‐center”)
public interface ProductCenterFeignApi {

/*
声明式接口,远程调用http://product‐center/selectProductInfoById/{productNo}
@param productNo
@return
*/
@RequestMapping(“/selectProductInfoById/{productNo}”)
ProductInfo selectProductInfoById(@PathVariable(“productNo”) String productNo);
}


调用者工程引入这个feign包

谁需要用feign调用谁就引入这个包,


启动类添加
@EnableFeignClients注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Tulingvip03MsAlibabaFeignOrderApplication {

public static void main(String[] args) {
SpringApplication.run(Tulingvip03MsAlibabaFeignOrderApplication.class, args);
}
}
  1. <br />调用feign接口<br />
@Autowired
private ProductCenterFeignApi productCenterFeignApi;

ProductInfo productInfo = productCenterFeignApi.selectProductInfoById(orderNo);

(二)别的项目实现Feign接口

案例:ZJJSpringCloud_Alibaba_2020/06/14 3:11:12_cc0on


我们服务提供者tulingvip03-ms-alibaba-feign-product 的controller 需要实现我们的productCenterFeignApi接口,防止修
改(比如我们的productCenterFeignApi修改了,若没有实现该接口,服务提供者感知不到)
第一步:引入依赖 tulingvip03-ms-alibaba-feign-api
第二步:我们的ProductInfoController实现productCenterFeignApi接口

@RestController
public class ProductInfoController implements ProductCenterFeignApi



(三)自定义Feign

1.自定义日志级别


默认情况下,Feign的调用式不打印日志,我们需要通过自定义来打印我们的Feign的日志 (basic适用于生产环境)
OpenFeign[笔记] - 图1


2.使用@RequestLine注解

| @FeignClient(name = “product-center”, configuration = ProductCenterFeignConfig.class)
//@FeignClient(name = “product-center”)
public interface ProductCenterFeignApi {/**

  • 修改锲约为Feign的 那么就可以使用默认的注解 *
  • @param **productNo
    * @return
    */
    @RequestLine
    (“GET /selectProductInfoById/{productNo}”)
    ProductInfo selectProductInfoById(@Param(“productNo”) String productNo); ** | | —- |

| @Configuration
public class ProductCenterFeignConfig {


/**

  1. * 根据SpringBoot自动装配FeignClientsConfiguration FeignClient的契约是SpringMvc<br />
  2. *<br />
  3. 通过修改契约为默认的Feign的锲约,那么就可以使用默认的注解
  4. * **@return<br />
  5. ***/<br />
  6. @Bean<br />
  7. **public **Contract feiContract**_() {<br />
  8. _return new **Contract.Default**_()_**;<br />
  9. **_}_** |

| —- |

(四)携带请求头问题

| @Bean
public RequestInterceptor requestInterceptor_() {
_return new
TulingRequestInterceptor();
} | | —- |

| /**

  • 把上游服务的请求里面的header设置进去
  • 比如说Product服务通过这个Feign调用Order服务
  • 那么下面配置意思就是将token擦Product服务中转一下再通过Feign带到Order服务 /

    public class TulingRequestInterceptor implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate template) {
    template.header(“token”, UUID.randomUUID().toString());
    *}
    | | —- |

 Feign调优

改http连接,日志级别调低

feign:
client:
config:
product‐center:
loggerLevel: full
contract: feign.Contract.Default
httpclient:
#让feign底层使用HttpClient去调用
enabled: true
max‐connections: 200 #最大连接数
max‐connections‐per‐route: 50 #为每个url请求设置最大连接数