SpringCloud總結

使用SpringCloud治理微服務是很方便的,demo級別的應用很容易實現(xiàn),但是要在生產(chǎn)環(huán)境使用的話,需要熟悉其配置,避免采一些坑。本文是作者在使用過程中的總結的一些注意點。


需要關注的問題

  1. 服務的降級處理、熔斷處理,配置合理的閥值
  2. 使用注冊中心時,心跳間隔給發(fā)版帶來的問題。比如nacos是默認5s心跳。
  3. 服務間調(diào)用
  4. 監(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:

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容