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 创建项目模板
$ 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 的 service ,关联当前应用的所有版本。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 验证应用
查看资源部署情况
查看部署好的 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. 开发 Client 端 Dubbo-go 应用
3.1 使用 dubbogo-cli 创建另一个项目模板
$ dubbogo-cli newApp .
3.2 开发和部署客户端 Dubbo-go 应用:
编写业务逻辑
- 修改 cmd/app.go 的 main 方法,针对下游接口每秒钟发起一次调用
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 的 service ,关联当前应用的所有版本。对于一个只有客户端的应用,可以不创建sevice,可以由开发者在模板中修改,本教程中我们默认创建。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 验证应用
查看资源部署情况
查看部署好的 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 环境中,server 应用将自身服务信息注册在 Isito 上,由客户端监听 xds 资源,查询 istio debug 端口进行接口级别的服务发现。开发人员无需关心 service名、主机名、集群名等概念,只需要引入接口,发起调用即可。
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.