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
(一)入门使用
依赖
修改打包方式(因为该工程式一个普通的jar 不需要打可执行的jar)
编写声明式接口
@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); } } |
---|
<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适用于生产环境)
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 {
/**
* 根据SpringBoot自动装配FeignClientsConfiguration 的FeignClient的契约是SpringMvc<br />
*<br />
通过修改契约为默认的Feign的锲约,那么就可以使用默认的注解
* **@return<br />
***/<br />
@Bean<br />
**public **Contract feiContract**_() {<br />
_return new **Contract.Default**_()_**;<br />
**_}_** |
| —- |
(四)携带请求头问题
| @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请求设置最大连接数 |
---|