Istio 环境部署 Dubbo-go 应用

在本章节中,我们将使用应用模板快速创建一组 Dubbo-go Server和 Client 端应用,部署在 Istio 集群中;观察、调试和验证服务发现和调用成功。

1. 准备工作

  • dubbo-go cli 工具和依赖工具已安装、grpc_cli (如需本地调试)。
  • docker、helm、kubectl 环境已安装。(arm 机器需支持 docker buildx)
  • 任务【istio 环境部署】 已完成

2. 开发 server 端 Dubbo-go 应用

2.1 使用 dubbogo-cli 创建项目模板

  1. $ mkdir mesh-app-server
  2. $ cd mesh-app-server
  3. $ dubbogo-cli newApp .
  4. $ tree .
  5. .
  6. ├── Makefile
  7. ├── api
  8. └── api.proto
  9. ├── build
  10. └── Dockerfile
  11. ├── chart
  12. ├── app
  13. ├── Chart.yaml
  14. ├── templates
  15. ├── _helpers.tpl
  16. ├── deployment.yaml
  17. ├── service.yaml
  18. └── serviceaccount.yaml
  19. └── values.yaml
  20. └── nacos_env
  21. ├── Chart.yaml
  22. ├── templates
  23. ├── _helpers.tpl
  24. ├── deployment.yaml
  25. └── service.yaml
  26. └── values.yaml
  27. ├── cmd
  28. └── app.go
  29. ├── conf
  30. └── dubbogo.yaml
  31. ├── go.mod
  32. ├── go.sum
  33. └── pkg
  34. └── service
  35. └── service.go

生成项目包括几个目录:

  • api:放置接口文件:proto文件和生成的pb.go文件

  • build:放置构建相关文件

  • chart:放置发布用 chart 仓库、基础环境chart 仓库:nacos、mesh(开发中)

  • cmd:程序入口

  • conf:框架配置

  • pkg/service:RPC 服务实现

  • Makefile:

    • 镜像、Helm 安装名称:
      1. IMAGE = $(your_repo)/$(namespace)/$(image_name)
      2. TAG = 1.0.0
      3. 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 文件,本任务中直接使用默认接口即可。

    1. $ make proto-gen
    2. protoc --go_out=./api --go-triple_out=./api ./api/api.proto
  • 拉取依赖

    1. $ go get dubbo.apache.org/dubbo-go/v3@3.0
    2. $ make tidy
    3. go mod tidy
  • 编写业务逻辑

    修改 pkg/service/service.go 实现函数, 返回字符串中显示版本为 v1.0.0

    1. func (s *GreeterServerImpl) SayHello(ctx context.Context, in *api.HelloRequest) (*api.User, error) {
    2. return &api.User{Name: "Hello " + in.Name, Id: "v1.0.0"}, nil
    3. }
  • 修改配置如下字段,从而使用xds协议作为注册中心

    conf/dubbogo.yaml

    1. dubbo:
    2. registries:
    3. xds:
    4. protocol: xds
    5. address: istiod.istio-system.svc.cluster.local:15010
    6. protocols:
    7. triple:
    8. name: tri
    9. port: 20000
    10. provider:
    11. services:
    12. GreeterServerImpl:
    13. interface: "" # read from stub

    至此,应用开发完成。

配置构建和部署参数

  • 指定需要构建的镜像:

    修改 Makefile 如下字段,指定好需要构建的镜像地址和版本。

    指定好需要通过 helm 安装的名称。

    1. IMAGE = xxx/dubbo-go-server
    2. TAG = 1.0.0
    3. HELM_INSTALL_NAME = dubbo-go-server-v1
  • 指定需要部署的应用和镜像:

    修改 chart/app/Chart.yaml 如下字段,指定当前应用名为 dubbo-go-server,部署时会创建一个名为 dubbo-go-server 的 service ,关联当前应用的所有版本。

    1. apiVersion: v1
    2. name: dubbo-go-server
    3. description: dubbo-go-server

    修改 chart/app/values.yaml 如下字段,指定需要部署的镜像以及当前开发的应用版本 dubbogoAppVersion 为 v1。

    部署的镜像需要和上述构建的镜像一致。当前应用版本用于 mesh 流量规则控制。

    1. image:
    2. repository: xxx/dubbo-go-server
    3. pullPolicy: Always
    4. tag: "1.0.0"
    5. # Dubbo-go-mesh version control labels
    6. version:
    7. labels:
    8. dubbogoAppVersion: v1

    至此,构建参数和发布参数都已指定好,可以进行构建和部署了。

使用模板构建和部署 Dubbo-go 应用

  • 构建、推送镜像

    $ make build (本地为 amd64机器)

    或者

    $ make buildx-publish (本地为 arm64机器,依赖 docker buildx 命令)

  • 发布 Dubbo-go 应用至集群

    1. $ make deploy
    2. helm install dubbo-go-server-v1 ./chart/app
    3. NAME: dubbo-go-server-v1
    4. LAST DEPLOYED: Thu Apr 7 11:19:42 2022
    5. NAMESPACE: default
    6. STATUS: deployed
    7. REVISION: 1
    8. TEST SUITE: None
    9. $ helm list
    10. NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    11. 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。

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

