使用SpringCloud治理微服務是很方便的,demo級別的應用很容易實現,但是要在生產環境使用的話,需要熟悉其配置,避免採坑。
配置
1、使用okhttp代替默認的HttpClient,配置feign超時時間等
feign.okhttp.enabled=true
#這是默認設置也可以針對具體的serviceid設置`
feign.client.config.default.connectTimeout=1000
feign.client.config.default.readTimeout=3000
feign.client.config.default.loggerLevel=basic
使用okhttp後,必須要設置okhttp的最大idle數量和連接保活時間,不然會導致長連接的頻繁關閉,設置如下所示:
@Bean
@ConditionalOnProperty(name = "feign.okhttp.enabled")
@ConditionalOnMissingBean
public okhttp3.OkHttpClient getOkHttpClient() {
ConnectionPool connectionPool = new ConnectionPool(maxIdleConnections, keepAliveMiniutes, TimeUnit.MINUTES);
okhttp3.OkHttpClient client = new okhttp3.OkHttpClient.Builder().connectionPool(connectionPool)
.addInterceptor(new LoggerInterceptor(true))
.build();
return client;
}
2、ribbon的飢餓加載模式
ribbon默認情況下,只有當第一次訪問的時候,纔會從註冊中心加載serviceId的服務信息。
在生產環境下,系統啓動後,如果瞬間流量大的話,會導致請求處理緩慢的情況。
建議生產環境下,採用預加載模式。配置如下所示:
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=spring-cloud-service #此處配置需要預加載的serviceId,逗號分隔
3、啓用hystrix斷路器功能
feign.hystrix.enabled=true
使用hystrix的需要實現對應的接口方法,做降級處理。
日常開發中,如果針對每個接口都寫一個實現fallback的方法會很麻煩,我們針對hystrix定製統一的fallback處理方法,返回json對象或者錯誤消息。如果有個性話的fallback,再單獨實現接口。
4、使用feign攔截器,給上游請求添加統一的header信息
5、使用okhttp攔截器,打印請求日誌
6、feign返回結果使用json編解碼
feign可以使用feign-gson類庫實現對請求返回結果進行json序列化。
配置如下所示:
需要單獨引入包:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-gson</artifactId>
<version>10.10.1</version>
</dependency>
@Bean
@ConditionalOnProperty(name = "feign.decoder.json.enabled", matchIfMissing = true)
@ConditionalOnMissingBean
public Decoder feignDecoder() {
return new GsonDecoder();
}
@Bean
@ConditionalOnProperty(name = "feign.encoder.json.enabled", matchIfMissing = true)
@ConditionalOnMissingBean
public Encoder feignEncoder() {
return new GsonEncoder();
}
使用feign-gson後,接口的返回值必須得是json格式,否則會出現反序列化異常。
本demo使用fastjson類庫實現定製化的json decoder,並且解決接口返回String類型數據的情況。
需要關注的問題
- 服務的降級處理、熔斷處理,配置合理的閥值
- nacos註冊中心默認的心跳時間是5秒
具體參考spring-cloud-demo: