基於OpenResty與Consul實現服務網格ServiceMesh


 

一、邏輯架構

 

1、基於OpenResty開發智能代理;

   利用其動態可編程特性,動態化配置nginx服務路由;

2、需要向OpenResty添加weibo開源的upsync服務發現模塊;

3、基於consul建設微服務注冊中心集群;

4、服務網格中的每個node包括至少一個智能代理(openresty+consul client)、若干個微服務。 各個node和注冊中心以及控制平面一起,構成一整個服務網格;

5、每個微服務啟動時需向注冊中心上報自身服務信息,包括ip,端口,服務名等;該工作也可由架構師通過操作控制平面來完成。

6、openresty根據控制平面的配置和需求使用upsync從本機的consul client pull相應的動態服務列表信息,並在本地落地做兜底,防止注冊中心不可用的情況;

7、至此,對於每個微服務:

(1)對外訪問可通過要訪問的服務名由本機的智能代理提供upstream動態負載均衡訪問。

(2)對外提供服務則只需在啟動時調用rest API向本機的智能代理提供自身服務信息即可(或由架構師通過控制平面手工配置);

  即,站在每個微服務的視角,它的眼里只有本機上的那個proxy,對外的服務提供和服務調用都只需要跟這個proxy打交道就可以。

  微服務就從本地各種環境地址、服務對應的ip地址和端口配置里解脫出來了,取而代之的是只需要記住本地這台proxy的端口就可以了,而這個端口是可以統一約定的(比如約定127.0.0.1:8888即為proxy地址)。

  這樣,整個服務集群就可以無耦合的分為兩部分:由各個node上的proxy、控制平面、注冊中心組成的基礎服務網格,以及代表各個業務功能的微服務。

   而由於每個node上proxy的存在,微服務對整個服務網格是無感的、反過來說也即服務網格是對微服務來說是透明的。

二、組件功能需求

1、智能proxy

(1)配置並存放服務注冊中心URL、配置本node需要的外部服務list。

(2)負責發送(轉發)本node上各個service的服務注冊請求到服務注冊中心。

(3)根據外部服務list到服務注冊中心動態獲取服務詳細信息,通過py腳本動態生成本地配置location、 proxy_pass、upstream等,供本node節點的service調用。

2、服務注冊中心

(1)存儲各service服務信息

(2)高可用、無單點故障問題

(3)有統一的管理界面用於各個node和service的查看、健康監控等

(4)提供rest API用於服務的注冊、服務刪除等

三、服務治理平台(控制平面)

1. 注冊功能

將服務(如spring boot)注冊到service catalog存儲上(kv存儲也可以,優先service catelog)

2. 下發腳本並執行

通過訪問consul http restful api接口(端口8500),獲取服務列表,並調用控制平面腳本、根據conf文件模板生成nginx.conf文件,通過ansible下發到調用方nginx所在服務器上。

3. 監控功能

分為日常監控和部署后的結果監控。

如在日常監控方面,可能要監控以下相關內容

3.1 服務健康狀況,包括openresty及spring boot服務,要能識別出服務hang住但進程仍然存在的情況。

3.2 日志監控,包括openresty的access.log,error.log等,以及業務服務的日志

3.3 流量異常,請求超時異常等等其他監控內容

4. 持續發布

進行jar包上傳到目標服務器,停止原進程,啟動新進程

5. 高可用保證機制

1. consul集群是否要持久化,其持久化機制是什么?  server節點為有狀態持久化節點,client為無狀態非持久化節點。

   consul集群中只有server節點參與選舉,由raft算法決定leader。

2. 下發腳本並執行需要每個虛擬機、每個虛擬機來執行,避免腳本全部失敗導致所有服務不可用等等。

3. 安全方面需有服務間、節點間訪問控制機制。

最終實現的效果

每個虛擬機(node)上會配置一個openresty和一個consul client兩者共同組成智能proxy(即sidecar設計模式中的邊車),兩者均啟動在某個固定的port

當我們新增加一個服務時,需要執行以下方法:

1. 通過服務治理平台(控制平面)的持續發布功能,部署服務。

2. 在部署完成之后,調用服務治理平台的注冊功能,將其注冊到本機的consul client中,由consul rpc協議與流言協議同步到整個consul集群;

   另外,將此虛擬機要訪問的外部服務,及本地dump文件路徑,按照控制平面本地的conf文件模板,生成對應的conf文件。

3. 執行其對應的conf文件下發腳本,完成openresty reload。

4. 在openresty啟動完成后,執行監控功能,看openresty配置是否生效。

 

實踐:

      登錄企鵝家cloud充值,然后先安裝openresty:

sudo yum install yum-utils

sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo

sudo yum install openresty

安裝完了驗證一下:

#查看版本信息

openresty -v

ll /usr/local/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM