一、Spring Cloud OpenFeign简介
OpenFeign是一个声明式、模板化的HTTP客户端。它使得写Http客户端变得更简单。使用Feign,只需要用JAX-RS或Spring MVC注解创建可以实现的动态接口。
微服务之间的调用本质还是http请求,如果对于每个请求都需要写请求代码,增加请求参数,同时对请求结果做处理,就会存在大量重复工作,而feign非常优雅的帮助我们解决了这个问题,只需要定义一个interface,fegin就知道http请求的时候参数应该如何设置。
同时,feign也集成了ribbon,只要在微服务中依赖了ribbon,feign默认会使用ribbon定义的负载均衡策略。
最重要的是,feign并不是仅仅只能使用在有eureka或者ribbon的微服务系统中,任何系统中,只要涉及到http调用第三方服务,都可以使用feign,帮我们解决http请求的代码重复编写。
二、准备工作
依赖
创建一个feign-service
模块,并添加相关依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
配置
server:
port: 8501
spring:
application:
name: feign-service
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8001/eureka/
feign:
hystrix:
enabled: true
在启动类中添加@EnableFeignClients
注解,以启用feign进行远程调用:
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class FeignServiceApplication {
public static void main(String[] args) {
SpringApplication.run(FeignServiceApplication.class, args);
}
}
三、启动Feign客户服务端
在feign-service模块中添加一个TestService,添加@FeignClient
注解
@FeignClient(value = "eureka-client", fallback = TestFallbackService.class)
public interface TestService {
@GetMapping("/test/test")
Object test();
}
@FeignClient
的常用参数:
value
对应要调用的服务名称fallback
服务调用失败时的回调
同时为其成员方法添加SpringMvc注解,指定要请求的接口路径,这里test方法的效果跟 restTemplate.getForObject("http://eureka-client/test/test", Object.class)
类似
注意到fallback参数指定了TestFallbackService作为其失败时的回调,我们创建一个TestFallbackService实现TestService即可:
@Component
public class TestFallbackService implements TestService {
@Override
public Object test() {
Map<String, Object> map = new HashMap<>();
map.put("code", "-1");
map.put("message", "failed");
map.put("data", "");
return map;
}
}
在控制器中调用:
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/test")
public Object test() {
return testService.test();
}
}
访问路径:http://localhost:8501/test/test
- 负载均衡测试:启动eureka-service,feign-service,和两个eureka-client服务,可测试其负载均衡
- 服务降级测试:只启动eureka-service和feign-service,就可以测试其服务降级
四、日志打印
Feign提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解Feign中Http请求的细节。
日志级别:
NONE
默认的,不显示任何日志;BASIC
仅记录请求方法、URL、响应状态码及执行时间;HEADERS
除了BASIC中定义的信息之外,还有请求和响应的头信息;FULL
除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据。
添加Feign的日志配置:
@Configuration
public class FeignConfig {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
配置TestService的日志级别为debug:
logging:
level:
com.example.cloud.service.TestService: debug
五、Feign的常用配置
feign:
hystrix:
enabled: true #在Feign中开启Hystrix断路器
compression:
request:
enabled: false #是否对请求进行GZIP压缩
mime-types: text/xml,application/xml,application/json #指定压缩的请求数据类型
min-request-size: 2048 #超过该大小的请求会被压缩
response:
enabled: false #是否对响应进行GZIP压缩
logging:
level: #修改日志级别
com.example.cloud.service.UserService: debug
- Feign中的Ribbon配置:在Feign中配置Ribbon可以直接使用Ribbon的配置。
- Feign中的Hystrix配置:在Feign中配置Hystrix可以直接使用Hystrix的配置。