概要
OpenFeign建立在Netflix Feign之上,它通过使用注解和接口定义来隐藏底层的HTTP通信细节,使得开发者可以更加方便地调用远程服务。开发者只需要定义一个接口,并使用注解来描述接口的各个方法,OpenFeign将自动解析注解并生成实际的HTTP请求。
什么是Feign
Feign是一个声明式的http客户端,使用Feign可以实现声明式REST调用,它的目的就是让Web Service调用更加简单。Feign整合了Ribbon和SpringMvc注解,这让Feign的客户端接口看起来就像一个Controller。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息
。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。同时Feign整合了Hystrix,可以很容易的实现服务熔断和降级。
编码实战
我们这里想要实现的效果和之前学习Ribbon案例的效果一样:
这里我们是在前面Eureka的项目里面进行添加,搭建新工程“支付服务”来演示Feign。那在这里支付服务和订单服务充当的角色一样,都是服务消费者,通过调用用户服务来获取数据。
1.创建工程
springCloud-netflixt //父项目
springCloud-netflix-eureka //注册中心EurekaServer
springCloud-netflix-servers-user //用户服务EurekaClient ,提供者
springCloud-netflix-servers-order //订单服务EurekaClient ,消费者
springCloud-netflix-pojo-user //公共user模块
springCloud-netflix-servers-pay //支付服务EurekaClient ,消费者
2.导入依赖
导入Openfeign,Eureka Client和web的依赖包,同时依赖pojo-user模块 ,具体的 pom.xml如下:
<dependencies>
<!-- 在项目中引入Spring Cloud中的Eureka Client组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 在项目中引入Spring Cloud中的openfeign依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- web的基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 导入公共user模块 -->
<dependency>
<groupId>cn.ms</groupId>
<artifactId>springCloud-netflix-pojo-user</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
3.配置类如下
3.1.yml配置:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:10011/eureka/ # 注册地址
instance:
instance-id: payServer # 实例Id
server:
port: 10041 # 端口号
spring:
application:
name: payServer # 服务名
3.2.主配置类:
@SpringBootApplication
// 会去扫描指定包下的@FeignClient注解
@EnableFeignClients // 开启feign的客户端
public class PayApp {
public static void main(String[] args) {
SpringApplication.run(PayApp.class,args);
}
// 使用负载均衡中的随机算法
@Bean
public RandomRule randomRule(){
return new RandomRule();
}
}
4.编写Feign的客户端接口
Feign的客户端接口是用来调用微服务的,我这里就编写了一个用来调用用户服务的客户端接口,如下:
// userServer被调用服务的服务名
@FeignClient("userServer")
public interface UserClient {
@GetMapping("/user/{id}")
User getById(@PathVariable("id")Long id);
}
5.编写Controller使用Feign接口
通过注入UserClient ,直接发起调用
@RestController
public class PayController {
@Autowired
private UserClient userClient;
@GetMapping("/pay/{id}")
public User getById(@PathVariable("id")Long id){
return userClient.getById(id);
}
}
6.测试
依次启动注册中心springcloud-eureka-server-1010 ,两个用户服务springcloud-user-server-1020 , 启动支付服务 springcloud-pay-server-1040 ,
通过浏览器访问pay-server的controller:http://localhost:1040/pay/1,多次请求发现负载均衡算法已经不再是默认的轮询了,而是变成随机算法了:
Feign开启日志调试
有的时候我们需要看到Feign的调用过程中的参数及相应,我们可以对Feign的日志进行配置,Feign支持如下几种日志模式来决定日志记录内容多少:
- NONE,不记录(DEFAULT)。
- BASIC,仅记录请求方法和URL以及响应状态代码和执行时间。
- HEADERS,记录基本信息以及请求和响应标头。
- FULL,记录请求和响应的标题,正文和元数据。
创建Feign配置类
// Feign配置
@Configuration
public class FeignPayConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL; //打印Feign的所有日志
}
}
配置日志打印级别
配置UserClient 的日志打印级别,上面的配置打印Feign的那些内容,下面这个是配置日志框架打印日志的级别,不修改可能打印不出来日志,DEBUG打印日志调试信息。
eureka:
client:
serviceUrl:
defaultZone: http://localhost:10011/eureka/ # 注册地址
instance:
instance-id: payServer # 实例Id
server:
port: 10041 # 端口号
spring:
application:
name: payServer # 服务名
# 配置日志打印级别
logging:
level:
cn.ms: debug # 日志级别为debug
Feign开启GZIP
可以通过开启Feign的数据压缩传输来节省网络开销,但是压缩数据会增加CPU的开销,所以太小的数据没必要压缩,可以通过压缩大小阈值来控制,配置如下:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:10011/eureka/ # 注册地址
instance:
instance-id: payServer # 实例Id
server:
port: 10041 # 端口号
spring:
application:
name: payServer # 服务名
logging:
level:
cn.ms: debug # 日志级别为debug
# Feign开启GZIP
feign:
compression:
request:
enabled: true
min-request-size: 1024 #最小阈值,小于这个不压缩
mime-types: text/xml,application/xml,application/json #压缩哪些类型的数据
response:
enabled: true
小结
OpenFeign是一个功能强大、易于使用的RESTful客户端框架,可以简化和加速微服务间的通信和开发工作。