微服务RPC调用-OpenFeign的简单使用
2022-01-18 本文已影响0人
侧耳倾听y
使用 OpenFeign 实现跨服务的调用。
1. 添加依赖
<!-- OpenFeign组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 创建feign接口
@FeignClient(value = "test-serv", path = "/test")
public interface TestService {
@GetMapping("/get")
TestObj get(@RequestParam("id") Long id);
}
@FeignClient注解中,
value 属性是目标服务的名称,需要确保这里的服务名称和 Nacos 服务器上显示的服务注册名称是一样的。
path 属性是一个可选项,如果要调用的目标服务有一个统一的前置访问路径,可以通过 path 属性来声明这个前置路径,这样就不用在每一个方法名上的注解中带上前置 Path 了。
OpenFeign 接口中定义的路径和参数必须与你要调用的目标服务中的保持一致。
3. 配置 OpenFeign 的加载路径
// 省略其他无关注解
@EnableFeignClients(basePackages = {"com.example"})
public class Application {
}
4. 注入feign接口
@Autowired
private TestService testService;
这样就可以通过OpenFeign调用远程服务了
高级功能
日志信息打印
- 在配置文件中指定 FeignClient 接口的日志级别为 Debug
默认情况下 Spring Boot 的日志级别是 Info,因此我们必须将应用日志的打印级别改为 debug 后才能看到 OpenFeign 的日志。
logging:
level:
com.example.feign.TestService: debug
- 在应用的上下文中使用代码的方式声明 Feign 组件的日志级别
这里的日志级别并不是传统意义上的 Log Level,它是 OpenFeign 组件自定义的一种日志级别,用来控制 OpenFeign 组件向日志中写入什么内容。
@Bean
Logger.Level feignLogger() {
return Logger.Level.FULL;
}
- NONE:不记录任何信息, 默认的日志级别
- BASIC:只记录服务请求的 URL、HTTP Method、响应状态码和服务调用的执行时间
- HEADERS:在 BASIC 的基础上,还记录了请求和响应中的 HTTP Headers
- FULL:在 HEADERS 级别的基础上,还记录了服务请求和服务响应中的 Body 和 metadata
超时时间配置
feign:
client:
config:
# 全局超时配置
default:
# 网络连接阶段1秒超时
connectTimeout: 1000
# 服务请求响应阶段5秒超时
readTimeout: 5000
# 针对某个特定服务的超时配置
test-service:
connectTimeout: 1000
readTimeout: 2000
降级
- 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.10.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
- 编写降级类
fallback factory可以在降级方法中获取到异常的具体原因。
- fallback
@Slf4j
@Component
public class TestServiceFallback implements TestService {
@Override
public TestObj get(Long id){
log.info("fallback get");
return null;
}
}
在OpenFeign接口配置fallback
@FeignClient(value = "test-serv", path = "/test", fallback = TestServiceFallback.class)
public interface TestService {
@GetMapping("/get")
TestObj get(@RequestParam("id") Long id);
}
- fallback factory
@Component
public class TestServiceFallbackFactory implements FallbackFactory<TestService> {
@Override
public TestService create(Throwable cause) {
// 使用这种方法你可以捕捉到具体的异常cause
return new TestService() {
@Override
public TestObj get(Long id) {
log.info("fallback factory method get");
return null;
}
};
}
}
在OpenFeign接口配置fallback factory
@FeignClient(value = "test-serv", path = "/test",
// 通过抽象工厂来定义降级逻辑
fallbackFactory = TestServiceFallbackFactory.class)
public interface TestService {
// ... 省略方法定义
}
- 添加配置
feign:
circuitbreaker:
enabled: true