ABP vNext微服務架構詳細教程——項目部署


1. 基礎配置

在之前的文章中,我們已經配置了Kubernetes集群並安裝了管理工具Kubesphere,文章地址為:https://mp.weixin.qq.com/s/MgpdMv5A-fYxN7XY8N9Djw

登錄Kubesphere頁面,打開工作台,在平台資源選項卡中點擊“企業空間”,進入企業空間管理頁面,點擊“創建”按鈕,創建我們自己的企業空間。

點擊進入剛剛創建的企業空間,在左側菜單點擊“項目”,打開項目面板,並點擊“創建”按鈕,創建一個新的項目,這里我們名稱為“demoproject”。

點擊進入該項目,在菜單中找到應用負載→應用,選擇自制應用,點擊創建按鈕,填入應用名稱,暫時忽略其他步驟一直點擊“下一步”到創建完成。

2. 部署服務

在demoproject項目菜單中找到配置→保密字典,點擊“創建”,名稱輸入aliyungit,用於配置阿里雲鏡像倉庫用戶名密碼,輸入名稱后點擊下一步,類型選擇“鏡像倉庫信息”。倉庫地址選擇“https://”,后面輸入框中輸入鏡像倉庫公網地址以‘/’分割的第一段文字,例如鏡像公網地址為 registry.cn-beijing.aliyuncs.com/zklight/productmanager ,則我們在輸入框中輸入 registry.cn-beijing.aliyuncs.com 。后面我們輸入鏡像倉庫的用戶名、密碼,點擊驗證通過后點擊“創建”完成該項配置。

在應用負載→應用→自制應用中找到第一章節中我們創建的應用並進入該應用管理頁面,點擊更多操作→添加服務,選擇無狀態服務。輸入名稱並點擊“下一步”,在容器組設置中點擊“添加容器”,在鏡像一欄下拉選框選擇剛才創建的阿里雲鏡像倉庫地址,輸入框中輸入【鏡像倉庫命名空間】/【鏡像倉庫名稱】,例如 zklight/productmanager ,點擊回車,即可出現我們之前上傳的鏡像,在“端口設置”選項卡中的名稱、容器端口、服務端口中分別填入該服務的端口號,例如產品管理服務的端口號為5010,則名稱為“http-5010”,容器端口和服務端口均為5010。容器其他配置如果需要可依據實際情況進行配置,點擊“√”並一直點擊“下一步”完成服務創建。

創建完成后,在項目面板,應用負載→工作負載中可找到工作負載“productmanager-v1”,在應用負載→服務中可找到服務“productmanager”。由於生產環境和開發環境配置文件內容應該不同,所以工作負載暫時無法運行。

在項目面板左側菜單中找到配置→配置字典,點擊“創建”,輸入名稱“productmanagerconfig”,並點擊下一步。在數據設置中點擊添加數據,鍵我們輸入 appsettings ,值我們將產品管理服務的配置文件appsettings.json的所有內容復制過來,並依據我們實際生產環境的配置修改各配置項,修改完成后點擊“創建”完成配置項創建。

這里,如果我們出現服務間相互調用,則使用前面自制應用中添加服務后產生的服務名稱,即應用負載→服務中的服務名稱代替原IP地址或localhost,其他內容不變,Kubernetes會自動完成被調用服務的反向代理。

例如身份管理服務、訂單服務、產品服務名稱分別為identitymanager、ordermanager、productmanager,則在商城服務中RemoteServices配置如下:

"RemoteServices": {
    "Default": {
        "BaseUrl": "http://identitymanager:5000/"
    },
    "ProductManager": {
        "BaseUrl": "http://productmanager:5010/"
    },
    "OrderManager": {
        "BaseUrl": "http://ordermanager:5011/"
    }
}

 在項目面板應用負載→工作負載中找到之前創建的工作負載productmanager-v1並點擊進入,點擊更多操作→編輯配置。找到存儲卷選項卡,點擊“掛載配置字典或密保字典”,在配置字典選項卡點擊“選擇配置字典”,選擇剛才創建的productmanagerconfig。選擇“只讀”,並輸入 /app/appsettings.json 。勾選“選擇特定鍵值”,鍵選擇appsettings(如果一個配置項設置多個Key/Value也是再次區分,建議每個項目一個配置項,每個配置文件一個Key/Value),值輸入 appsettings.json ,如下圖:

 

