1、微服務架構圖:java
2、技術介紹:(技術選型隨着代碼的編寫會完成)nginx
關於技術選型,我盜了一張我老大的微服務技術棧的圖,以下:原文:http://www.jianshu.com/p/2da6becfb019git
我將會用到上圖中的以下技術redis
- 服務註冊和服務發現: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
- 安全鑑權:auth二、openId connect
- 自動化構建與部署:gitlab + jenkins + docker + k8s
3、基本流程:spring
- 各個服務啓動的時候,都會將本身的信息註冊到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。docker
若是不是上邊的流程,只是單純的myserviceB-server要訪問myserviceA-server,那麼須要引入myserviceA-client.jar。緩存
注意:對於服務發現而言,consulServer會經過gossip協議將服務器數據廣播給各個本地consul agent(一般是consulClient),因此咱們不須要作本地緩存,當被調用服務的服務器列表發生改變時,會立刻廣播給consulClient。安全
在後續的代碼編寫過程當中,會逐步經過java語言實現一個微服務的總體架構代碼。springboot