使用SpringCloud治理微服務是很方便的,demo級別的應用很容易實現(xiàn),但是要在生產(chǎn)環(huán)境使用的話,需要熟悉其配置,避免采一些坑。本文是作者在使用過程中的總結的一些注意點。
需要關注的問題
- 服務的降級處理、熔斷處理,配置合理的閥值
- 使用注冊中心時,心跳間隔給發(fā)版帶來的問題。比如nacos是默認5s心跳。
- 服務間調(diào)用
- 監(jiān)控,包括鏈路監(jiān)控,系統(tǒng)運行metrix監(jiān)控等
配置
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數(shù)量和連接?;顣r間,不然會導致長連接的頻繁關閉,設置如下所示:
@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默認情況下,只有當?shù)谝淮卧L問的時候,才會從注冊中心加載serviceId的服務信息。
在生產(chǎn)環(huán)境下,系統(tǒng)啟動后,如果瞬間流量大的話,會導致請求處理緩慢的情況。
建議生產(chǎn)環(huán)境下,采用預加載模式。配置如下所示:
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=spring-cloud-service #此處配置需要預加載的serviceId,逗號分隔
3、啟用hystrix斷路器功能
feign.hystrix.enabled=true
使用hystrix的需要實現(xiàn)對應的接口方法,做降級處理。
日常開發(fā)中,如果針對每個接口都寫一個實現(xiàn)fallback的方法會很麻煩,我們針對hystrix定制統(tǒng)一的fallback處理方法,返回json對象或者錯誤消息。如果有個性話的fallback,再單獨實現(xiàn)接口。
4、使用feign攔截器,給上游請求添加統(tǒng)一的header信息
5、使用okhttp攔截器,打印請求日志
6、feign返回結果使用json編解碼
feign可以使用feign-gson類庫實現(xiàn)對請求返回結果進行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格式,否則會出現(xiàn)反序列化異常。
本demo使用fastjson類庫實現(xiàn)定制化的json decoder,并且解決接口返回String類型數(shù)據(jù)的情況。
具體參考spring-cloud-demo: