目录
OpenFeign
简介
常用注解
远程调用
超时控制
配置
日志增强
Feign
远程调用方式
简介
使用
1.引入依赖
2.添加注释
3.编写Feign客户端
4.测试
实现原理
自定义配置
1.日志级别
2.响应结果解析器
3.请求参数编码
4.支持的注解格式
5.失败的重试机制
Feign VS OpenFeign
相同点
不同点
是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign;OpenFeign 是对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持。
注解 | 说明 |
@FeignClient | 该注解用于通知 OpenFeign 组件对 @RequestMapping 注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡和服务调用。 |
@EnableFeignClients | 该注解用于开启 OpenFeign 功能,当 Spring Cloud 应用启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口,生成代理并注册到 Spring 容器中。 |
@RequestMapping | Spring MVC 注解,在 Spring MVC 中使用该注解映射请求,通过它来指定控制器(Controller)可以处理哪些 URL 请求,相当于 Servlet 中 web.xml 的配置。 |
@GetMapping | Spring MVC 注解,用来映射 GET 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。 |
@PostMapping | Spring MVC 注解,用来映射 POST 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.POST) 。 |
Spring Cloud Finchley 及以上版本一般使用 OpenFeign 作为其服务调用组件。由于 OpenFeign 是在 2019 年 Feign 停更进入维护后推出的,因此大多数 2019 年及以后的新项目使用的都是 OpenFeign,而 2018 年以前的项目一般使用 Feign。
1.添加依赖
org.springframework.cloud spring-cloud-starter-openfeign
2.创建接口,并在该接口上使用 @FeignClient 注解实现对服务接口的绑定
//添加为容器内的一个组件
@Component
// 服务提供者提供的服务名称,即 application.name
@FeignClient(value = "MICROSERVICECLOUDPROVIDERDEPT")
public interface DeptFeignService {
//对应服务提供者(8001、8002、8003)Controller 中定义的方法
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") int id);
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List list();
}
注意:
1.在 @FeignClient 注解中,value 属性的取值为:服务提供者的服务名,即服务提供者配置文件(application.yml)中 spring.application.name 的取值
2.接口中定义的每个方法都与服务提供者中 Controller 定义的服务方法对应
3.创建一个Controller 类
@RestController
public class DeptController_Consumer {
@Resource
private DeptFeignService deptFeignService;
@RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Integer id) {
return deptFeignService.get(id);
}
@RequestMapping(value = "/consumer/dept/list")
public List list() {
return deptFeignService.list();
}
}
4.在主启动类上添加 @EnableFeignClients 注解开启 OpenFeign 功能
@SpringBootApplication
@EnableFeignClients //开启 OpenFeign 功能
public class MicroServiceCloudConsumerDeptFeignApplication {
public static void main(String[] args) {
SpringApplication.run(MicroServiceCloudConsumerDeptFeignApplication.class, args);
}
}
应用在启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口生成代理,并注人到 Spring 容器中
5.依次启动服务注册中心集群、服务提供者
OpenFeign 客户端的默认超时时间为 1 秒钟,如果服务端处理请求的时间超过 1 秒就会报错。为了避免这样的情况,我们需要对 OpenFeign 客户端的超时时间进行控制。
application.yml 中添加以下配置
ribbon:
ReadTimeout: 6000 #建立连接所用的时间,适用于网络状况正常的情况下,两端两端连接所用的时间
ConnectionTimeout: 6000 #建立连接后,服务器读取到可用资源的时间
OpenFeign 提供了日志打印功能,我们可以通过配置调整日志级别;Feign 为每一个 FeignClient 都提供了一个 feign.Logger 实例,通过它可以对 OpenFeign 服务绑定接口的调用情况进行监控。
logging:
level:
#feign 日志以什么样的级别监控该接口
net.biancheng.c.service.DeptFeignService: debug
说明:
net.biancheng.c.service.DeptFeignService 是开启 @FeignClient 注解的接口(即服务绑定接口)的完整类名。也可以只配置部分路径,表示监控该路径下的所有服务绑定接口
debug:表示监听该接口的日志级别
Logger.Level 的具体级别如下:
NONE:不记录任何信息。
BASIC:仅记录请求方法、URL 以及响应状态码和执行时间。
HEADERS:除了记录 BASIC 级别的信息外,还会记录请求和响应的头信息。
FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等等。
在Spring cloud 中服务之间通过restful方式调用有两种方式
1.restTemplate+Ribbon :通过服务名称远程调用服务
//url String url = "http://user-service:8081/user/" + order.getUserId(); //发起调用 User user = restTemplate.getForObject(url,User.class);
2.feign:通过接口和注解远程调用服务
Feign是一个声明式的web service客户端,它使得编写web service客户端更为容易。创建接口,为接口添加注解,即可使用Feign。Feign可以使用Feign注解或者JAX-RS注解。Spring Cloud为Feign添加了Spring MVC的注解支持,并整合了Ribbon和Eureka来为使用Feign时提供负载均衡。 feign让微服务之间的调用变得更简单了。
在调用其他微服务的微服务 order-service 的 pom.xml 中添加
org.springframework.cloud
spring-cloud-starter-openfeign
在调用其他微服务的微服务 order-service 的启动类添加注解开启 Feign 的功能
@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
新建一个接口
@FeignClient("user-service")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
在该接口中配置@FeignClient(value = "***")
注解,value值为服务名,可以被其他服务直接调用,通过客户端去找springcloud-provider服务名,进行负载均衡
Feign的实现比较简单,它集成了Rebbon,它只要编写一个接口
和使用注解
即可,它是将所有的业务内容写在一个接口中,服务消费者通过属性注入该接口,去调用该接口中的方法即可完成远程服务间的调用,这样就感觉到远程服务间的调用和之前的本地Controller层调用service层的实现一样简单
feign.Logger.Level
包含4种不同的级别:
NONE:不记录任何信息。
BASIC:仅记录请求方法、URL 以及响应状态码和执行时间。
HEADERS:除了记录 BASIC 级别的信息外,还会记录请求和响应的头信息。
FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等等。
feign.codec.Decoder:http远程调用的结果做解析
feign.codec.Encoder:请求参数编码,便于通过http请求发送
默认SpringMVC注解
默认没有,不过内部集成了Ribbon,会使用Ribbon的重试
1.Feign与OpenFeign作用一样,都是SpringCloud下的远程调用和负载均衡组件
2.Feign与OpenFeign都对Ribbon进行了集成,并通过Ribbon实现了客户端的负载均衡
3.Feign 和 OpenFeign 都是在服务消费者(客户端)定义服务绑定接口并通过注解的方式进行配置,以实现远程服务的调用
1.Feign 和 OpenFeign 的依赖项不同,Feign 的依赖为 spring-cloud-starter-feign,而 OpenFeign 的依赖为 spring-cloud-starter-openfeign
2.Feign 和 OpenFeign 支持的注解不同,Feign 支持 Feign 注解和 JAX-RS 注解,但不支持 Spring MVC 注解;OpenFeign 除了支持 Feign 注解和 JAX-RS 注解外,还支持 Spring MVC 注解