1.基本概念
- OpenFeign 可以将提供者提供的 Restful 服务伪装为接口进行消费,
消费者只需使用“feign 接口 + 注解”的方式即可直接调用提供者提供的 Restful 服务,而无需再使用 RestTemplate 了。 - OpenFeign 与提供者没有任何关系,是消费者调用提供者的一种方式。
- Ribbon 是 Netflix公司的一个开源的负载均衡项目,是一个客户端负载均衡器,运行在消费者端。OpenFeign 直接内置了 Ribbon。即在导入 OpenFeign 依赖后,无需再专门导入 Ribbon 依赖了。
2.消费者工程 配置OpenFeign
2.1 pom引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2 定义 Feign 接口
@FeignClient("abcmsc-provider-depart")
@RequestMapping("/provider/depart")
public interface DepartService {
@PostMapping("/save")
boolean saveDepart(@RequestBody Depart depart);
@DeleteMapping("/del/{id}")
boolean removeDepartById(@PathVariable("id") int id);
@PutMapping("/update")
boolean modifyDepart(@RequestBody Depart depart);
@GetMapping("/get/{id}")
Depart getDepartById(@PathVariable("id") int id);
@GetMapping("/list")
List<Depart> listAllDeparts();
}
2.3 删除原来RestTemplate的配置文件
2.4 修改控制器,移除原来的resTemplate
@RestController
@RequestMapping("/consumer/depart")
public class DepartController {
@Autowired
private DepartService departService;
@PostMapping("/save")
public boolean saveHandle(@RequestBody Depart depart) {
return departService.saveDepart(depart);
}
@DeleteMapping("/del/{id}")
public void deleteHandle(@PathVariable("id") int id) {
departService.removeDepartById(id);
}
@PutMapping("/update")
public void updateHandle(@RequestBody Depart depart) {
departService.modifyDepart(depart);
}
@GetMapping("/get/{id}")
public Depart getHandle(@PathVariable("id") int id) {
return departService.getDepartById(id);
}
@GetMapping("/list")
public List<Depart> listHandle() {
return departService.listAllDeparts();
}
}
2.5 启动类添加注解
@EnableFeignClients(basePackages = "com.demo.consumer018082.service")
2.6 修改配置文件
2.6.1 设置请求超时
feign:
client:
config:
default:
#指定Feign连接提供者的超时时限,其取决于网络环境
connectTimeout: 5000
#指定Feign从请求到最终获取到提供者的响应的超时时限,其取决于提供者的业务复杂性
readTimeout: 5000
2.6.2 第一次请求失败
原因:由于spring的懒加载机制导致大量的类只有在真正使用的才会真正创建,由于默认的熔断超时时间(1秒)过短,导致第一次请求很容易失败,特别互相依赖复杂的时候。
解决方法:提升熔断超时时间和ribbon超时时间,配置如下:
#设置hystrix超时时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=60000
#请求处理的超时时间
ribbon.ReadTimeout=10000
2.6.3 Feign的Http Client
Feign在默认情况下使用的是JDK原生URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connection。
我们可以用Apache的HTTP Client替换Feign原始的http client,从而获取连接池、超时时间等与性能息息相关的控制能力。
Spring Cloud从Brixtion.SR5版本开始支持这种替换,首先在项目中声明Apcahe HTTP Client和feign-httpclient依赖,然后在application.properties中添加:
feign.httpclient.enabled=true
2.6.4 请求响应压缩
Spring Cloud Feign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。我们只需通过下面两个参数设置,就能开启请求与响应的压缩功能:
feign:
compression:
request:
#开启对请求的压缩
enable: true
#指定要压缩的文件类型
mime-type: ["text/xml","application/xml","application/json"]
#启动压缩的最小文件大小,单位字节
min -request-size: 2048
response:
#开启对客户端响应的压缩
enable: true
2.6.5 日志配置
logging.level.com.kyle.client.feign.inter.HelloServiceFeign=DEBUG
只是添加了如上配置,还无法实现对DEBUG日志的输出。这时由于Feign客户端默认对Logger.Level对象定义为NONE级别,该界别不会记录任何Feign调用过程中对信息,所以我们需要调整它对级别,针对全局对日志级别,可以在应用主类中直接假如Logger.Level的Bean创建,具体如下:
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
对于Feign的Logger级别主要有下面4类,可根据实际需要进行调整使用。
NONE:不记录任何信息。
BASIC:仅记录请求方法、URL以及响应状态码和执行时间。
HEADERS:出了记录BASIC级别的信息之外,还会记录请求和响应的头信息。
FULL:记录所有请求与响应的细节,包括头信息、请求体、元数据等。