V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
zhuzhiqiang
V2EX  ›  分享创造

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

  •  
  •   zhuzhiqiang ·
    zhuzhiqiang18 · 4 小时 54 分钟前 · 179 次点击

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

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

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

    试过的方案:

    • 手动改 Nacos 地址指向 localhost → 忘恢复就炸,而且只能调一个服务
    • 加 Profile 区分环境 → 配置侵入,每个项目都要改
    • docker-compose 全家桶 → 机器扛不住,而且和 IDEA 断点调试不搭

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

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

    • 一个本地注册中心( Netty 实现,带 Web 面板)
    • 一个 Java Agent ( ByteBuddy 字节码增强)

    用法就一行:

    -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 。

    目前尚无回复
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3623 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:48 · PVG 18:48 · LAX 03:48 · JFK 06:48
    ♥ Do have faith in what you're doing.