微服务调试(必读)

来源:https://cloud.iocoder.cn/cloud-debug/

1. 多环境 env 组件

在微服务架构下,多服务的调试是个非常大的痛点:在大家使用 同一个 注册中心时,如果多个人在本地启动 相同 服务,可能需要调试的一个请求会打到其他开发的本地服务,实际是期望达到自己本地的服务。

一般的解决方案是,使用 不同 注册中心,避免出现这个情况。但是,服务一多之后,就会产生新的痛点,同时本地启动所有服务很占用电脑内存。

因此,我们实现了 yudao-spring-boot-starter-env 组件,通过 Tag 给服务打标,实现在使用 同一个 注册中心的情况下,本地只需要启动需要调试的服务,并且保证自己的请求,必须达到自己本地的服务。如下图所示:

整体流程

2. 功能演示

在本地模拟,启动三个进程,如下图所示:

注意!!!

hostname 是你的主机名:

第一步,启动 gateway 服务

直接运行 GatewayServerApplication 类,启动 gateway 服务。此时,我们可以在 Nacos 看到该实例,它是没 tag 属性。如下图所示:

gateway 服务

第二步,启动 system 服务【有 tag】

运行 SystemServerApplication 类,启动 system 服务。此时,我们可以在 Nacos 看到该实例,它是有 tag 属性。如下图所示:

system 服务

因为我们默认在 application-local.yaml 配置文件里,添加了 yudao.env.tag 配置项为 ${HOSTNAME}。如下图所示:

 配置项

第三步,启动 system 服务 【无 tag】

① 修改 system 服务的端口为 28081,yudao.env.tag 配置项为空。如下图所示:

图片纠错:最新版本将 yudao-module-trade-biz 子模块,重命名为 yudao-module-system-server 子模块,更好表达它是一个服务

修改 system 服务的配置

② 再一个 SystemServerApplication,额外启动 system 服务。此时,我们可以在 Nacos 看到该实例,它是没 tag 属性。如下图所示:

system 服务

第四步,请求测试

① 打开 AuthController.http 文件,设置第一个请求的 tagYunai.local(要替换成你的 hostname),如下图所示:

AuthController 请求

② 点击前面的绿色小箭头,发起请求。从 IDEA 控制台的日志可以看到,只有有 tag 的 system 服务才会被调用。

你可以多点几次,依然是这样的情况噢!

3. 实现原理

① 在服务注册时,会将 yudao.env.tag 配置项,写到 Nacos 服务实例的元数据,通过 EnvEnvironmentPostProcessor 类实现。

② 在服务调用时,通过 EnvLoadBalancerClient 类,筛选服务实例,通过服务实例的 tag 元数据,匹配请求的 tag 请求头。

③ 在网关转发时,通过 GrayLoadBalancer 类,效果和 EnvLoadBalancerClient 一致。

4. 未来的拓展

除了微服务调试比较麻烦外,MQ 消息队列的消费调试也是个麻烦的事儿,未来也会进行支持。实现的效果如下: