受不了本地调试微服务要推远端了,写了个 Java Agent 搞定

4 月 14 日
 zhuzhiqiang

最近被微服务本地开发折腾得够呛,吐槽一下顺便分享个解决思路。

我们组十几个微服务,注册中心在远端 Nacos 。每次本地改了 service-a 的接口,想让 service-b 调到,只能推到预发环境。改一行代码验证一次,提交 → CI → 部署 → 验证,最快也要好几分钟。断点调试?想都别想。

更离谱的是多人开发同一个服务时,预发环境互相覆盖,经常对着别人的代码 debug 半天。

试过的方案:

后来想到一个思路:用 Java Agent 在 LoadBalancer 层拦截,本地有的服务走本地,没有的自动穿透到远端注册中心。对业务代码零侵入,加个 JVM 参数就行,删掉参数一切恢复原样。

折腾了一阵,写了个工具,两个 jar:

用法就一行:

-javaagent:local-discovery-agent-1.0.0.jar

本地同时启动的服务自动互相发现,没启动的自动走远端,Feign / Gateway / WebClient 都支持。

实际体验下来最爽的是:本地改完代码直接 Feign 调到,断点能打通,不用推远端了。停用某个实例也是即时生效,不受 Spring Cloud 那个 35 秒缓存的影响。

项目开源了: https://github.com/zhuzhiqiang18/local-discovery

技术上比较有意思的点是 ClassLoader 隔离问题——Agent 类和 Spring Cloud 类在不同 ClassLoader ,ByteBuddy Advice 内联后直接引用会 ClassNotFoundException ,用了个 Bridge 模式只暴露 JDK 类型来解决。有兴趣的可以看看代码。

有类似痛点的兄弟可以试试,也欢迎提 issue / PR 。

1499 次点击
所在节点    分享创造
4 条回复
iqiuyu0821
4 月 14 日
支持服务运行在 K8s 环境吗?
Edward4074
4 月 15 日
我实现的方案是全链路打通的路由染色,让运维把开发环境的 k8s 和企业内网打通,请求带上和本地服务一样的 tag ,不管微服务之间怎么跳,都能路由到本地
zhuzhiqiang
4 月 15 日
@Edward4074 也不错
zhuzhiqiang
4 月 15 日
@iqiuyu0821 你本地启动的模块能掉通 k8s 里的服务 就可以用啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1205765

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX