记录学习中遇到的Feign远程调用
什么是openFeign组件
Feign是一个声明式的伪HTTP客户端,它使得写HTTP客户端变得简单(1.使用Feign,只需写一个口和注解,2.调用服务代码,自动完成数据传送过程中对象转换),它具有可插拔的注解特性,可使用Feign注解和JAX-RX注解,Feign默认集成了Ribbon,默认实现了负载均衡的效果,并且springcloud为Feign添加了springmvc的注解的支持,它能解决RestTemplate实现服务间通信所有问题。官网:OpenFeign · GitHub
这里有一个对比对象RestTemplate
它也是服务调用的一个组件,为spring框架封装HttpClient对象
String restTemplateproduct=restTemplate.getForObject("http://服务名/url?参数"+name,String.class);
RestTemplate与openFeign相比,存在下面这些问题
- 每次调用服务都需要写这些代码,存在代码冗余
- 路径写死,服务地址如果进行修改,维护成本高
- 必须集成Ribbon来实现负载均衡
- 不能自动转换响应结果为对应对象
openFeign服务调用
1.引入依赖openFeign依赖
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.启动类加入注解,开启openFeign支持
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启openFeign支持
public class OderNacosMain84 {
public static void main(String[] args) {
SpringApplication.run(OderNacosMain84.class,args);
}
}
3.编写Feign客户端
@FeignClient(value = "nacos-payment-provider",fallback = PaymentFallbackService.class)
public interface PaymentService {
@GetMapping(value = "/paymentSQL/{id}")
public CommonResult<Payment> paymentSQL(@PathVariable("id")Long id);
}
这个客户端主要是基于SpringMVC的注解来声明远程调用的信息
服务名称:nacos-payment-provider 请求方式:GET
请求路径:/paymentSQL/{id} 请求参数:Long id
返回值类型:CommonResult<Payment>
这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。
Feign的自定义配置
Feign可以支持很多的自定义配置,如下表所示:
类型 | 作用 | 说明 |
---|---|---|
feign.Logger.Level | 修改日志级别 | 包含四种不同的级别:NONE、BASIC、HEADERS、FULL |
feign.codec.Decoder | 响应结果的解析器 | http远程调用的结果做解析,例如解析json字符串为java对象 |
feign.codec.Encoder | 请求参数编码 | 将请求参数编码,便于通过http请求发送 |
feign. Contract | 支持的注解格式 | 默认是SpringMVC的注解 |
feign. Retryer | 失败重试机制 | 请求失败的重试机制,默认是没有,不过会使用Ribbon的重试 |
这里使用openFeign调用详细日志展示举例
调试程序时,开启详细的日志展示,Feign可以对Feign每个客户端指定日志记录策略,每个客户端都会创建一个Logger,默认情况下,logger的名称是Feign的全限定名。
feign客户端配置各自的logger.level对象,feign记录日志logger.level有四种
- NONE:不记录任何日志信息
- BASIC:仅仅记录请求的方法,url ,响应状态代码和执行时间
- HEADERS:记录BASIC的基础上,还记录了请求和响应的头信息
- FULL:记录请求和响应的header,body和元数据
配置文件(application.yml)方式
开启指定服务展示
feign:
client:
config:
PRODUCTS: # 针对某个微服务的配置
logger-level: FULL # 日志级别
全局开启服务展示
feign:
client:
config:
default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
logger-level: FULL # 日志级别
java代码方式
基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level的对象:
public class DefaultFeignConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC; // 日志级别为BASIC
}
}
@EnableFeignClients#defaultConfiguration
自定义全局默认配置。
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class)
@FeignClient#configuration
单个Feign
接口局部配置。
@FeignClient(value = "服务名", configuration = DefaultFeignConfiguration .class)
结束:
这是在sentinel整合ribbon+openFeign+fallback 时简单的使用Feign远程调用
如果要查看更加详细的Feign配置
转载:Spring Cloud Feign(第六篇) 之自定义配置_annotatedparameterprocessor-优快云博客