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注解```java
package 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
@EnableFeignClients
public 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的接口
@Autowired
StockFeignService 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{
@Bean
public 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默认的是debug
logging:
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
全局配置
@Configuration
public class FeignConfig{
@Bean
public 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