cking
V2EX  ›  Java

微服务分布式对接口调用,你们是怎么追踪链路的?

  •  
  •   cking · Dec 28, 2020 · 6391 views
    This topic created in 2138 days ago, the information mentioned may be changed or developed.

    示例服务器:
    A-business-service: A 业务系统实现服务(业务实现方法)
    A-base-service: A 基层系统实现服务(链接 Mysql)
    B-business-service: B 业务系统实现服务(业务实现方法)
    B-base-service: B 基层系统实现服务(链接 Mysql)
    A 可以调用 A/B 的基础 但是 A 不能调用 B 业务层
    .....
    现在的是这样的 有一串代码
    public void example(){
    .....
    aBusiness.aBase();
    aBsuiness.bBase();
    .....
    }
    然后在 A 调用 B 基础的时候报错了 看日志 是 B-base 报错的 然后但是我们不知道是 A-business 的调用还是 B-business 的调用...

    现在的有一个想法就是用一个服务固定的 source 字段去标记 然后传递到基础服务的接口中...(管理觉得加入分布式链路追踪太麻烦了) 我的想法是用 ZipKin 之类的开源框架

    V 友们也可以推荐一下好用的框架或者 Idea. Thx

    39 replies  •  2020-12-29 17:23:50 +08:00
    wolfie
    wolfie
    Dec 28, 2020
    1
    demobin
    demobin
    Dec 28, 2020
    2
    request.getRemoteAddr()
    cking
    cking
    OP
    Dec 28, 2020
    3
    @demobin 用过了 但是我们的服务 有时候两三个服务在一个机子上面....
    monkeyWie
    monkeyWie
    Dec 28, 2020 via Android
    4
    skywalking esapm 可以看看
    unixeno
    unixeno
    Dec 28, 2020 via Android
    5
    第一个发起者生成一个 logid,后面的 rpc 一路传下去
    limuyan44
    limuyan44
    Dec 28, 2020 via Android
    6
    我几年前搞这个当时只有个 dubbo,啥配套的都没上,最简单的就是链路加个 id 就完事了,java 来搞改改 rpc 框架和日志模板用不了几行代码,还不影响现有的代码,查日志看 id 就行了。
    joesonw
    joesonw
    Dec 28, 2020
    7
    java 全家桶的话就 skywalking 嘛. 不然就 opentracing 那一套, 存储可以用 jaeger.
    cking
    cking
    OP
    Dec 28, 2020
    8
    @monkeyWie
    @unixeno
    @joesonw
    感谢大家回复 公司给时间慢慢看 嘿嘿 摸鱼+1
    vindurriel
    vindurriel
    Dec 28, 2020 via iPhone
    9
    复议 5 楼 debug 的话透传 request id 就行 用不着实施链路追踪系统
    imycc
    imycc
    Dec 28, 2020
    11
    在 nginx 或者网关入口生成一个 traceid (如果有就不生成),改造一下业务的日志模块,打印这个 ID 。日志传到 es,剩下就自行发挥
    InkAndBanner
    InkAndBanner
    Dec 28, 2020
    12
    zipkin
    gmywq0392
    gmywq0392
    Dec 28, 2020
    13
    谷歌有论文。
    xuanbg
    xuanbg
    Dec 28, 2020
    14
    网关拦截验证鉴权的同时生成一个 requestId,放在请求头一路传到底。然后 kibana 就能根据这个 requestId 找出一串日志来。
    clf
    clf
    Dec 28, 2020
    15
    网关生成一个 ID,然后日志里全会附带这个 ID,调用链就都出来了。
    qfdk
    qfdk
    PRO
    Dec 28, 2020 via iPhone
    16
    apm 吧 这个简单
    qfdk
    qfdk
    PRO
    Dec 28, 2020 via iPhone
    17
    @imycc 都有 es 了 用他家 apm 就好了, 挂个 agent 起来 给每条数据都有个 transactionId 还有个 traceId. 这样需要某些特定 log 的 改下 file beat 穿出去就好了
    csl1995
    csl1995
    Dec 28, 2020
    18
    requestid
    Yoock
    Yoock
    Dec 28, 2020
    19
    jaeger?
    cking
    cking
    OP
    Dec 28, 2020
    20
    @xuanbg
    @lychs1998
    我们之前想法就是用这个请求头来获取 我们有一个全局拦截接口参数 刚刚好可以打印
    Kyle18Tang
    Kyle18Tang
    Dec 28, 2020
    21
    不知道你们是不是用的 Java,如果技术栈是 Spring Cloud 推荐使用 Spring Cloud Zipkin,默认支持很多场景的链路追踪,例如 HTTP 、RabbitMQ 、Kafka 、MySQL 、MongoDB 等都有支持。
    Jooooooooo
    Jooooooooo
    Dec 28, 2020
    22
    入口埋一个唯一 id, 然后一路传下去.

    一般放在 thread local 里, 对于线程池稍微改造下
    cking
    cking
    OP
    Dec 28, 2020
    23
    @Kyle18Tang 就是 Cloud 家族
    Kyle18Tang
    Kyle18Tang
    Dec 28, 2020
    24
    @cking #23 我们现在使用的就是 Spring Cloud Zipkin,很舒服,整个链路都能追踪,通过 Trace Id 就能搜索到所有链路上的日志了
    cking
    cking
    OP
    Dec 28, 2020
    25
    @Kyle18Tang #24 我先试下 requestId 的方式 主要是管理不太想继续集成其他框架了 除非万不得已
    cking
    cking
    OP
    Dec 28, 2020
    26
    @Kyle18Tang #24
    @cking #25
    已经叫我们运维在 nginx 中加了一个 X-Request-Id 了 在请求头中
    Kyle18Tang
    Kyle18Tang
    Dec 28, 2020
    27
    @cking #25 微服务只需要依赖一个 starter 而已。。。然后加个往哪里发送的配置。Zipkin 的服务器另外搭建,Docker 就能启动,数据我们存到了 ES 里。自己写我是感觉真没必要,费时费力。
    whiler
    whiler
    Dec 28, 2020
    28
    业界已经有一套成熟的方案了,可以看一下 opentracing
    Kyle18Tang
    Kyle18Tang
    Dec 28, 2020
    29
    @cking #26 不再建议自定义 HTTP 头采用 X-前缀,https://tools.ietf.org/html/rfc6648
    cking
    cking
    OP
    Dec 28, 2020
    30
    @Kyle18Tang 好的 我去把主管说服吧 哈哈哈
    xuanbg
    xuanbg
    Dec 28, 2020
    31
    Zipkin 真心没有自己查 requestId 方便
    gjf
    gjf
    Dec 28, 2020 via iPhone
    32
    这可以用 trace 解决也叫分布式链路追踪,可以看看云原生的 opentraceing,如果 java 可以使用 specialagent,对代码没有任何侵入
    Yiso1573
    Yiso1573
    Dec 28, 2020
    33
    spring sleuth ,好像要求 spring cloud ?目前我们用的这个
    xuzhzzz
    xuzhzzz
    Dec 28, 2020
    34
    《管理觉得加入分布式链路追踪太麻烦了》

    同样的领导,明明主流方案就在那里,偏偏自己搞,搞得不三不四的,到头来难受的还是自己
    cking
    cking
    OP
    Dec 28, 2020
    35
    @xuzhzzz 没法 程序员打工仔 最底层的人 被测试,产品,运维,前端呼来唤去
    chogath
    chogath
    Dec 28, 2020
    36
    requestId
    laminux29
    laminux29
    Dec 29, 2020
    37
    整个过程,每个经过的节点 ID 或组件 ID 必须都记录上,要不以列表或数组形式记录在数据里,要不分散在各组件的日志里后期汇总。

    这种东西无论是调试、流控还是分布式性能调优,都有重要作用。
    lewis89
    lewis89
    Dec 29, 2020
    38
    其实...最好的办法是不上微服务...大部分公司的量级根本没有达到紧迫到需要上微服务的情况
    liian2019
    liian2019
    Dec 29, 2020
    39
    traceId + spanId
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2928 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 82ms · UTC 11:23 · PVG 19:23 · LAX 03:23 · JFK 06:23
    ♥ Do have faith in what you're doing.