查看部署好的 service。

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

(*可选)本地调试部署好的 Dubbo-go 应用

使用 kubectl port-forward Dubbo-go 应用到本地

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

使用 grpc_cli 调试集群内的应用,参考任务【使用 grpc_cli 调试 Dubbo-go 应用】

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

使用 grpc_cli 发起调用,测试接口

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

至此,我们成功开发了一个应用,把它部署在了 istio 集群内。

3. 开发 Client 端 Dubbo-go 应用

3.1 使用 dubbogo-cli 创建另一个项目模板

  1. $ dubbogo-cli newApp .

3.2 开发和部署客户端 Dubbo-go 应用:

编写业务逻辑

  • 修改 cmd/app.go 的 main 方法,针对下游接口每秒钟发起一次调用
  1. func main() {
  2. client := &api.GreeterClientImpl{}
  3. config.SetConsumerService(client)
  4. if err := config.Load(); err != nil {
  5. panic(err)
  6. }
  7. request := &api.HelloRequest{
  8. Name: "laurence",
  9. }
  10. for{
  11. if rsp, err := client.SayHello(context.Background(), request); err != nil{
  12. logger.Errorf("call server error = %s", err)
  13. }else{
  14. logger.Infof("call server response = %+v", rsp)
  15. }
  16. time.Sleep(time.Second)
  17. }
  18. }
  • 修改如下配置文件,使用xds协议作为注册中心,加载名为 GreeterClientImpl 的客户端服务。

    conf/dubbogo.yaml

    1. dubbo:
    2. registries:
    3. xds:
    4. protocol: xds
    5. address: istiod.istio-system.svc.cluster.local:15010
    6. consumer:
    7. references:
    8. GreeterClientImpl:
    9. protocol: tri
    10. interface: "" # read from stub

    至此,应用开发完成。

配置构建和部署参数

  • 指定需要构建的镜像:

    修改 Makefile 如下字段,指定好需要构建的镜像地址和版本。

    指定好需要通过 helm 安装的名称。

    1. IMAGE = xxx/dubbo-go-client
    2. TAG = 1.0.0
    3. HELM_INSTALL_NAME = dubbo-go-client
  • 指定需要部署的应用和镜像:

    修改 chart/app/Chart.yaml 如下字段,指定当前应用名为 dubbo-go-client,部署时会创建一个名为 dubbo-go-client 的 service ,关联当前应用的所有版本。对于一个只有客户端的应用,可以不创建sevice,可以由开发者在模板中修改,本教程中我们默认创建。

    1. apiVersion: v1
    2. name: dubbo-go-client
    3. description: dubbo-go-client

    修改 chart/app/values.yaml 如下字段,指定需要部署的镜像以及当前开发的应用版本 dubbogoAppVersion 为 v1。

    部署的镜像需要和上述构建的镜像一致。当前应用版本用于 mesh 流量规则控制。

    1. image:
    2. repository: xxx/dubbo-go-client
    3. pullPolicy: Always
    4. tag: "1.0.0"
    5. # Dubbo-go-mesh version control labels
    6. version:
    7. labels:
    8. dubbogoAppVersion: v1

    至此,构建参数和发布参数都已指定好,可以进行构建和部署了。

使用模板构建和部署 Dubbo-go 应用

  • 构建、推送镜像

    $ make build (本地为 amd64机器)

    或者

    $ make buildx-publish (本地为 arm64机器,依赖 docker buildx 命令)

  • 发布 Dubbo-go Client 应用至集群

    1. $ make deploy
    2. helm install dubbo-go-client ./chart/app
    3. NAME: dubbo-go-client
    4. LAST DEPLOYED: Thu Apr 7 11:49:55 2022
    5. NAMESPACE: default
    6. STATUS: deployed
    7. REVISION: 1
    8. TEST SUITE: None
    9. $ helm list
    10. NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
    11. dubbo-go-client default 1 2022-04-07 11:49:55.517898 +0800 CST deployed dubbo-go-client-0.0.1 1.16.0
    12. 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。

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

查看客户端调用日志

  1. $ kubectl get pods | grep client | awk '{print $1}' | xargs kubectl logs
  2. ...
  3. 2022-04-07T04:13:55.777Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
  4. 2022-04-07T04:13:56.778Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
  5. 2022-04-07T04:13:57.779Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
  6. 2022-04-07T04:13:58.781Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
  7. 2022-04-07T04:13:59.782Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
  8. 2022-04-07T04:14:00.784Z INFO cmd/app.go:29 call server response = name:"Hello laurence" id:"v1.0.0"
  9. 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 环境中,server 应用将自身服务信息注册在 Isito 上,由客户端监听 xds 资源,查询 istio debug 端口进行接口级别的服务发现。开发人员无需关心 service名、主机名、集群名等概念,只需要引入接口,发起调用即可。

最后修改 December 16, 2022: Fix check (#1736) (97972c1)