OpenFegin介绍
Fegin是奈飞开发的声明式,模版化的HTTP客户端,其灵感来自Retrofit.Fegin可以帮助我们便捷,优雅的调用HTTP API。Fegin支持多种注解,Fegin使用在消费端。
Spring Cloud openfeign对Fegin进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Fegin的使用更加方便
优势
Fegin可以做到使用HTTP请求远程服务时就像调用本地方法一样的体验。开发者完全感知不到这是远程方法,更感知不到这是个HTTP的请求。它像Dubbo一样,消费者直接调用接口方法调用provider,而不需要通过常规的HTTP客户端构造请求在解析返回数据。它解决了让开发者调用远程接口就像调用本地方法一样。无需关注与远程的交互细节,更无须关注分布式环境的开发
OpenFegin快速使用
- 引入依赖```xml
```<groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
- 编写调用接口+`@FeginClient注解````java package com.tuliingxueyuan.order.fegin;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping;
/**
- @Author:Mr Wang
- @QQ:1046065349
- @CreateTime: 2021/10/30 13:55
- @Descirption: 请求Stock服务端的接口,使用OpenFeign来实现
- 使用 @FeignClient注解来表示这是一个调用的接口
- name :指定要调用rest接口服务的名称
- path: 指定要调用rest接口所在的controller的RequestMapping
- 如果没有指定的requestmapping就不要去指定了 */
@FeignClient(name = “stock-service”,path = “/stock”) public interface StockFeignService { /**
* 声明要调用rest接口对应的方法,方法直接从要调用的服务端的方法名就OK* 需要跟调用的方法注解对上就OK,这里不需要写实现类** 然后就可以在客户端的controller中直接调用对应的方法*/@RequestMapping("/reduce")String reduce();
}
3. 调用端在启动类上添加@EnableFeighClients注解```javapackage com.tuliingxueyuan.order;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.client.RestTemplateBuilder;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.cloud.openfeign.EnableFeignClients;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;/*** @Author:Mr Wang* @QQ:1046065349* @CreateTime: 2021/10/29 09:53* @Descirption: 订单类的启动类*/@SpringBootApplication@EnableFeignClientspublic class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class,args);}@Bean@LoadBalanced //负载均衡器public RestTemplate restTemplate(RestTemplateBuilder builder){RestTemplate restTemplate = builder.build();return restTemplate;}}
- 发起调用,像在本地一样调用远程服务```java package com.tuliingxueyuan.order.contrller;
import com.tuliingxueyuan.order.fegin.StockFeignService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate;
/**
- @Author:Mr Wang
- @QQ:1046065349
- @CreateTime: 2021/10/29 09:46
- @Descirption: */
@RestController @RequestMapping(“/order”) public class OrderController {
/ @Autowired RestTemplate restTemplate;/
//注入OpenFeign的接口@AutowiredStockFeignService stockFeignService;@RequestMapping("/add")public String add(){System.out.println("下单成功!");//使用远程工具进行调用// String message = restTemplate.getForObject("http://localhost:8011/stock/reduce", String.class);//使用nacos注册服务中心发现调用订单系统//String message = restTemplate.getForObject("http://stock-service/stock/reduce", String.class);String message = stockFeignService.reduce();System.out.println(message);return "Hello World"+message;}
}
<a name="7450fb1f"></a>## OpenFegin日志配置Fegin提供了很多的扩展机制,让用户可以更加灵活的使用<a name="34ed12bd"></a>### 1. 日志配置有时候我们遇到bug,比如接口调用失败,参数没收到等问题,或者想看看调用的性能,就需要配置Fegin的日志,以此让Fegin把请求信息书出来<br />**定义一个配置类,指定日志级别**```java//此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置public class FeignConfig{@Beanpublic Logger.Level feignLoggerLevel(){return Logger.Level.FULL;}}
通过源码可以看到日志等级有四种,分别是
- NONE:性能最佳,适用于生成,不记录任何日志
- SASIC:适用于生产环境追踪问题,仅记录请求方法,URL、响应状态码以及执行时间
- HEADERS:记录BASIC级别的基础上,记录请求和响应的header
- FULL:比较适用于开发及测试环境定位问题,记录请求和响应的header、body和元数据
2.局部配置
Feign的配置类上去掉注解,在调用的服务上增加configuration的属性
package com.tuliingxueyuan.order.fegin;import com.tuliingxueyuan.order.config.FeignConfig;import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.RequestMapping;/*** @Author:Mr Wang* @QQ:1046065349* @CreateTime: 2021/10/30 13:55* @Descirption: 请求Stock服务端的接口,使用OpenFeign来实现* 使用 @FeignClient注解来表示这是一个调用的接口* name :指定要调用rest接口服务的名称* path: 指定要调用rest接口所在的controller的RequestMapping* 如果没有指定的requestmapping就不要去指定了*/@FeignClient(name = "stock-service",path = "/stock",configuration = FeignConfig.class)public interface StockFeignService {/*** 声明要调用rest接口对应的方法,方法直接从要调用的服务端的方法名就OK* 需要跟调用的方法注解对上就OK,这里不需要写实现类** 然后就可以在客户端的controller中直接调用对应的方法*/@RequestMapping("/reduce")String reduce();}
3.配置文件实现feign日志局部输出
# 配置日志级别为debug,Springboot默认的日志是info,fegin默认的是debuglogging:level:com.tuliingxueyuan.order.fegin: debug#使用配置文件配置Feign的局部日志文件feign:client:config:stock-service:#需要打印日志的服务名称loggerlevel: FULL
OpenFegin契约配置
Spring Cloud在Feign的基础上做了扩展,使用Spring MVC的注解来完成Feign的功能。原生的Feign是不支持Spring MVC的注解的。如果你想在Spring Cloud中使用原生的注解方式来定义客户端也是客户的。通过配置契约来改变这个配置,Spring Cloud中默认是SpringMvcContract
- 修改契约配置,支持Feign的原生注解```java
/**
- 修改契约的配置,支持Feign原生的注解 */ public Contract FeignContract(){ return new Contract.Default(); } ```
注意:修改了契约配置以后,StockFeignService不再支持springmvc的注解,需要使用原生的
- OrderFeignService中配置使用Feign的原生注解```java
@FeignClient(value=”stock-service”,path=”/stock”)
public interface StockFeignService{
} ```@RequestLine("GET /reduce")R reduce();
- 补充,也可以通过yml的配置契约```yml
feign:
```client:config:stock-service:#对应的微服务contract: feign.Contract.Default #指定Feign原生注解契约配置
OpenFegin超时时间配置
通过Options可以配置连接超时时间和读取超时时间。Options的第一个参数是连接的超时时间,默认值是2s;第二个是请求处理的时间,默认值是5s
全局配置
@Configurationpublic class FeignConfig{@Beanpublic Request.Options options(){return new Request.Options(5000,10000)}}
yml中配置
feign:client:config:stock-service:#对应微服务名称# 连接超时的时间connectTimeout: 5000# 请求处理超时时间readTimeout: 10000
补充说明:Feign的底层用的是Ribbon,但是超时时间以Feign为准
OpenFegin自定义拦截器
需要实现RequestInterceptor接口,重写apply的方法,然后在注册到Bean中去
其他
OpenFeign案例:密码: bqjp
