本文介绍如何快速将Golang应用接入到MSE的服务治理核心能力。
前提条件
(推荐)创建ACK托管集群Serverless版、或创建ACK托管集群。
说明如果创建ACK托管集群,需满足最低配置:10C 20G,并建议单实例规格不超过2C 4C。
开放EIP暴露API Server,用于CloudShell访问。
需要具备CoreDNS,用于K8s svc服务发现。
集群本地域名请使用默认cluster.local。
- 说明
Go服务治理只支持企业版用户使用,公测期间不会收取费用。
ACK集群已经安装ack-onepilot,且集群已经开启高阶服务治理,具体操作请参考ACK微服务应用接入MSE治理中心(Golang版)。
MSE云原生网关作为ACK集群流量入口,如果不存在,可新建云原生网关。
Demo部署
Demo介绍
本Demo使用K8s服务发现,调用顺序为A->B->C,其中A、C均有灰度版本。您可以在代码仓库获取应用代码。
应用名称 | 语言及框架版本 | 调用方式 |
A | go 1.20 gin 1.8.1 | HTTP |
B | go 1.19 gin 1.8.0 | HTTP |
C | go 1.18 gin 1.9.0 | / |
部署方式一:直接使用已有镜像部署
如果您不方便打包并上传镜像,可以忽略自主编译和镜像生成环节,使用我们为您准备好的现有镜像直接部署。直接在您的ACK集群中使用下述YAML
创建deployment
即可。
apiVersion: apps/v1
kind: Deployment
metadata:
name: mse-go-demo-a-base
spec:
replicas: 1
selector:
matchLabels:
app: mse-go-demo-a
template:
metadata:
labels:
app: mse-go-demo-a
msePilotAutoEnable: "on"
mseNamespace: mse-go-demo
msePilotCreateAppName: "mse-go-demo-a"
aliyun.com/app-language: golang
spec:
containers:
- name: mse-go-demo-a
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/gin-server-a:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mse-go-demo-a-gray
spec:
replicas: 1
selector:
matchLabels:
app: mse-go-demo-a
template:
metadata:
labels:
app: mse-go-demo-a
alicloud.service.tag: gray
msePilotAutoEnable: "on"
mseNamespace: mse-go-demo
msePilotCreateAppName: "mse-go-demo-a"
aliyun.com/app-language: golang
spec:
containers:
- name: mse-go-demo-a-base
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/gin-server-a:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: mse-go-demo-a
spec:
selector:
app: mse-go-demo-a
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mse-go-demo-b
spec:
replicas: 1
selector:
matchLabels:
app: mse-go-demo-b
template:
metadata:
labels:
app: mse-go-demo-b
msePilotAutoEnable: "on"
mseNamespace: mse-go-demo
msePilotCreateAppName: "mse-go-demo-b"
aliyun.com/app-language: golang
spec:
containers:
- name: mse-go-demo-b
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/gin-server-b:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: mse-go-demo-b
spec:
selector:
app: mse-go-demo-b
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mse-go-demo-c-base
spec:
replicas: 1
selector:
matchLabels:
app: mse-go-demo-c
template:
metadata:
labels:
app: mse-go-demo-c
msePilotAutoEnable: "on"
mseNamespace: mse-go-demo
msePilotCreateAppName: "mse-go-demo-c"
aliyun.com/app-language: golang
spec:
containers:
- name: mse-go-demo-c
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/gin-server-c:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mse-go-demo-c-gray
spec:
replicas: 1
selector:
matchLabels:
app: mse-go-demo-c
template:
metadata:
labels:
app: mse-go-demo-c
alicloud.service.tag: gray
msePilotAutoEnable: "on"
mseNamespace: mse-go-demo
msePilotCreateAppName: "mse-go-demo-c"
aliyun.com/app-language: golang
spec:
containers:
- name: mse-go-demo-c
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/gin-server-c:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: mse-go-demo-c
spec:
selector:
app: mse-go-demo-c
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
如果您需要构造请求来观测流量,可以使用以下YAML
部署脚本,定时发送请求。默认情况下,脚本会直接对A发起调用,您可以通过为Pod设置环境变量MSE_GATEWAY_DOMAIN
,更改路由地址,比如,将请求发送到您的云原生网关。
apiVersion: apps/v1
kind: Deployment
metadata:
name: request-sender
spec:
replicas: 1
selector:
matchLabels:
app: request-sender
template:
metadata:
labels:
app: request-sender
spec:
containers:
- name: request-sender
image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/requestsender:1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
部署方式二:使用Go Agent自行编译并打包镜像
您可以体验使用Go Agent对Demo仓库进行编译的过程,但需要您手动打包和上传镜像。克隆Demo服务代码到本地,进入到mse-go-quickstart-demo
,然后分别进入到A、B、C目录下,执行以下步骤:
编译Go二进制文件。
使用
wget
命令下载编译工具,请根据编译环境和编译机器所在地域,选择对应的下载地址。说明各地域下载的编译工具是相同的,如果您的公网环境可以访问OSS地址,可以直接使用对应操作系统和架构的杭州公网地址获取编译工具。
操作系统
公网地址
VPC地址
Linux(AMD64)
wget "http://arms-apm-{region-id}.oss-{region-id}.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo
wget "http://arms-apm-{region-id}.oss-{region-id}-internal.aliyuncs.com/instgo/instgo-linux-amd64" -O instgo
Linux(ARM64)
wget "http://arms-apm-{region-id}.oss-{region-id}.aliyuncs.com/instgo/instgo-linux-arm64" -O instgo
wget "http://arms-apm-{region-id}.oss-{region-id}-internal.aliyuncs.com/instgo/instgo-linux-arm64" -O instgo
Darwin/macOS(ARM64)
wget "http://arms-apm-{region-id}.oss-{region-id}.aliyuncs.com/instgo/instgo-darwin-arm64" -O instgo
wget "http://arms-apm-{region-id}.oss-{region-id}-internal.aliyuncs.com/instgo/instgo-darwin-arm64" -O instgo
Darwin/macOS(AMD64)
wget "http://arms-apm-{region-id}.oss-{region-id}.aliyuncs.com/instgo/instgo-darwin-amd64" -O instgo
wget "http://arms-apm-{region-id}.oss-{region-id}-internal.aliyuncs.com/instgo/instgo-darwin-amd64" -O instgo
Windows(AMD64)
wget "http://arms-apm-{region-id}.oss-{region-id}.aliyuncs.com/instgo/instgo-windows-amd64.exe" -O instgo.exe
wget "http://arms-apm-{region-id}.oss-{region-id}-internal.aliyuncs.com/instgo/instgo-windows-amd64.exe" -O instgo.exe
上述地址,需要根据您编译环境所在的地域,将
{region-id}
替换成对应的regionID
,地域及其regionID
的映射可参见开服地域。说明目前支持的地域包括如下,其他地域会陆续支持。
中国地区:杭州、上海、北京、张家口、深圳。
国际地区:新加坡、美国(硅谷)。
对于
Linux/Darwin/macOS
环境为编译工具赋予可执行权限,Windows
环境跳过此步骤。# 赋予可执行权限 chmod +x instgo
在项目main函数所在文件的目录下执行编译工具编译Go项目,请替换命令行中的
{licenseKey}
,您可以通过访问MSE治理中心控制台首页,单击右上角查看 License Key。说明同一个UID下不同Region的License Key会有所不同,请先切换至相应的Region之后再查看。
如果您需要测试编译效果,或暂时无法获取到LicenseKey,可以添加
--dev
来开启Dev编译模式,此模式下不需要传入LicenseKey
,Dev模式下编译结果部分功能有降级,请勿用于线上。如果您原本编译命令中含有后续的编译参数,请在所有选项添加完毕后,添加--分隔符,并将编译参数按照原有格式添加在后面。
初次编译时,探针默认会被下载到/opt目录(Windows是
C:\ProgramData
),如果该目录没有权限,可以使用--cacheDir flag
指定缓存目录,或使用sudo -E
命令执行编译(Windows请使用管理员权限执行编译命令)。
Linux/Darwin
./instgo build --mse --licenseKey="{licenseKey}" -- {arg1} {arg2} ...
Windows
.\instgo.exe build --mse --licenseKey="{licenseKey}" -- {arg1} {arg2} ...
如果您希望执行交叉编译,例如在Mac操作系统中,编译Linux可执行二进制文件,注意需要在执行二进制文件指令前,声明以下Go内置的环境变量:
## Darwin/macOS操作系统下编译Linux可执行程序 #amd CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./instgo build --mse --licenseKey="{licenseKey}" #arm CGO_ENABLED=0 GOOS=linux GOARCH=arm64 ./instgo build --mse --licenseKey="{licenseKey}" ## Darwin/macOS操作系统下编译Windows可执行程序 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./instgo build --mse --licenseKey="{licenseKey}" ## Linux操作系统下编译Darwin/macOS可执行程序 #amd CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 ./instgo build --mse --licenseKey="{licenseKey}" #arm CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 ./instgo build --mse --licenseKey="{licenseKey}" ## Linux操作系统下编译Windows可执行程序 CGO_ENABLED=0 GOOS=windows GOARCH=amd64 ./instgo build --mse --licenseKey="{licenseKey}" ## Windows操作系统下编译Linux可执行程序 #amd SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 .\instgo.exe build --mse --licenseKey="{licenseKey}" #arm SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=arm64 .\instgo.exe build --mse --licenseKey="{licenseKey}" ## Windows操作系统下编译Darwin/macOS可执行程序 #amd SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=amd64 .\instgo.exe build --mse --licenseKey="{licenseKey}" #arm SET CGO_ENABLED=0 SET GOOS=darwin SET GOARCH=arm64 .\instgo.exe build --mse --licenseKey="{licenseKey}"
Instgo常见命令与释义如下:
命令
是否必传
flag
接收参数类型
含义
build(编译)
是
--mse
-
指定探针添加MSE微服务治理功能。
是(dev 模式下可不传)
--licenseKey, -l
string
指定MSE的LicenseKey。
否
--dev
-
指定编译模式为开发模式,此模式下无需指定LicenseKey即可编译,用于测试基本可用性。
重要部分功能有降级,请勿用于线上。
否
--agentVersion
string
指定探针版本。
否
--agentPath
string
指定本地探针路径。
否
--cacheDir
string
指定探针缓存目录。
否
--regionId, -r
string
指定拉取探针包依赖的OSS所在RegionId,默认为cn-hangzhou。
否
--timeout, -t
int
指定拉取探针超时时间,默认为180秒。
否
--verbose, -v
-
开启后,输出详细的编译日志。
否
--vpc
-
开启后,默认通过内网拉取探针包依赖。
update(更新)
是
--licenseKey, -l
string
指定MSE的LicenseKey。
否
--cacheDir
string
指定探针缓存目录。
否
--regionId, -r
string
指定拉取探针包依赖的OSS所在RegionId,默认为cn-hangzhou。
否
--timeout, -t
int
指定拉取探针超时时间,默认为180秒。
否
--vpc
开启后,默认通过内网拉取探针包依赖。
clean(清理产物)
-
-
-
手动清理编译残留,恢复探针对代码的修改。
version(输出版本号)
-
-
-
-
创建
Dockerfile
,将镜像修改为您的服务器镜像地址。A
FROM {您的服务器操作系统镜像地址} WORKDIR / COPY mse-go-demo-a /mse-go-demo-a ENTRYPOINT ["/mse-go-demo-a"]
B
FROM {您的服务器操作系统镜像地址} WORKDIR / COPY mse-go-demo-b /mse-go-demo-b ENTRYPOINT ["/mse-go-demo-b"]
C
FROM {您的服务器操作系统镜像地址} WORKDIR / COPY mse-go-demo-c /mse-go-demo-c ENTRYPOINT ["/mse-go-demo-c"]
创建镜像并推送到您的镜像仓库中。
A
docker build -t mse-go-demo-a:1.0 . docker tag mse-go-demo-a:1.0 {您的镜像仓库地址}/mse-go-demo-a:1.0 docker push {您的镜像仓库地址}/mse-go-demo-a:1.0
B
docker build -t mse-go-demo-b:1.0 . docker tag mse-go-demo-b:1.0 {您的镜像仓库地址}/mse-go-demo-b:1.0 docker push {您的镜像仓库地址}/mse-go-demo-b:1.0
C
docker build -t mse-go-demo-c:1.0 . docker tag mse-go-demo-c:1.0 {您的镜像仓库地址}/mse-go-demo-c:1.0 docker push {您的镜像仓库地址}/mse-go-demo-c:1.0
在集群详情页面的左侧导航栏单击工作负载 > 无状态,选择待部署的命名空间,点击右上角使用
YAML
创建资源,将下述YAML
粘贴到模板中。说明需要将
spec.template.spec.containers.image
中的镜像地址替换为您在步骤3中推送的镜像地址。A
apiVersion: apps/v1 kind: Deployment metadata: name: mse-go-demo-a-base spec: replicas: 1 selector: matchLabels: app: mse-go-demo-a template: metadata: labels: app: mse-go-demo-a msePilotAutoEnable: "on" mseNamespace: mse-go-demo msePilotCreateAppName: "mse-go-demo-a" aliyun.com/app-language: golang spec: containers: - name: mse-go-demo-a image: {您的镜像仓库地址} imagePullPolicy: Always ports: - containerPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: mse-go-demo-a-gray spec: replicas: 1 selector: matchLabels: app: mse-go-demo-a template: metadata: labels: app: mse-go-demo-a alicloud.service.tag: gray msePilotAutoEnable: "on" mseNamespace: mse-go-demo msePilotCreateAppName: "mse-go-demo-a" aliyun.com/app-language: golang spec: containers: - name: mse-go-demo-a-base image: {您的镜像仓库地址} imagePullPolicy: Always ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: mse-go-demo-a spec: selector: app: mse-go-demo-a ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancer
B
apiVersion: apps/v1 kind: Deployment metadata: name: mse-go-demo-b spec: replicas: 1 selector: matchLabels: app: mse-go-demo-b template: metadata: labels: app: mse-go-demo-b msePilotAutoEnable: "on" mseNamespace: mse-go-demo msePilotCreateAppName: "mse-go-demo-b" aliyun.com/app-language: golang spec: containers: - name: mse-go-demo-b image: {您的镜像仓库地址} imagePullPolicy: Always ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: mse-go-demo-b spec: selector: app: mse-go-demo-b ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP
C
apiVersion: apps/v1 kind: Deployment metadata: name: mse-go-demo-c-base spec: replicas: 1 selector: matchLabels: app: mse-go-demo-c template: metadata: labels: app: mse-go-demo-c msePilotAutoEnable: "on" mseNamespace: mse-go-demo msePilotCreateAppName: "mse-go-demo-c" aliyun.com/app-language: golang spec: containers: - name: mse-go-demo-c image: {您的镜像仓库地址} imagePullPolicy: Always ports: - containerPort: 8080 --- apiVersion: apps/v1 kind: Deployment metadata: name: mse-go-demo-c-gray spec: replicas: 1 selector: matchLabels: app: mse-go-demo-c template: metadata: labels: app: mse-go-demo-c alicloud.service.tag: gray msePilotAutoEnable: "on" mseNamespace: mse-go-demo msePilotCreateAppName: "mse-go-demo-c" aliyun.com/app-language: golang spec: containers: - name: mse-go-demo-c-base image: {您的镜像仓库地址} imagePullPolicy: Always ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: mse-go-demo-c spec: selector: app: mse-go-demo-c ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP
如果您需要构造请求来观测流量,可以使用以下
YAML
部署脚本,定时发送请求。默认情况下,脚本会直接对A发起调用,您可以通过为Pod设置环境变量MSE_GATEWAY_DOMAIN
,更改路由地址,比如,将请求发送到您的云原生网关。apiVersion: apps/v1 kind: Deployment metadata: name: request-sender spec: replicas: 1 selector: matchLabels: app: request-sender template: metadata: labels: app: request-sender spec: containers: - name: request-sender image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/requestsender:1.0 imagePullPolicy: Always ports: - containerPort: 8080
基础功能验证
在体验流控规则和全链路灰度之前,请确保您已经按照ACK微服务应用接入MSE治理中心(Golang版)正确安装了ack-onepilot 3.2.3及以上版本,并且开启了高阶服务治理。
服务查询
登录MSE治理中心控制台,在左侧栏选择治理中心>服务查询,微服务命名空间切换至mse-go-demo,框架选择Gin。
可以从列表中看到3个服务mse-go-demo-a、mse-go-demo-b、mse-go-demo-c,说明demo已经成功接入微服务治理。
流控规则
创建网关路由
登录MSE云原生网关控制台,在左侧导航栏选择云原生网关>网关列表,单击与您ACK集群在同VPC下的网关实例。
在网关详情页的左侧导航栏,单击路由管理 > 来源 > 创建来源,来源类型选择容器服务,在ACK/ASK/ACS 集群中选择您的ACK集群,单击确定。
在路由管理 > 服务 > 创建服务,服务来源选择容器服务,命名空间选择您demo部署的命名空间,服务列表选择mse-go-demo-a,单击确定。
单击路由管理 > 路由 > 创建路由,填写参数如下,配置完成后单击下方保存并发布。
路由名称:任意
域名:*
路径(Path):等于,/greet1a
路由指向:单服务
后端服务
服务名称:mse-go-demo-a
服务协议:HTTP
服务端口:80
超时时间(秒):默认60s即可
如果您在Demo中创建了request-sender,您可以修改对应Pod的环境变量MSE_GATEWAY_DOMAIN,将环境变量的值设置为云原生网关的地址,这样请求脚本将会从默认访问应用A,变更为直接访问您的云原生网关。
规则配置
登录MSE治理中心控制台,在左侧导航栏选择治理中心 > 应用治理,将命名空间切换为mse-go-demo。
单击mse-go-demo-a应用卡片,进入应用概览后,在左侧导航栏单击流量治理 > 流量防护 > 接口流控。
单击新增流控规则,按以下内容进行配置后,单击新增。
选择防护场景
接口类型:WEB服务
流量类型:服务端
接口名称:/greet1a
防护类型:流控
配置防护规则
是否开启:是
单击QPS阈值:0(阈值设置为0时存在风险,本配置仅用于效果演示,请谨慎用于线上)
流控效果:快速失败
配置防护行为:关联行为选择默认行为
请求验证
登录MSE云原生网关控制台,在左侧导航栏选择云原生网关 > 网关列表,单击与您ACK集群在同VPC下的网关实例。
在网关详情页的左侧导航栏单击路由管理 > 路由,选择您第一步配置的路由,在操作处单击调试。
单击发送,从右侧返回状态码中,可以看到状态码为429,说明流控规则生效。
规则关闭
登录MSE治理中心控制台,在左侧导航栏选择治理中心 > 应用治理,将命名空间切换为mse-go-demo。
单击mse-go-demo-a应用卡片,进入应用概览后,在左侧导航栏单击流量治理 > 流量防护 > 接口流控。
单击所配置规则状态按钮,将按钮置灰色,关闭流控规则。
参考上述步骤通过云原生网关发起请求,可以看到请求成功,说明流控规则已经关闭。
全链路灰度
创建泳道组
登录MSE治理中心控制台,在左侧导航栏选择治理中心 > 全链路灰度。
单击创建泳道组及泳道。如果您选择的微服务空间内已经创建过泳道组,则单击+创建泳道组。
在创建泳道组页面,设置如下相关配置,然后单击确定。
泳道组名称:任意
入口类型:MSE云原生网关
入口网关:选择您创建网关路由时对应的网关
泳道组涉及应用:mse-go-demo-a、mse-go-demo-b、mse-go-demo-c
创建泳道
在全链路灰度页面底部,单击点击创建第一个分流泳道。如果您选择的微服务空间内已经创建过泳道,则单击创建泳道。
在创建泳道面板,填写以下信息后,单击确定。
操作步骤:容器服务环境
泳道名称:gray
泳道标签:gray
选择路由:选择您在云原生网关为Go应用创建的路由
灰度模式:按内容灰度
灰度条件:
参数类型:Header
参数:x-mse-gray-test
条件:==
值:1
请求验证
登录MSE云原生网关控制台,在左侧导航栏选择云原生网关 > 网关列表,单击与您ACK集群在同VPC下的网关实例。
在网关详情页的左侧导航栏单击路由管理 > 路由,选择您第一步配置的路由,在操作处单击调试。
单击发送,从返回body中,可以看到该请求均通过了base节点。
在Header处单击添加参数,KEY为x-mse-gray-test,VALUE为1,继续单击发送,从返回Body中,可以看到A和C均通过了gray节点。