微服务后端开发的最大痛点之一便是调试困难,非常影响咱们的开发功率。

假如咱们想与其他微服务进行联动调试,则需求在本地环境中启动对应的微服务模块,这或许需求许多的配置和构建时刻,一同也会占用咱们本地许多资源,或许还会呈现”带不动“的状况。

尽管说咱们能够在测验服务器上进行调试,但整个流程也是比较绵长,提交代码 -> 触发CI/CD -> 等待构建成功,或许简略的 BUG 咱们提交代码打个日志就能解决问题,当遇到复杂的 BUG 时经过这个方式在服务器上调试就非常难受了,太浪费时刻了,提交 -> 等待,反反复复,一直没有本地开发东西直接调试的便利。

下面介绍的东西将长途和本地融为一体,让本地开发更加流畅。

Telepresence

Telepresence 是一个开源东西,用于在本地开发环境中模拟 Kubernetes 集群中的微服务,它答应开发人员在本地开发环境中运转和调试微服务,而不用担心环境的复杂性和配置困难。

让远程成为本地,微服务后端开发的福音

简略来说 Telepresence 将 Kubernetes 集群中服务的流量署理到本地,Telepresence 主要有四个服务:

Telepresence Daemon: 本地的守护进程,用于集群通讯和阻拦流量。

Telepresence Traffic Manager: 集群中装置的流量管理器,署理所有相关的入站和出站流量,并跟踪自动阻拦。

Telepresence Traffic Agent: 阻拦流量的 sidecar 容器,会注入到作业负载的 POD 中。

Ambassador Cloud: SaaS 服务,结合 Telepresence 一同运用,主要是生成预览 URL 和一些增值服务。

大局流量阻拦

大局流量阻拦是将 Orders 的所有流量都阻拦到咱们本地开发机上,如下图。

让远程成为本地,微服务后端开发的福音

个人流量阻拦

个人流量阻拦答应挑选性地阻拦服务的部分流量,而不会搅扰其他流量。这使咱们能够与团队中的其他人同享一个集群,而不会搅扰他们的作业。每个开发人员都能够只针对他们的请求阻拦 Orders 服务,一同同享开发环境的其他部分。

个人阻拦需求合作 Ambassador Cloud 运用,这是一项收费服务,免费用户能够最多阻拦 3 个服务。

让远程成为本地,微服务后端开发的福音

结合 Telepresence 开发调试 Rainbond 上的微服务

  • 根据主机装置 Rainbond 或根据 Helm 装置 Rainbond。

装置 Telepresence

MacOS:

# Intel
brew install datawire/blackbird/telepresence
# M1
brew install datawire/blackbird/telepresence-arm64

Windows:

# 运用管理员身份翻开 Powershell
# 下载压缩包
Invoke-WebRequest https://app.getambassador.io/download/tel2/windows/amd64/latest/telepresence.zip -OutFile telepresence.zip
# 解压缩包
Expand-Archive -Path telepresence.zip -DestinationPath telepresenceInstaller/telepresence
Remove-Item 'telepresence.zip'
cd telepresenceInstaller/telepresence
# 装置
powershell.exe -ExecutionPolicy bypass -c " . '.\install-telepresence.ps1';"

装置 Telepresence 流量管理器到集群中

能够运用 Telepresence 快速装置 Traffic Manager,本地需求有 kubeconfig 文件 ~/.kube/config

$ telepresence helm install
...
Traffic Manager installed successfully

或许在 Kubernetes 集群中运用 Helm 装置 Traffic Manager。

本地衔接长途服务

本地运用 telepresence connect 衔接长途 Kubernetes API Server,本地需求有 kubeconfig 文件 ~/.kube/config

$ telepresence connect
connected to context <your-context>

在 Rainbond 上快速布置 Pig 微服务运用

经过 Rainbond 开源运用商铺快速布置 Pig 微服务运用,布置后如下图

让远程成为本地,微服务后端开发的福音

后面会以 pig-auth 这个服务为例,演示本地开发调试的流程,这儿需求做一些小改动:

  1. 从运用商铺装置的运用默许 Workload 是字符串,需求修正 Workload 为易于查看的,这儿以 pig-auth 为例,进入组件中编辑组件名称,修正组件英文名称为 auth

  2. 简略来说 telepresence 的作业原理便是署理 k8s service,默许 gateway 到 auth 是运用的 nacos 做的负载均衡,这样的话 telepresence 是无法阻拦到流量的,咱们需求修正 gateway 配置运用 k8s service 做负载均衡。

    • 翻开 pig-register 组件的 8848 对外端口,访问 nacos,修正 pig-gateway-dev.ymlspring.cloud.gateway.routes.uri: http://gr795b69:3000gr795b69:3000 经过 pig-auth 组件内的端口访问地址获取。
  3. 假如本地只启动一个 pig-auth 服务,pig-auth 需求衔接 pig-register 和 redis,那么就需求将这俩服务的对外端口翻开,并修正配置文件让本地的 pig-auth 服务能够衔接长途到 pig-register 和 redis。

在本地调试 auth 服务

运用 IDEA 或 VScode 在本地启动 pig-auth 服务。

在本地运用 telepresence 阻拦 pig-auth 流量,指令如下:

$ telepresence intercept <workload> --port <local-port>:<service port name> -n <namespace>

指令拆解:

# <workload>
# 需求阻拦流量的服务 workload
$ kubectl get deploy -n zq
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
pig-auth       1/1     1            1           146m
# <local-port> 本地端口
# <service port name>
# 需求阻拦流量的服务的 service port name
$ kubectl get svc gr795b69 -n zq -o yaml
...
  ports:
  - name: http-3000
    port: 3000
    protocol: TCP
    targetPort: 3000
...
# <namespace> 命名空间

终究指令:

$ telepresence intercept pig-auth --port 3000:http-3000 -n zq
Using Deployment pig-auth
intercepted
   Intercept name         : pig-auth-zq
   State                  : ACTIVE
   Workload kind          : Deployment
   Destination            : 127.0.0.1:3000
   Service Port Identifier: http-3000
   Volume Mount Error     : sshfs is not installed on your local machine
   Intercepting           : all TCP requests

咱们在本地给退出登陆这块逻辑打上断点,然后经过线上的前端退出登陆,打到咱们本地 IDEA上,整体效果如下:

让远程成为本地,微服务后端开发的福音

最终

Telepresence 能够协助咱们简化本地开发流程,一同确保代码的正确性和可靠性。还能使咱们在集群中轻松调试和测验代码,提高开发功率。结合 Rainbond 的布置简化,从开发到布置都非常的简略,让咱们专心于代码编写。