松花皮蛋的黑板報
  • 分享在京東工作的技術感悟,還有JAVA技術和業內最佳實踐,大部分都是務實的、能看懂的、可復現的

掃一掃
關注公眾號

微服務小白入門概述

博客首頁文章列表 松花皮蛋me 2019-03-07 00:32

一、單體應用架構轉向微服務的必然性

  1. 1、部署效率低下:依賴包下載/構建/啟動慢
  2. 2、團隊協作開發成本高
  3. 3、系統可用性差:模塊隔離性差

二、微服務的特點

:單體應用中已經經過足夠時間業務上的檢驗,將其中模式比較穩定,整體高內聚的業務進行抽離

微服務的特點:服務細拆分/獨立部署/獨立維護/服務治理能力要求高

三、服務的發布和引用

常見的方式

XML配置/RESTful API/IDL文件

服務發布

服務引用

實現

基于Javassit的靜態代理攔截:在目標類的基礎上增加切面邏輯,生成增強的目標類

四、注冊和發現服務

以ZooKeeper為例,目前JSF使用的是DB

  1. 1、服務存儲
    一般采用層次化的目錄結構,接口+方法名+分組+協議
  2. 2、健康狀態檢測
    基于客戶端和服務端的長連接和會話超時控制機制(存活/重連的/連上但是心跳連續異常)
  3. 3、服務狀態變更通知
    服務消費者在調用 ZooKeeper 的 getData 方法訂閱服務時,通過監聽器Watcher的process方法獲取服務的變動

    推拉結合

    服務節點緩會存在客戶端

當然要考慮網絡抖動的情況,比如注冊中心不能摘取超時20%的節點

五、RPC遠程調用

  1. 1、網絡連接:TCP/HTTP/SOCKET,目前JSF采用的是基于Netty4實例的TCP長連接
  2. 2、服務端處理請求:同步阻塞、同步非阻塞、異步非阻塞、回調
  3. 3、服務端生成一個CallBack代理類,和消息隊列綁定
  4. 4、數據傳輸協議
  5. 5、序列和反序列:解碼/映射
    {“class”:”com.jd.testjsf.ExampleObj”,”field1″:”xxx”,”field2″:”yyy” }

六、LBS負載均衡實現

  1. 1、FULLNAT
    修改請求報文(源/目的)地址、(源/目的)端口,返回時經過VIP
  2. 2、DLVS
    修改目的MAC(DR模式),返回時不經過VIP
  3. 3、NGINX
    反向代理,返回時不經過VIP

七、負載均衡調度

流量調度

  1. 1、隨機算法
  2. 2、輪詢算法
  3. 3、加權輪詢算法:生成節點序列,如a/b/c權重分別為3/2/1,序列為{a,a,a,b,b,c},依次請求
  4. 4、最少活躍連接算法
  5. 5、一致性hash算法/粘性算法: 同一來源的請求都映射到同一節點

節點上下線調度

將節點切換為下線后,標記為軟下線,不再處理新請求,當舊請求全部處理完后標記為真下線

服務路由

  1. 1、分組調用,同機房調用優先
  2. 2、灰度發布
  3. 3、流量切換
  4. 4、讀寫分離

條件路由

IP路由/參數路由/分組路由,實現A/B測試、熔斷

八、服務跟蹤

traceId:標識某一次具體的請求ID。spanId:標識一次RPC調用在分布式調用的位置


九、架構(以Dubbo為例)

  1. 1、服務發布與引用:
    Proxy 服務代理層,Proxy 根據客戶端和服務端的接口描述,生成接口對應的客戶端和服務端的 Stub,使得客戶端調用服務端就像本地調用一樣。
  2. 2、服務注冊與發現:
    Registry 注冊中心層,Registry 根據客戶端和服務端的接口描述,解析成服務的 URL 格式,然后調用注冊中心的 API。
  3. 3、服務調用:Protocol 遠程調用層
    Protocol 把客戶端的本地請求轉換成 RPC 請求。通過Transporter 層實現通信,Codec 層實現協議封裝,Serialization 層來實現數據序列化和反序列化。
  4. 4、服務監控:Filter 調用鏈層
  5. 5、服務治理:Cluster 層;節點管理、負載均衡、服務路由以及服務容錯

十、微服務的原則

服務拆分不是銀彈,需要圍繞服務治理進行平臺建議,重點是持續交付中的版本管理、部署、配置管理、自動化測試、四個黃金指標監控、日記監控等等,但是整體都離不開以下幾個原則:

  1. 1、圍繞業務的限界上下文定義接口
    不僅能形成更穩定的接口,還能確保我們能夠更好的反映業務流程的變化
  2. 2、接受自動化文化
    比如使用環境定義來明確差異,保持使用統一的部署方式,考慮創建自定義鏡像加快部署,并且創建全自動不可變容器,方便定位系統問題
  3. 3、隱藏內部實現細節
    一個服務獨立于另外一個服務,獨立演化。要明確哪些可以共享哪些需要隔離。
  4. 4、讓一切都去中心化
  5. 5、可獨立部署
  6. 6、隔離失敗
    當使用網絡調用時,不能像使用本地調用那樣處理遠程調用,需要正確設置超時和使用斷路器
  7. 7、高度可觀察
黑龙江6+1开奖结果查询