# api-client-assembler
**Repository Path**: qimok/api-client-assembler
## Basic Information
- **Project Name**: api-client-assembler
- **Description**: 基于 Feign 的客户端装配器
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-10-26
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 基于 Feign 的客户端装配器
## 一、项目职能
- 基于中台契约自定义装配`FeignClient`
- 基于`Hystrix`的熔断、限流
- 基于`Feign`的默认降级策略
- 基于`Feign`的超时、重试
- `XRC`传递、请求鉴权配置(自行扩展)
- 自定义请求、响应日志打印样式
- 提供扩展点
## 二、执行流程
#### 1、扫描标有`@ApiContract`注解的元数据
#### 2、通过`ApiClientFactoryBean`动态构造`Bean`的定义
#### 3、在`ApiClientFactoryBean`的`getObject()`方法中进行自动装配的核心流程
#### 4、通过注解的元数据,给`Bean`的定义设置其它属性
#### 5、注册`Bean`的定义
## 三、接入
#### 1、引入 Jar
```
// API 客户端装配器
compile("com.qimok:api-client-assembler:$apiClientAssemblerVersion")
// 如引入用户中台契约
compile("com.xxx:user-mid-contract:$userMidContractversion")
```
#### 2、使用
```
@Autowired(required = false)
public ServiceContract serviceClient;
```
## 四、配置相关
#### 1、FeignClient 底层 HTTP 实现
完全由服务消费方自己去配置,如果没有配置,则默认使用`openfeign`中的`HttpClient`
> 服务消费方配置举例(具体如何配置,请自行搜索):
feign.httpclient.enabled=false
feign.okhttp.enabled=true
feign.httpclient.max-connections-per-route=30
feign.httpclient.max-connections=200
feign.httpclient.disable-ssl-validation=false
#### 2、请求拦截器
一共有两类请求拦截器:鉴权拦截器、XRC 拦截器(自行扩展)
> 配置举例:
feign.auth.config.ServiceClient.authMod=reaper
#### 3、熔断、线程池配置(只要开启熔断,每个契约对应的`Client`都要进行熔断和线程池的配置)
> 启用 Hystrix 配置:
feign.hystrix.enabled=true
熔断配置举例:
feign.hystrix.config.ServiceClient.groupKey=ServiceClient
feign.hystrix.config.ServiceClient.commandKey=ServiceClient
feign.hystrix.config.ServiceClient.circuitBreakerEnabled=true
feign.hystrix.config.ServiceClient.executionTimeoutInMilliseconds=20000
...
线程池配置举例:
feign.thread.config.ServiceClient.groupKey=ServiceClient
feign.thread.config.ServiceClient.coreSize=300
feign.thread.config.ServiceClient.maximumSize=400
feign.thread.config.ServiceClient.maxQueueSize=80
...
#### 4、超时配置
如果服务消费方没有自定义配置,则走默认配置(可参考`RequestOptionsProperties#RequestOptionsConfiguration`)
> 配置举例:
feign.request.option.config.ServiceClient.connectTimeoutMillis=5000
feign.request.option.config.ServiceClient.readTimeoutMillis=5000
feign.request.option.config.ServiceClient.follow-redirects=false
...
#### 5、重试配置
如果服务消费方没有自定义配置,则走默认配置(默认不重试)。当超时时,如果配置了重试策略,则会触发重试
> 配置举例:
feign.retryer.config.ServiceClient.period=100
feign.retryer.config.ServiceClient.max-period=1000
feign.retryer.config.ServiceClient.max-attempts=2
...
#### 6、日志配置
自定义请求、响应日志打印样式
#### 7、降级策略(基于 Feign)
目前只实现了一套默认的降级策略,触发降级时,返回`error`
#### 8、配置扩展
当需要接入的中台契约接口类(每个契约接口类对应一个`Client`)特别多的时候,配置也就特别多,
为了减少配置,并保证某些配置可以共用(`注意是共用,而不是复用`),于是,对以上 3、4、5 的配置进行了扩展。
>熔断配置举例:
feign.hystrix.config.`ServiceClient1-ServiceClient2-ServiceClient3`.groupKey=ServiceClient
feign.hystrix.config.`ServiceClient1-ServiceClient2-ServiceClient3`.commandKey=ServiceClient
feign.hystrix.config.`ServiceClient1-ServiceClient2-ServiceClient3`.circuitBreakerEnabled=true
feign.hystrix.config.`ServiceClient1-ServiceClient2-ServiceClient3`.executionTimeoutInMilliseconds=20000
线程池配置举例:
feign.thread.config.`ServiceClient1-ServiceClient2-ServiceClient3`.groupKey=ServiceClient
feign.thread.config.`ServiceClient1-ServiceClient2-ServiceClient3`.coreSize=300
feign.thread.config.`ServiceClient1-ServiceClient2-ServiceClient3`.maximumSize=400
feign.thread.config.`ServiceClient1-ServiceClient2-ServiceClient3`.maxQueueSize=80
超时配置举例:
feign.request.option.config.`ServiceClient1-ServiceClient2-ServiceClient3`.connectTimeoutMillis=5000
feign.request.option.config.`ServiceClient1-ServiceClient2-ServiceClient3`.readTimeoutMillis=5000
feign.request.option.config.`ServiceClient1-ServiceClient2-ServiceClient3`.follow-redirects=false
重试配置举例:
feign.retryer.config.`ServiceClient1-ServiceClient2-ServiceClient3`.period=100
feign.retryer.config.`ServiceClient1-ServiceClient2-ServiceClient3`.max-period=1000
feign.retryer.config.`ServiceClient1-ServiceClient2-ServiceClient3`.max-attempts=2
#### 9、配置注意点:
- 所有数字相关的配置假如出现冲突,优先使用数字最小的配置
举例,假如熔断配置中的`executionTimeoutInMilliseconds`设置为1秒,重试配置中的`period`设置为2秒,则不会触发重试。
- 以上配置严格区分大小写
- 契约的接口类命名是`ServiceContract`,但是进行如上配置的时候,应该将`Contract`替换为`Client`,否则无法处理(目的:将契约和`Client`的定义区分开)
- 针对`8、配置扩展`中的配置,切记同一个`Client`不能配置多个不同的配置
>举例:
1.同一条配置重复
feign.hystrix.config.`ServiceClient1-ServiceClient1`.groupKey=ServiceClient (不允许)
2.不同条配置重复
feign.request.option.config.`ServiceClient1-ServiceClient2-ServiceClient3`.connectTimeoutMillis=5000
feign.request.option.config.`ServiceClient1`.connectTimeoutMillis=5000