《springcloud微服務之間相互呼叫》框架選型及實戰
阿新 • • 發佈:2020-07-08
一、場景再現
假設我們有這樣一個場景:
使用者付款成功後,扣除使用者金額,還要減少倉庫數量。按照微服務的設計理念,使用者具有至少以下3個服務(專案):
1、訂單
2、賬戶
3、倉庫
微服務之間都是相互獨立的服務,獨立的專案,獨立的資料庫。每個服務都對外暴露的介面用於呼叫。按照傳統的設計,我們
跨服務呼叫,可以用到tcp或者http,服務呼叫方,通過tcp_client或http_client通過url呼叫,將資料以流的方式傳遞就可以實現。
這種思想我們要能想到,但在現今時代,這樣做未免不太優雅。重複造輪子不是一件高效的做法。因此我們可以秉承”開箱即用,避
免重複造輪子“ 的理念通過以下方式實現:
多個服務註冊統一中心(nacos)
服務之間呼叫通過(feign)
負載均衡利用(feign自帶的ribben)
顧名思義需要滿足以下3點:
1、服務提供者與消費者都註冊到同一nacos中心的同一group
2、服務提供者暴露介面
3、服務消費者整合伺服器提供者暴露的介面,然後加上feign註解,並配置相關feign資訊
二、實戰
2.1、nacos註冊
此處不做贅述,見我其他nacos註冊文章
2.2、feign註冊
2.2.1、pom.xml
<!--服務之間介面呼叫--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
<!-服務提供者暴露的介面-->
<dependency>
<groupId>com.cbi.workflow</groupId>
<artifactId>cbi-workflow-api</artifactId>
<version>${cbi.workflow.version}</version></dependency>
2.2.2、application.yml
feign:
httpclient:
connection-timeout: 30000
enabled: false
okhttp:
enabled: true
#同一個服務例項的重試次數(MaxAutoRetries)、不同服務例項(MaxAutoRetriesNextServer)的重試次數都設定為0,即可達到不重試的目的。
ribbon:
#http讀取響應的超時時間
ReadTimeout: 30000
#http建立socket的超時時間
ConnectTimeout: 30000
#重試相同例項,同一臺例項最大重試次數,包括首次呼叫
MaxAutoRetries: 0
#重試負載均衡其他的例項,最大重試2次,不包括首次的server
MaxAutoRetriesNextServer: 0
#重試所有操作,無論是請求超時或者socket read timeout都進行重試。一般都設定成false,慎用true,有冪等性隱患存在
OkToRetryOnAllOperations: false
management:
endpoints:
web:
exposure:
include: '*'
2.2.3、controller
//value就是nacos註冊的服務名稱,會被解析http://ip:port
//path就是服務提供者的統一全域性攔截路徑,也就是spplication中配置的"context-path: /workflow",如果沒有就配置 "/"
@FeignClient(value = "workflow", path = "/workflow") public interface ICommonOperateFlowable extends IWorkflowHandler { }
解釋:
1、IWorkflowHandler 為服務提供方暴露的介面
2、通過install 服務提供者
3、pom引入服務提供者
4、
2.2.4、IWorkflowHandler
public interface IWorkflowHandler { /** * 發起流程 * * @param wfProcessExecBean * @return */ @PostMapping("/startProcess") ResponseBean startProcess(@RequestBody WfProcessExecBean wfProcessExecBean); }
2.2.5、常見錯誤
無法識別的feign_client
此時檢查配置,@FeignClient註解的名稱是否和服務提供方一致,可以開啟nacos看看服務名稱