15分钟完成服务治理能力快速体验(Golang版)

本文介绍如何快速将Golang应用接入到MSE的服务治理核心能力。

前提条件

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

/

image

部署方式一:直接使用已有镜像部署

如果您不方便打包并上传镜像,可以忽略自主编译和镜像生成环节,使用我们为您准备好的现有镜像直接部署。直接在您的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目录下,执行以下步骤:

  1. 编译Go二进制文件。

    1. 使用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的映射可参见开服地域

      说明

      目前支持的地域包括如下,其他地域会陆续支持。

      • 中国地区:杭州、上海、北京、张家口、深圳。

      • 国际地区:新加坡、美国(硅谷)。

    2. 对于Linux/Darwin/macOS环境为编译工具赋予可执行权限,Windows环境跳过此步骤。

      # 赋予可执行权限
      chmod +x instgo
    3. 在项目main函数所在文件的目录下执行编译工具编译Go项目,请替换命令行中的{licenseKey},您可以通过访问MSE治理中心控制台首页,单击右上角查看 License Key

      说明
      1. 同一个UID下不同Region的License Key会有所不同,请先切换至相应的Region之后再查看。

      2. 如果您需要测试编译效果,或暂时无法获取到LicenseKey,可以添加--dev来开启Dev编译模式,此模式下不需要传入LicenseKeyDev模式下编译结果部分功能有降级,请勿用于线上

      3. 如果您原本编译命令中含有后续的编译参数,请在所有选项添加完毕后,添加--分隔符,并将编译参数按照原有格式添加在后面。

      4. 初次编译时,探针默认会被下载到/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(输出版本号)

      -

      -

      -

      -

  2. 创建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"]
  3. 创建镜像并推送到您的镜像仓库中。

    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
  4. 在集群详情页面的左侧导航栏单击工作负载 > 无状态,选择待部署的命名空间,点击右上角使用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及以上版本,并且开启了高阶服务治理。

服务查询

  1. 登录MSE治理中心控制台,在左侧栏选择治理中心>服务查询微服务命名空间切换至mse-go-demo框架选择Gin。

  2. 可以从列表中看到3个服务mse-go-demo-a、mse-go-demo-b、mse-go-demo-c,说明demo已经成功接入微服务治理。

流控规则

创建网关路由

  1. 登录MSE云原生网关控制台,在左侧导航栏选择云原生网关>网关列表,单击与您ACK集群在同VPC下的网关实例。

  2. 在网关详情页的左侧导航栏,单击路由管理 > 来源 > 创建来源来源类型选择容器服务,在ACK/ASK/ACS 集群中选择您的ACK集群,单击确定

  3. 路由管理 > 服务 > 创建服务服务来源选择容器服务命名空间选择您demo部署的命名空间,服务列表选择mse-go-demo-a,单击确定

  4. 单击路由管理 > 路由 > 创建路由,填写参数如下,配置完成后单击下方保存并发布

    1. 路由名称:任意

    2. 域名:*

    3. 路径(Path):等于,/greet1a

    4. 路由指向:单服务

    5. 后端服务

      1. 服务名称:mse-go-demo-a

      2. 服务协议:HTTP

      3. 服务端口:80

    6. 超时时间(秒):默认60s即可

说明

如果您在Demo中创建了request-sender,您可以修改对应Pod的环境变量MSE_GATEWAY_DOMAIN,将环境变量的值设置为云原生网关的地址,这样请求脚本将会从默认访问应用A,变更为直接访问您的云原生网关。

规则配置

  1. 登录MSE治理中心控制台,在左侧导航栏选择治理中心 > 应用治理将命名空间切换为mse-go-demo。

  2. 单击mse-go-demo-a应用卡片,进入应用概览后,在左侧导航栏单击流量治理 > 流量防护 > 接口流控

  3. 单击新增流控规则,按以下内容进行配置后,单击新增。

    1. 选择防护场景

      1. 接口类型:WEB服务

      2. 流量类型:服务端

      3. 接口名称:/greet1a

      4. 防护类型:流控

    2. 配置防护规则

      1. 是否开启:是

      2. 单击QPS阈值:0(阈值设置为0时存在风险,本配置仅用于效果演示,请谨慎用于线上)

      3. 流控效果:快速失败

    3. 配置防护行为:关联行为选择默认行为

请求验证

  1. 登录MSE云原生网关控制台,在左侧导航栏选择云原生网关 > 网关列表,单击与您ACK集群在同VPC下的网关实例。

  2. 在网关详情页的左侧导航栏单击路由管理 > 路由,选择您第一步配置的路由,在操作处单击调试

  3. 单击发送,从右侧返回状态码中,可以看到状态码为429,说明流控规则生效。

规则关闭

  1. 登录MSE治理中心控制台,在左侧导航栏选择治理中心 > 应用治理将命名空间切换为mse-go-demo。

  2. 单击mse-go-demo-a应用卡片,进入应用概览后,在左侧导航栏单击流量治理 > 流量防护 > 接口流控

  3. 单击所配置规则状态按钮,将按钮置灰色,关闭流控规则。

  4. 参考上述步骤通过云原生网关发起请求,可以看到请求成功,说明流控规则已经关闭。

全链路灰度

创建泳道组

  1. 登录MSE治理中心控制台,在左侧导航栏选择治理中心 > 全链路灰度

  2. 单击创建泳道组及泳道。如果您选择的微服务空间内已经创建过泳道组,则单击+创建泳道组

  3. 创建泳道组页面,设置如下相关配置,然后单击确定

    1. 泳道组名称:任意

    2. 入口类型:MSE云原生网关

    3. 入口网关:选择您创建网关路由时对应的网关

    4. 泳道组涉及应用:mse-go-demo-a、mse-go-demo-b、mse-go-demo-c

创建泳道

  1. 在全链路灰度页面底部,单击点击创建第一个分流泳道如果您选择的微服务空间内已经创建过泳道,则单击创建泳道

  2. 创建泳道面板,填写以下信息后,单击确定

    1. 操作步骤:容器服务环境

    2. 泳道名称:gray

    3. 泳道标签:gray

    4. 选择路由:选择您在云原生网关为Go应用创建的路由

    5. 灰度模式:按内容灰度

    6. 灰度条件

      1. 参数类型:Header

      2. 参数:x-mse-gray-test

      3. 条件:==

      4. :1

请求验证

  1. 登录MSE云原生网关控制台,在左侧导航栏选择云原生网关 > 网关列表,单击与您ACK集群在同VPC下的网关实例。

  2. 在网关详情页的左侧导航栏单击路由管理 > 路由,选择您第一步配置的路由,在操作处单击调试

  3. 单击发送,从返回body中,可以看到该请求均通过了base节点。

  4. Header处单击添加参数KEY为x-mse-gray-test,VALUE为1,继续单击发送从返回Body中,可以看到A和C均通过了gray节点。