3使用OpenFeign重构远程调用过程

  • OpenFeign开发模式
    精细化控制远程调用
  • OpenFeign高级特性

OpenFeign开发模式

基本应用

Feign到OpenFeign

OpenFeign开发模式

  • 消费者根据服务提供者暴露的API自定义FeignClient
  • 服务提供者提供Feign SDK

@EnableFeignClients注解
告诉系统扫描所有使用@FeignClient定义的Feign客户端
问题:配置到configuration类不生效?

1
2
3
4
5
6
7
@SpringBootApplication(scanBasePackages = "org.geekbang.projects.cs.frontend.business.*")
@EnableFeignClients
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class,args);
}
}

@FeignClient注解
通过服务的名称或地址发起远程调用

1
2
3
4
5
6
@Component
@FeignClient(name ="ticket-service")
public interface Ticketclient {
@RequestMapping(value ="/customerTickets/try",method = RequestMethod.Post)
Result<Boolean> ticketTry(@RequestBody TccRequest<AddTicketRegVO> addTicketRegVO);
}

依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

OpenFeign高级特性

  • 自动降级
  • 超时配置
  • 日志控制
  • 错误解码

自动降级

1
2
3
4
5
6
7
8
9
10
@FeignClient(name = ApiConstants,SERVICE NAME, path = Apiconstants.PREFIX +"/decryptionAuditRecords", fallbackFactory = DecryptionAuditRecordApiFallback.class)
public interface DecryptionAuditRecordApi {
@RequestMapping(value="/",method = RequestMethod.POST)
void addDecryptionAuditRecord(@RequestBody @Validated AddDecryptionAuditRecordRegaddDecryptionAuditRecordReg);
}

public class DecryptionAuditRecordApiFallback implements DecryptionAuditRecordApi {
@Override
public void addDecryptionAuditRecord(AddDecryptionAuditRecordReg addDecryptionAuditRecordReq) {}
}

超时配置

1
2
3
4
5
6
7
8
9
feign:
client:
config:
default:# 全局超时配置
connectTimeout:1000 # 网络连接阶段1秒超时
readTimeout:5000 # 服务请求响应阶段5秒超时
provider-service:# 针对特定服务"provider-service"的超时配置,优先级高于全局配置
connectTimeout:1000
readTimeout:2000

日志控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Configuration
@EnableFeignclients()
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerlevel(){
return Logger.Level.FULL;
}
}

配置文件配置:
loggin:
level:
org:
geekbang:
projects:
cs:DEBUG

日志级别

  • NONE:不记录任何信息,这是OpenFeign默认的日志级别;
  • BASIC:只记录服务请求的URL、HTTP Method、响应状态码(如 200、404等)和服务调用的执行时间:
  • HEADERS:在BASIC的基础上,还记录了请求和响应中的HTTPHeaders;
  • FULL:在HEADERS级别的基础上,还记录了服务请求和服务响应中的Body和metadata FULL级别记录了最完整的调用信息。
1
2
3
4
5
6
7
8
@Configuration
@EnableFeignclients()
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerlevel(){
return Logger.Level.FULL;
}
}

错误解码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Confiquration
@EnableFeianclients()
public class FeignConfiguration {
@Bean
FeignErrorDecoder errorDecoder()
return new FeignErrorDecoder();
}

public class FeignErrorDecoder extends ErrorDecoder Default {
private static final Logger logger = LoggerFactory.getLogger(FeignErrorDecoder.class);
@Override
public Exception decode(String methodKey, Response response){
Exception exception =super.decode(methodKey, response);
logger.error(exception.getMessage(),exception);
return exception;
}
}

思考题

  1. 微服务为什么不用dobbu?
    dubbo重在哪里?
    spring cloud提供开箱即用解决方案
    Dubbo额外集成网管,配置中心等。

  2. OpenFeign在使用上与传统RestTemplate有什么区别?