在 Istio 环境中部署 Dubbo-go 应用
在本章中,我们将使用应用模板快速创建一套 Dubbo-go Server 和 Client 应用,并将它们部署在 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。
部署的镜像需要与上面构建的镜像一致。当前应用版本用于 mesh 流量规则控制。
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 验证应用
查看资源部署
查看已部署的部署,版本为 v1。
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
dubbo-go-server-v1 1/1 1 1 26s
查看已部署的服务。
$ 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 的服务,并与当前应用的所有版本相关联。对于仅客户端的应用,不需要创建服务,开发者可以在模板中修改它。在本教程中,我们默认创建它。apiVersion: v1 name: dubbo-go-client description: dubbo-go-client
修改 chart/app/values.yaml 中的以下字段,指定要部署的镜像和当前开发的应用版本 dubbogoAppVersion 为 v1。
部署的镜像需要与上面构建的镜像一致。当前应用版本用于 mesh 流量规则控制。
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 验证应用
查看资源部署
查看已部署的客户端和服务器两个部署。
$ 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 debug 端口以进行接口级别的服务发现。开发者无需关心服务名称、主机名和集群名称等概念,只需引入接口并发起调用即可。