一、微服務架構圖:
二、技術介紹:(技術選型隨着代碼的編寫會完成)
關於技術選型,我盜了一張我老大的微服務技術棧的圖,如下:原文:http://www.jianshu.com/p/2da6becfb019
我將會用到上圖中的如下技術
- 服務注冊和服務發現:consul
- 服務健康檢查:consul
- 配置管理:consul、archaius
- 集群容錯:hystrix
- 計數監控:codahale-metrics、java-statsd-client、hystrix-dashboard、turbine、statsd、graphite、grafana
- 服務路由:ribbon
- 服務通信:retrofit、AsyncHttpClient(不選擇okhttp,是因為okhttp性能比較差)
- 文檔輸出:swagger
- 日志統計:logback+ELK
- 簡化代碼:lombok
- 消息隊列:rabbitmq
- 分布式鎖:redis實現和consul實現
- 本地緩存:guava cache
- 鏈路跟蹤:zipkin、brave
- 基本技術:springboot
- 安全鑒權:auth2、openId connect
- 自動化構建與部署:gitlab + jenkins + docker + k8s
三、基本流程:
- 各個服務啟動的時候,都會將自己的信息注冊到consulClient,consulClient將注冊信息提交給consulServer,consulServer將信息提交給consulLeader(也是consulServer),consulLeader將自身的數據復制給其他的consulServer,服務注冊完成!!!
- APP發出一個對gatewayX-server的request,該請求先到nginx,nginx選出一台gatewayX-server的服務器進行request的處理
- gatewayX-server通過myserviceA-client.jar來訪問myserviceA-server的具體邏輯
- 首先從consulServer上拉取可用的myserviceA-server的服務器,服務發現完成!!!
- 根據負載均衡策略選出其中一個服務器來進行訪問
- 訪問的過程中通過熔斷器來進行超時容錯處理
- gatewayX-server通過myserviceB-client.jar來訪問myserviceB-server的具體邏輯同3
說明:如果僅僅只是前邊這樣的流程或者以前邊這樣的流程為基礎並且myserviceB-server要調用myserviceA-server,那么上圖中的myserviceB-server中的整個myserviceA-client.jar可以去掉,原因是gatewayX-server已經引入了myserviceA-client.jar。
如果不是上邊的流程,只是單純的myserviceB-server要訪問myserviceA-server,那么需要引入myserviceA-client.jar。
注意:對於服務發現而言,consulServer會通過gossip協議將服務器數據廣播給各個本地consul agent(通常是consulClient),所以我們不需要做本地緩存,當被調用服務的服務器列表發生改變時,會馬上廣播給consulClient。
在后續的代碼編寫過程中,會逐步通過java語言實現一個微服務的整體架構代碼。