在 Istio 環境中部署 Dubbo-go 應用程式

在本章中,我們將使用應用程式範本快速建立一組 Dubbo-go 伺服器和客戶端應用程式,並將它們部署到 Istio 叢集中;觀察、除錯並驗證服務發現和呼叫是否成功。

1. 準備工作

  • 已安裝 dubbo-go cli 工具和相關工具,grpc_cli(用於本地除錯)。
  • 已安裝 docker、helm 和 kubectl 環境。(arm 架構機器需要支援 docker buildx)
  • 已完成任務 [istio 環境部署]

2. 開發伺服器端 Dubbo-go 應用程式

2.1 使用 dubbogo-cli 建立專案範本

$ mkdir mesh-app-server
$ cd mesh-app-server
$ dubbogo-cli newApp .
$ tree .
.
├── Makefile
├── api
│ └── api.proto
├──build
│ └── Dockerfile
├── chart
│ ├── app
│ │ ├── Chart.yaml
│ │ ├── templates
│ │ │ ├── _helpers.tpl
│ │ │ ├── deployment.yaml
│ │ │ ├── service.yaml
│ │ │ └── serviceaccount.yaml
│ │ └── values.yaml
│ └── nacos_env
│ ├── Chart.yaml
│ ├── templates
│ │ ├── _helpers.tpl
│ │ ├── deployment.yaml
│ │ └── service.yaml
│ └── values.yaml
├── cmd
│ └── app.go
├── conf
│ └── dubbogo.yaml
├── go.mod
├── go.sum
└── pkg
    └── service
        └── service.go

產生的專案包含幾個目錄

  • api:放置介面檔案:proto 檔案和產生的 pb.go 檔案

  • build:放置構建相關檔案

  • Chart:放置用於發佈的 chart 倉庫,基礎環境 chart 倉庫:nacos、mesh(開發中)

  • cmd:程式進入點

  • conf:框架配置

  • pkg/service:RPC 服務實作

  • Makefile

    • 映像檔、Helm 安裝名稱
    • IMAGE = $(your_repo)/$(namespace)/$(image_name)
      TAG = 1.0.0
      HELM_INSTALL_NAME = dubbo-go-app
      
    • 提供指令碼,例如
      • make build # 打包映像檔並推送
  • make buildx-publish # arm 架構本地打包 amd64 映像檔並推送,依賴 buildx

  • make deploy # 通過 helm 發佈應用程式

  • make remove # 刪除已發佈的 helm 應用程式

  • make proto-gen # 在 api 下產生 pb.go 檔案 -…

2.2 開發和部署 Dubbo-go 應用程式

開發應用程式

  • 編譯介面

    開發人員需要修改 proto 檔案,在此任務中可以直接使用預設介面。

    $ make proto-gen
    protoc --go_out=./api --go-triple_out=./api ./api/api.proto
    
  • 拉取依賴項

    $ go get dubbo.apache.org/dubbo-go/v3@3.0
    $ make tidy
    go mod tidy
    
  • 編寫業務邏輯

    修改 pkg/service/service.go 實現函數,並將回傳字串中顯示的版本號為 v1.0.0

    func (s *GreeterServerImpl) SayHello(ctx context.Context, in *api.HelloRequest) (*api.User, error) {
    return &api.User{Name: "Hello " + in.Name, Id: "v1.0.0"}, nil
    }
    
  • 修改以下配置欄位,使用 xds 協議作為註冊中心

    conf/dubbogo.yaml

    dubbo:
      registries:
        xds:
          protocol: xds
          address: istiod.istio-system.svc.cluster.local:15010
      protocols:
        triple:
          name: tri
          port: 20000
      provider:
        services:
          GreeterServerImpl:
            interface: "" # read from stub
    

    至此,應用程式開發完畢。

配置構建和部署參數

  • 指定要構建的映像檔

    修改 Makefile 中以下欄位,指定要構建的映像檔地址和版本號。

    指定需要通過 helm 安裝的名稱。

    IMAGE = xxx/dubbo-go-server
    TAG = 1.0.0
    HELM_INSTALL_NAME = dubbo-go-server-v1
    
  • 指定要部署的應用程式和映像檔

    修改 chart/app/Chart.yaml 中以下欄位,指定目前應用程式名稱為 dubbo-go-server,部署時會創建名稱為 dubbo-go-server 的服務,並關聯當前應用的所有版本。

    apiVersion: v1
    name: dubbo-go-server
    description: dubbo-go-server
    

    修改 chart/app/values.yaml 中以下欄位,指定要部署的映像檔,以及當前開發的應用程式版本 dubbogoAppVersion 為 v1。

    部署的映像檔需要與上面構建的映像檔一致,當前應用程式版本號用於網格流量規則控制。

    image:
      repository: xxx/dubbo-go-server
      pullPolicy: Always
      tag: "1.0.0"
    
    # Dubbo-go-mesh version control labels
    version:
      labels:
        dubbogoAppVersion: v1
    

    至此,構建參數和發布參數已指定完畢,準備構建和部署。

使用範本構建和部署 Dubbo-go 應用程式

  • 構建和推送映像檔

    $ make build(本地為 amd64 機器)

    $ make buildx-publish(本地為 arm64 機器,依賴 docker buildx 命令)

  • 將 Dubbo-go 應用程式發佈到叢集

    $ make deploy
    helm install dubbo-go-server-v1 ./chart/app
    NAME: dubbo-go-server-v1
    LAST DEPLOYED: Thu Apr 7 11:19:42 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    $ helm list
    NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    dubbo-go-server-v1 default 1 2022-04-07 11:19:42.350553 +0800 CST deployed dubbo-go-server-0.0.1 1.16.0
    

    可以看到通過 helm 部署成功

2.3 驗證應用程式

檢視資源部署情況

檢視部署的 deployment,版本為 v1。

$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
dubbo-go-server-v1 1/1 1 1 26s

檢視部署的 service。

$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dubbo-go-server ClusterIP 192.168.216.253 <none> 20000/TCP 70s

(*可選)本地調試已部署的 Dubbo-go 應用程式

使用 kubectl port-forward 將 Dubbo-go 應用程式轉發到本地

$ kubectl port-forward svc/dubbo-go-server 20000
Forwarding from 127.0.0.1:20000 -> 20000
Forwarding from [::1]:20000 -> 20000

使用 grpc_cli 調試集群中的應用程式,參考任務 [使用 grpc_cli 調試 Dubbo-go 應用程式]

$ grpc_cli ls localhost:20000 -l
filename: api/api.proto
package: api;
service Greeter {
  rpc SayHello(api.HelloRequest) returns (api.User) {}
  rpc SayHelloStream(stream api.HelloRequest) returns (stream api.User) {}
}

使用 grpc_cli 發起調用測試介面

$ grpc_cli call localhost:20000 SayHello "name: 'laurence'"
connecting to localhost:20000
name: "Hello Laurence"
id: "v1.0.0"
Received trailing metadata from server:
accept-encoding: identity, gzip
grpc-accept-encoding : identity,deflate,gzip
Rpc succeeded with OK status

至此,我們已經成功開發了一個應用程式,並將其部署在 istio 叢集中。

3. 開發客戶端 Dubbo-go 應用程式

3.1 使用 dubbogo-cli 重新創建一個專案範本

$ dubbogo-cli newApp .

3.2 開發和部署客戶端 Dubbo-go 應用程式

編寫業務邏輯

  • 修改 cmd/app.go 的 main 方法,每秒鐘向 downstream 發起一次介面調用
func main() {
client := &api. GreeterClientImpl{}
config. SetConsumerService(client)
if err := config.Load(); err != nil {
panic(err)
}
request := &api.HelloRequest{
Name: "Laurence",
}

for {
if rsp, err := client.SayHello(context.Background(), request); err != nil{
logger.Errorf("call server error = %s", err)
}else{
logger.Infof("call server response = %+v", rsp)
}
time. Sleep(time. Second)
}
}
  • 修改以下配置文件,使用 xds 協議作為註冊中心,並載入名稱為 GreeterClientImpl 的客戶端服務。

    conf/dubbogo.yaml

    dubbo:
      registries:
        xds:
          protocol: xds
          address: istiod.istio-system.svc.cluster.local:15010
      consumer:
        references:
          GreeterClientImpl:
            protocol: tri
            interface: "" # read from stub
    

    至此,應用程式開發完畢。

配置構建和部署參數

  • 指定要構建的映像檔

    修改 Makefile 中以下欄位,指定要構建的映像檔地址和版本號。

    指定需要通過 helm 安裝的名稱。

    IMAGE=xxx/dubbo-go-client
    TAG = 1.0.0
    HELM_INSTALL_NAME = dubbo-go-client
    
  • 指定要部署的應用程式和映像檔

    修改 chart/app/Chart.yaml 中以下欄位,指定目前應用程式名稱為 dubbo-go-client,部署時會創建名稱為 dubbo-go-client 的服務,並關聯當前應用的所有版本。對於純客戶端應用程式,則無需創建 sevice,開發者可在範本中修改。在本教程中,我們預設創建。

    apiVersion: v1
    name: dubbo-go-client
    description: dubbo-go-client
    

    修改 chart/app/values.yaml 中以下欄位,指定要部署的映像檔,以及當前開發的應用程式版本 dubbogoAppVersion 為 v1。

    部署的映像檔需要與上面構建的映像檔一致,當前應用程式版本號用於網格流量規則控制。

    image:
      repository: xxx/dubbo-go-client
      pullPolicy: Always
      tag: "1.0.0"
    
    # Dubbo-go-mesh version control labels
    version:
      labels:
        dubbogoAppVersion: v1
    

    至此,構建參數和發布參數已指定完畢,準備構建和部署。

使用範本構建和部署 Dubbo-go 應用程式

  • 構建和推送映像檔

    $ make build(本地為 amd64 機器)

    $ make buildx-publish(本地為 arm64 機器,依賴 docker buildx 命令)

  • 將 Dubbo-go Client 應用程式發佈到叢集

    $ make deploy
    helm install dubbo-go-client ./chart/app
    NAME: dubbo-go-client
    LAST DEPLOYED: Thu Apr 7 11:49:55 2022
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    $ helm list
    NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    dubbo-go-client default 1 2022-04-07 11:49:55.517898 +0800 CST deployed dubbo-go-client-0.0.1 1.16.0
    dubbo-go-server-v1 default 1 2022-04-07 11:23:18.397658 +0800 CST deployed dubbo-go-server-0.0.1 1.16.0
    

    可以看到通過 helm 部署成功,叢集中已有 Client 和 Server 兩個應用程式。

3.3 驗證應用程式

檢視資源部署情況

檢視部署的 client 和 server 兩個 deployment。

$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
dubbo-go-client-v1 1/1 1 1 22m
dubbo-go-server-v1 1/1 1 1 49m

檢視客戶端調用日誌

$ kubectl get pods | grep client | awk '{print $1}' | xargs kubectl logs
...
2022-04-07T04:13:55.777Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
2022-04-07T04:13:56.778Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
2022-04-07T04:13:57.779Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
2022-04-07T04:13:58.781Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
2022-04-07T04:13:59.782Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
2022-04-07T04:14:00.784Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
2022-04-07T04:14:01.785Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"

驗證調用成功

4. 總結

dubbogo-cli 提供的應用程式範本,可以方便地支持開發者進行映像檔構建、推送和部署。

在 Istio 環境中,服務器應用程序會在 Istio 上註冊自身的服務信息,客戶端監聽 xds 資源並查詢 istio 調試端口以進行接口級服務發現。開發人員無需關心服務名稱、主機名稱和集群名稱等概念,只需引入接口並發起調用即可。


上次修改時間:2023 年 1 月 2 日:增強 Dubbogo 文檔 (#1800) (71c8e722740)