作者回复: 满分作业诞生
作者回复: 取决你调用异步线程的方式,就拿ThreadPoolExecutor这种标准的线程池来说,你使用execute和submit都会产生不一样的结果,一个会公用trace另一个会重新生成trace id,这个例子它底层就取决于AsyncDefaultAutoConfiguration的具体实现。 使用spring代理线程池,或者scheduling线程池,都有不同的表现,同学需要结合sleuth源代码来了解具体行为
作者回复: 有的,zipkin其实是做tracing的,告警我们可以利用ELK这一层来做,比如ElastAlert集成ES,或者Kibana的sentinl插件。我们公司是使用Prometheus+grafana来做的
作者回复: Q1: 用户请求通常不直达gateway,前面用nginx、f5之类的网关层来接 Q2: 答案有一半已经在文章中了,同学可以参考TracingFeignClient,看一看它往请求的header里塞的这些ID,然后就能找到是怎么生成出来的 Q3: 时钟同步是线上运维团队的工作内容,确保集群时间同步,另外sleuth主要是通过span id + parent span id来确保先后顺序,即使时钟不对也能理清前后顺序。 Q4: 打标的答案也在文章中,TracingFeignClient这个类里面是打标过程,然后标通过MDC传入到底层日志组件里,最终输出
作者回复: 交换机会在项目启动的时候被底层的stream组件自动创建,当然了,如果手动创建也是可以的,注意绑定下交换机和队列即可
作者回复: Q1: 是的应该是1000.注释写错了 Q2:根据概率随机采样,0.5就是采样50% Q3: A: 可以扩展 B: 通过AOP切面拦截feign.Client的调用
作者回复: 不管它的底层技术是什么,只要Sleuth中有对应的适配器就可以识别上游的trace ID,这是对于需要互相调用的系统来说的。 对于任务调度,可以理解为本地启动的java程序,执行的时候也会初始化trace,但调度过程中你如果调用的下游服务,对方要在sleuth中支持适配才能识别上游trace
作者回复: 日志系统对性能肯定是有些许损耗的,但带来的好处已经可以完全抵消这一丢丢损耗了,所以没得关系。 然后trace ID和span ID是可以在任何日志级别下打印出来的,只要设置log pattern就可以了
作者回复: 链路图可以直接在zipkin的界面看到,展示实时流量
作者回复: 对滴,所有链路上的服务都要加上这个sleuth依赖,不然只会打log但trace链路会断掉