點擊“√”並點擊“確認”。

點擊更多操作→編輯YAML,編輯工作負載配置文件如下:

在containers選項中找到imagePullPolicy,值設置為Always,標識每次構建重新拉去鏡像。

在containers選項中找到volumeMounts,在其中 mountPath: /app/appsettings.json 這一行下面添加同級內容 subPath: appsettings.json 。

點擊“確定”,工作負載可運行成功則表示配置無誤。

之后,我們按照相同方式依次對各服務進行部署配置。注意API網關中只配置聚合服務層和身份認證服務登錄、刷新Token接口的映射。其將Routes中DownstreamHostAndPorts的Host改為對應服務在Kubernetes的service名稱。具體如下:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/{url}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "identityserver",
          "Port": 4100
        }
      ],
      "UpstreamPathTemplate": "/ids/{url}",
      "UpstreamHttpMethod": [ "Get","Post","Put","Delete" ]
    },
    {
      "DownstreamPathTemplate": "/api/{url}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "admin",
          "Port": 6001
        }
      ],
      "UpstreamPathTemplate": "/admin/{url}",
      "UpstreamHttpMethod": [ "Get","Post","Put","Delete" ],
      "AuthenticationOptions": {
        "AuthenticationProviderKey": "DemoAuth",
        "AllowedScopes": []
      }
    },
    {
      "DownstreamPathTemplate": "/api/{url}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "store",
          "Port": 6002
        }
      ],
      "UpstreamPathTemplate": "/store/{url}",
      "UpstreamHttpMethod": [ "Get","Post","Put","Delete" ],
      "AuthenticationOptions": {
        "AuthenticationProviderKey": "DemoAuth",
        "AllowedScopes": []
      }
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "https://localhost:4000"
  }
}

3. 外部訪問

Kubesphere提供了兩種Kubernetes集群對外提供服務的方式,分別是NodePort和LoadBalancer,詳細介紹請參照官方文檔:https://kubesphere.com.cn/docs/project-administration/project-gateway/

LoadBalancer方式需要配置負載均衡器,通常使用雲服務商提供的負載均衡器實現。所以我這里只簡單介紹NodePort方式,如果需要使用LoadBalancer方式可按文檔自行配置。

這里我們只需要為API網關項目配置外部訪問,集群外部所有訪問必須通過API網關,不能直接訪問其他服務。

在之前配置的demo項目中,找到應用負載→服務,在列表中找到API網關對應的服務,點擊右側 按鈕,選擇“編輯外網訪問”,在訪問方式中選擇NodePort並點擊“確定”。Kubesphere會隨機分配一個端口號,我們也可以在服務列表中點擊“編輯配置文件”來指定端口號,端口號的范圍必須在30000-32767之間。

之后,我們可以通過IP地址端口號來訪問我們的服務集群,IP地址可以為集群中任意一台服務器的IP地址,或者我們配置的彈性EIP的地址,端口號即為上一步分配的端口號。

4.補充說明

作為微服務架構系統,我們通常希望每一個服務都可以部署多個節點,並實現彈性伸縮。Kubesphere為我們提供了非常簡單方便的配置方式,只需要在應用負載→工作負載,點擊進入對應的工作負載,並點擊更多操作→彈性伸縮,並按需求配置我們的副本數和伸縮規則即可。

身份認證服務如果想實現多個服務之間Token互認,也就是說A服務簽發的Token在B服務也可以認證通過,一方面需要所有服務具有統一的接入地址,另一方面需要私鑰文件一致。這里我們使用Kubernetes的Service作為反向代理,保證了入口統一。而ABP vNext框架生成的身份認證服務已經將私鑰文件單獨存放出來(tempkey.rsa),默認情況下部署時不需要做任何額外處理。

這里我們只使用了Kubernetes很少的一部分功能,無論是Kubernetes或是Kubesphere,都為我們提供了非常豐富的功能和擴展空間,可依據自己的項目需求進行選擇。具體請參考它們各自官方文檔。


免責聲明!

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



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