全链路追踪竟然如此简单? bytebuddy搭建全链路追踪的demo 附代码

大家好,我是烤鸭:
    最近一直在研究全链路追踪,比如cat、skywalking、zipkin等。
    发现 skywalking 是基于bytebuddy 实现的,想自己试着写一下demo。
    demo的git地址,感兴趣的可以自己试下。代码在idea中可以跑,至于其他场景需要自己研究(比如用cmd或者linux可能会报NoClassDefDoundError)。

demo地址:(仅实现了http方式的链路,有需要的可以自己补充,比如dubbo或者其他rpc方式的拦截)

https://gitee.com/fireduck_admin/link-trace-demo
    环境:
    JDK 8


1.    设计目标


    监控接口(方法)耗时和链路关系(http请求),对比aop方式,zipkin和cat 是基于拦截的形式。

2.  bytebuddy


    bytebuddy网上资料虽然不多,但是api比较简单,看看基本就会了。我也不介绍了。具体想看的去官网看下吧。
    https://bytebuddy.net/

3.  接口耗时伪代码说明


    由于测试链路,我们需要一个agent项目和demo项目(用于请求转发)。
    agent项目创建拦截和写具体的拦截逻辑,这里以 拦截 Spring的service注解为例。这是在agent项目里的。    

public static void premain(String agentArgs, Instrumentation inst) {System.out.println("==============Client=============== premain =============start============");AgentBuilder.Transformer transformerService = new AgentBuilder.Transformer() {@Overridepublic DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule module) {return builder.method(ElementMatchers.<MethodDescription>any()) // 拦截任意方法.intercept(MethodDelegation.to(MyServiceAdvice.class)); // 委托}};// 拦截 ServiceAgentBuilder agentBuilder = agentBuilder.type(ElementMatchers.isAnnotatedWith(ElementMatchers.named("org.springframework.stereotype.Service"))) // 指定需要拦截的类.transform(transformerService);// 注入 instagentBuilder.installOn(inst);System.out.println("================Client============ premain ================finish===========");}

  demo项目启动的时候需要在idea配置vm参数。不知道怎么配的看图。

 -javaagent:\xx\xx\target\link-trace-demo-agent-1.0-SNAPSHOT.jar

拦截效果如图,这样就实现了接口(方法)调用的耗时统计。

4.  全链路伪代码说明


    其实自从google在2010年提出了dapper论文后,后续的链路追踪基本都是按照这个思路来实现的,我这就是简易版。
    agent拦截 controller 注解跟上面的service类似,就不贴代码了。
    这里我们需要一个span对象,当前的请求信息记录在span对象(主要是谁调的你),并且放到threadlocal的调用堆栈中,这样当前的请求和线程就绑定了(方便单个服务内的流转,比如controller调service)。
    这里截图可以看下只单独拦截了web,由于没有上游的信息,所以生成的新的span,seq为1。如图。

    模拟下拦截web后调用web方法的链路信息。如图所示。pid(parentid)指的是上个链路的id,这样就可以获取到整个调用链的完整信息(出入参、时间、方法等)


    再多链路,比如web-service-web或者更多服务的自己试下吧,思路就是这样的。

5.  aop个agent的对比


    只是单纯的统计aop方式和bytebuddy两种方式。aop底层有接口使用jdk 代理,无接口使用cglib(底层asm)。而bytebuddy底层也是 asm
    先放一张官方的对比图。

    至于到底快不快,我试下。先链路的代码先注释,单纯调下接口试试。(测试方法在test包下)
    先看下单次的:


    单独调用controller的时候,bytebuddy明显快的,几乎没有损耗。
    调用web+serivce的时候时间差不多。
    下面单独调用两种情况,500次的平均值:
    仅调用Controller:    
    AOP方式: 5.7 ms,主要损耗在首次调用。

    [329, 12, 9, 6, 7, 5, 6, 5, 6, 7, 9, 8, 6, 5, 8, 8, 9, 22, 7, 11, 7, 5, 7, 6, 6, 6, 5, 6, 7, 10, 9, 9, 6, 8, 8, 13, 20, 10, 38, 7, 9, 8, 7, 10, 12, 9, 7, 7, 8, 9, 11, 11, 6, 7, 8, 5, 5, 5, 4, 5, 4, 3, 3, 4, 4, 4, 6, 4, 4, 4, 5, 6, 6, 7, 7, 6, 7, 5, 5, 8, 6, 7, 4, 7, 7, 6, 5, 5, 4, 4, 3, 4, 4, 4, 4, 5, 9, 4, 5, 5, 7, 4, 5, 11, 7, 7, 6, 9, 7, 22, 8, 14, 8, 4, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 11, 4, 4, 4, 4, 4, 7, 5, 8, 8, 7, 6, 6, 6, 7, 7, 4, 5, 3, 4, 4, 3, 4, 3, 4, 3, 4, 4, 5, 4, 4, 4, 4, 6, 10, 4, 6, 8, 7, 11, 12, 5, 8, 7, 6, 5, 4, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 8, 4, 5, 8, 6, 12, 4, 8, 5, 8, 6, 7, 6, 9, 3, 4, 6, 4, 3, 4, 3, 3, 3, 3, 3, 3, 4, 5, 5, 4, 3, 3, 3, 4, 4, 5, 4, 6, 6, 5, 4, 7, 4, 9, 4, 5, 6, 5, 8, 5, 6, 4, 4, 4, 3, 3, 4, 4, 2, 3, 3, 3, 2, 3, 3, 3, 4, 3, 4, 5, 4, 3, 3, 3, 4, 4, 5, 4, 5, 4, 7, 4, 6, 5, 5, 6, 3, 3, 4, 4, 5, 5, 5, 4, 4, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 3, 2, 2, 3, 3, 3, 3, 2, 3, 6, 4, 4, 4, 4, 4, 7, 3, 4, 6, 3, 5, 7, 5, 6, 4, 6, 7, 5, 4, 7, 6, 3, 3, 3, 4, 3, 3, 2, 3, 3, 3, 3, 2, 3, 3, 4, 4, 3, 4, 3, 4, 5, 5, 4, 10, 12, 7, 7, 5, 10, 4, 6, 6, 5, 4, 6, 6, 5, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 4, 13, 6, 11, 4, 6, 4, 4, 6, 4, 4, 5, 4, 4, 6, 4, 3, 4, 3, 4, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 3, 2, 3, 4, 3, 4, 5, 4, 4, 6, 5, 4, 6, 4, 4, 6, 5, 4, 7, 3, 4, 4, 5, 3, 4, 4, 3, 3, 12, 5, 3, 3, 3, 4, 3, 2, 2, 2, 3, 2, 3, 3, 4, 3, 4, 4, 2, 3, 5, 4, 3, 7, 4, 4, 5, 3, 12, 21, 15, 16, 7, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 2, 2, 3, 3, 2, 2, 2, 2, 2]
    avg = OptionalDouble[5.706]
    AGENT方式: 5.4 ms,主要损耗在首次调用。
    [251, 9, 11, 12, 9, 9, 9, 9, 8, 11, 13, 6, 5, 5, 5, 6, 5, 5, 4, 6, 6, 6, 4, 10, 7, 6, 8, 7, 8, 6, 7, 7, 6, 6, 7, 6, 8, 5, 6, 5, 4, 4, 5, 5, 4, 4, 4, 4, 3, 4, 3, 5, 4, 3, 4, 4, 5, 5, 6, 5, 7, 6, 11, 10, 7, 9, 6, 5, 7, 5, 8, 6, 10, 7, 7, 7, 5, 5, 5, 5, 5, 5, 7, 5, 9, 19, 10, 7, 4, 3, 4, 4, 4, 3, 3, 4, 4, 6, 5, 4, 3, 5, 6, 4, 4, 5, 9, 10, 5, 3, 4, 5, 7, 4, 5, 10, 5, 8, 5, 11, 6, 6, 10, 4, 4, 5, 5, 7, 5, 4, 4, 7, 4, 4, 4, 5, 6, 4, 4, 5, 6, 6, 4, 6, 4, 4, 5, 8, 4, 5, 5, 4, 4, 5, 4, 4, 4, 7, 7, 10, 4, 4, 4, 3, 4, 3, 3, 4, 5, 4, 5, 8, 4, 5, 6, 7, 4, 4, 6, 5, 4, 7, 4, 4, 5, 5, 8, 5, 4, 6, 4, 9, 4, 5, 3, 3, 3, 4, 4, 3, 3, 4, 4, 4, 6, 5, 12, 6, 5, 5, 6, 8, 7, 14, 8, 5, 6, 6, 5, 5, 10, 5, 6, 5, 4, 4, 3, 4, 4, 4, 4, 5, 4, 6, 7, 4, 8, 5, 6, 4, 5, 7, 4, 6, 5, 5, 6, 3, 4, 3, 3, 4, 4, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 4, 4, 5, 3, 5, 7, 3, 4, 5, 4, 4, 7, 4, 5, 6, 5, 8, 4, 4, 5, 4, 3, 3, 3, 3, 4, 2, 3, 6, 4, 3, 3, 3, 3, 4, 4, 3, 3, 4, 4, 5, 8, 5, 6, 5, 10, 3, 4, 14, 5, 7, 3, 7, 3, 3, 8, 3, 4, 5, 3, 4, 4, 3, 3, 4, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 6, 6, 6, 7, 5, 7, 5, 5, 4, 4, 4, 3, 5, 5, 6, 4, 6, 3, 2, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 5, 4, 3, 3, 4, 4, 5, 8, 4, 6, 3, 5, 5, 4, 6, 8, 5, 3, 3, 4, 6, 7, 5, 8, 4, 4, 4, 5, 6, 5, 4, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 7, 3, 7, 4, 6, 6, 3, 5, 7, 4, 5, 3, 5, 5, 4, 4, 5, 3, 3, 2, 5, 3, 26, 17, 8, 20, 9, 10, 3, 3, 4, 6, 3, 5, 6, 3, 5, 5, 4, 4, 5, 4, 4, 5, 3, 3, 3, 3, 2, 3, 2, 2, 2, 2, 2, 3, 2, 2, 2, 3, 3, 2, 2, 2, 2, 3, 2, 2, 2, 3, 3, 3, 2]
    avg = OptionalDouble[5.438]

    结论是在仅有cglib代理的时候(单独调用controller),耗时差不多,bytebuddy要稍快一些。
    调用Controller+Service:
    AOP方式: 5.7 ms,主要损耗在首次调用。

    [328, 14, 8, 12, 11, 9, 8, 7, 8, 8, 13, 6, 6, 6, 7, 7, 6, 6, 8, 5, 7, 8, 11, 11, 9, 8, 9, 5, 12, 8, 8, 5, 5, 8, 6, 9, 6, 8, 6, 4, 4, 5, 5, 4, 5, 7, 7, 11, 6, 9, 5, 8, 10, 5, 10, 6, 6, 6, 7, 6, 5, 4, 4, 4, 4, 3, 5, 4, 5, 5, 5, 5, 6, 7, 9, 5, 8, 6, 7, 7, 6, 4, 5, 7, 5, 8, 5, 5, 5, 4, 5, 4, 5, 4, 6, 9, 8, 9, 6, 6, 5, 4, 7, 9, 4, 4, 10, 8, 25, 30, 29, 4, 5, 6, 6, 7, 4, 6, 5, 5, 6, 6, 9, 6, 10, 12, 8, 13, 8, 6, 6, 4, 5, 4, 3, 5, 3, 3, 3, 4, 3, 3, 4, 3, 3, 3, 3, 4, 4, 4, 6, 5, 5, 6, 4, 6, 4, 4, 6, 5, 4, 5, 6, 6, 5, 5, 5, 4, 4, 4, 6, 12, 7, 5, 6, 5, 4, 5, 4, 6, 9, 8, 10, 4, 3, 6, 4, 4, 4, 4, 11, 8, 5, 4, 14, 6, 7, 5, 6, 6, 5, 5, 9, 4, 6, 8, 5, 5, 5, 6, 3, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 2, 2, 3, 4, 4, 6, 14, 8, 6, 6, 4, 4, 9, 4, 6, 5, 6, 4, 4, 5, 6, 4, 4, 3, 4, 4, 4, 3, 5, 4, 3, 3, 5, 15, 11, 11, 6, 9, 5, 6, 5, 5, 7, 5, 8, 6, 7, 5, 4, 5, 5, 7, 4, 4, 4, 5, 5, 4, 4, 5, 9, 4, 6, 5, 4, 7, 5, 7, 6, 9, 7, 5, 7, 5, 5, 5, 5, 6, 6, 5, 6, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 3, 5, 3, 5, 5, 8, 5, 5, 6, 8, 5, 5, 4, 4, 6, 4, 4, 5, 4, 4, 4, 3, 4, 3, 4, 4, 3, 3, 3, 3, 2, 3, 3, 3, 4, 4, 3, 7, 4, 4, 8, 4, 7, 4, 3, 8, 4, 4, 6, 5, 3, 7, 3, 4, 5, 3, 3, 2, 3, 2, 3, 3, 3, 2, 3, 3, 3, 4, 7, 4, 6, 3, 3, 3, 3, 3, 3, 3, 4, 3, 3, 5, 4, 4, 4, 6, 4, 7, 4, 5, 6, 4, 4, 6, 5, 7, 4, 3, 6, 3, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 4, 3, 3, 2, 3, 4, 4, 4, 4, 4, 5, 4, 5, 3, 5, 4, 7, 4, 31, 5, 4, 5, 6, 5, 6, 5, 4, 5, 8, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 5, 4, 3, 8, 4, 32, 13, 37, 28, 5, 4, 3, 3, 3, 3, 2, 2, 3, 3, 3, 5, 6, 3, 3, 3, 4, 5, 3, 3, 3, 4]
    avg = OptionalDouble[6.186]
    AGENT方式: 5.89 ms,主要损耗在首次调用。
    [306, 16, 7, 9, 10, 11, 9, 7, 8, 11, 18, 11, 8, 9, 11, 9, 6, 6, 6, 11, 7, 8, 10, 9, 15, 9, 7, 12, 22, 8, 6, 6, 5, 5, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 8, 7, 11, 15, 17, 8, 9, 5, 6, 8, 7, 6, 9, 5, 4, 5, 5, 4, 4, 5, 4, 5, 4, 5, 4, 4, 6, 6, 10, 6, 6, 8, 5, 8, 6, 10, 6, 9, 7, 7, 6, 8, 6, 5, 6, 5, 5, 6, 7, 7, 6, 8, 6, 10, 8, 9, 6, 4, 5, 8, 4, 5, 6, 5, 33, 19, 19, 6, 5, 4, 6, 5, 6, 5, 7, 6, 6, 7, 7, 5, 6, 6, 5, 8, 5, 4, 4, 5, 4, 3, 3, 4, 3, 4, 3, 3, 3, 3, 3, 3, 4, 3, 5, 4, 4, 6, 6, 5, 7, 4, 5, 6, 4, 6, 4, 7, 6, 3, 6, 3, 3, 3, 4, 3, 4, 3, 5, 3, 4, 5, 4, 4, 3, 3, 4, 3, 8, 4, 11, 5, 6, 6, 9, 4, 5, 7, 5, 16, 6, 4, 6, 4, 4, 5, 3, 4, 2, 3, 3, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 6, 5, 6, 4, 5, 9, 5, 8, 4, 4, 5, 4, 8, 7, 8, 5, 5, 4, 5, 5, 7, 4, 6, 4, 4, 6, 4, 4, 4, 5, 4, 4, 5, 8, 18, 12, 5, 7, 5, 5, 5, 4, 4, 7, 5, 3, 3, 4, 3, 4, 3, 3, 3, 4, 3, 4, 3, 4, 3, 9, 4, 4, 4, 3, 3, 3, 5, 5, 4, 4, 5, 4, 5, 6, 4, 3, 4, 6, 4, 5, 7, 3, 5, 4, 4, 6, 4, 3, 4, 3, 3, 3, 3, 3, 2, 2, 3, 2, 3, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 7, 4, 5, 4, 4, 4, 4, 5, 4, 6, 4, 5, 7, 5, 6, 5, 3, 4, 4, 4, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 2, 3, 3, 3, 2, 3, 4, 4, 3, 4, 2, 6, 4, 4, 5, 3, 3, 5, 4, 5, 7, 7, 5, 12, 4, 5, 4, 3, 4, 5, 5, 3, 4, 4, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 4, 4, 4, 6, 5, 6, 5, 5, 6, 4, 5, 6, 4, 7, 5, 5, 7, 6, 6, 4, 4, 5, 4, 5, 3, 3, 5, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 4, 4, 3, 4, 4, 5, 4, 4, 4, 5, 4, 6, 4, 4, 6, 4, 4, 7, 4, 4, 6, 2, 2, 5, 3, 4, 4, 3, 3, 18, 7, 9, 10, 21, 28, 20, 12, 5, 4, 4, 3, 3, 5, 2, 3, 3, 2, 3, 2, 2, 2, 3, 3, 3]
    avg = OptionalDouble[5.896]
    结论是在仅有cglib代理+jdk proxy的时候(调用controller+service),耗时差不多,bytebuddy要稍快一些。

    事实证明,确实这样,尤其是我只是测试一个简单接口,如果链路长的时候这个差距会更加明显。

6.  结论

    事实上链路追踪的框架已经很很多了,选一款适合自己的就好,如果业务个性化需求比较多,自己开发也是一个不错的选择。你也看到了,自己写一个也没有那么复杂。如果选用开源框架的话,我推荐 skywalking,社区生态整体都挺好的,而且也方便二次开发,网上文章和文档也挺多的,就不多介绍了。

 

推荐几篇 javaagent 的文章:
https://www.jianshu.com/p/5c62b71fd882

https://www.jianshu.com/p/b72f66da679f

https://www.jianshu.com/p/7b2072513819

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts地图的基本使用配置

一、空气质量图 代码和配置如下&#xff1a; <template><div class"box"><div id"map"></div></div> </template><script>import china from echarts/map/js/china.js export default {data(){return {}},mount…

从源码角度分析下 micrometer 自定义 metrics endpoint 和 springboot actuator

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享下 micrometer 的源码&#xff0c;和springboot集成 自定义endpoint 的使用。 1. 文档信息 官方文档&#xff1a; http://micrometer.io/docs github&#xff1a; https://github.com/micrometer-metrics/micrometer s…

云打码

1、云打码平台注册开发者模式用户登录 2、建立项目&#xff0c;下载项目案列代码接口 代码如下&#xff1a; 1 import http.client, mimetypes, urllib, json, time, requests2 3 ######################################################################4 5 class YDMHttp:6 …

Perhaps you are running on a JRE rather than a JDK? 关于 idea maven 缓存的问题 清理 idea maven 缓存

大家好&#xff0c;我是烤鸭&#xff1a; 1. 先检查是否环境变量的问题 参考这篇 https://blog.csdn.net/mingjie1212/article/details/106963143 2. 如果确定环境变量没问题 执行maven install的时候报错&#xff0c;Perhaps you are running on a JRE rather than a JDK …

swift - 使用系统app导航

import UIKit//1.导入框架 import MapKitclass ViewController: UIViewController {lazy var geoCoder : CLGeocoder {return CLGeocoder()}()override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {geoCoder.geocodeAddressString("广州&…

springcloud gateway 使用nacos 作为配置中心 和 注册中心

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享下 springcloud gateway 使用nacos作为配置中心和注册中心&#xff0c;主要是还是配置中心。 源码下载&#xff1a; https://gitee.com/fireduck_admin/springcloud-gateway-nacos-demo 1. 本地部署nacos 下载 https://g…

springboot 拦截器的坑 WebMvcConfigurationSupport 失效

大家好&#xff0c;我是烤鸭&#xff1a; 今天遇到一个拦截器失效的问题&#xff0c;具体看源码分析下。 环境: springboot 2.x spring 5.x 1. 先说下业务场景 需求是对请求进入时和离开时对和线程id绑定&#xff0c;用的Threadlocal&#xff0c;现在有一个问题&#xff0…

skywalking 源码解析——多线程变量传递 EnhancedInstance

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享下 skywalking源码&#xff0c;正好自己用到相关的内容了。 1. 拦截点 三个主要的拦截器、构造方法、静态方法和示例方法&#xff0c;每个切面里都可以重写这些方法&#xff0c;并且指定进入的拦截器。 2. trace 相关内容 …

2018-2019-1 20165303 实验五 通讯协议设计

任务一 Linux下OpenSSL的安装与使用 前往OpenSSL官网&#xff0c;选择打开OpenSSL源码下载地址&#xff0c;按照下图所示方法下载压缩包“openssl-master.zip Linux下使用unzip openssl-master.zip命令解压 安装的具体命令如下&#xff1a;$ ./config$ make$ make test$ make i…

从字节码看 finally关键字、异常表

大家好&#xff0c;我是烤鸭&#xff1a; 今天说下 finally 这个关键字。 1. 认识finally finally 总是跟 try、catch一起出现&#xff0c;finally是执行方法结束一定要执行的代码&#xff0c;比如流关闭等等。 finally是如何实现在异常捕捉之后保证执行 finally 代码块里的…

Unhandled exception: org.springframework.beans.factory.BeanDefinitionStoreException

大家好&#xff0c;我是烤鸭&#xff1a; ​ 使用 idea 莫名其妙的错误。 无法编译 异常已经 catch 住了&#xff0c;提示明显是有问题的。 再看一下 maven install 的结果 Error:(99, 100) java: 无法访问org.springframework.core.env.EnvironmentCapable 找不到org.spr…

springcloud gateway 源码解析、请求响应流程、第三方响应结果在 gateway 的经过

大家好&#xff0c;我是烤鸭&#xff1a; 1. 官方介绍 官方文档&#xff1a; 看的是 2.2.5.RELEASE 版本的 https://docs.spring.io/spring-cloud-gateway/docs/2.2.5.RELEASE/reference/html/ 看一下官方这段说明&#xff0c;gateway 使用的是 webflux 和 reactor&#x…

改logback logstash-logback-encoder 框架本身的日志级别

大家好&#xff0c;我是烤鸭&#xff1a; 最近遇到一个问题&#xff0c;想把logback框架本身的日志级别修改&#xff0c;需要 logstash-logback-encoder 6.1 以上的版本才可以。 直接上代码 这里修改的不是业务日志级别&#xff0c;是 logback 框架本身(确切地说是 logstash…

idea首次创建新模块的详细操作

依赖网址:https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/3.1.0 https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api/2.3.1 https://mvnrepository.com/artifact/org.springframework/spring-webmvc 创建文件夹 修改版本号 配…

markdown 常用语法总结 - 个人版

这里并不是要总结所有的 markdown 语法&#xff0c;只是总结笔者自己撰写博客时常用的一些 markdown 语法。 1 图片设置 1.1 设置图片位置 利用markdown在编写文档时插入图片是默认靠左&#xff0c;有些时候将图片设置为居中时可以更加的美观&#xff0c;这时就需要在图片的信息…

PostgreSQL 、springboot 、spring data jpa 集成

项目地址&#xff1a;https://gitee.com/zhxs_code/PostgreSQL_springboot_jpa_demo.git 增删查改都已经实现。 重点部分&#xff1a; 1.定义自己的方言。 1 package com.zxl.postgrespringdemo.config.dialect;2 3 import org.hibernate.dialect.PostgreSQL94Dialect;4 import…

RedisTemplate value序列化导致的问题

大家好&#xff0c;我是烤鸭&#xff1a; ​ 今天分享一个redisTemplate 使用时&#xff0c;value 序列化的问题。 1. 问题描述 其实我最开始遇到的问题是&#xff1a; stringRedisTemplate.opsForSet().isMember(key,value)一直返回false问题&#xff0c;下边博客给出了…

[css] 如何实现换肤功能?

[css] 如何实现换肤功能&#xff1f; css 换肤常见方案 是通过 less/sass/postcss 等css 预处理器&#xff0c;通过它们自身的变量用法&#xff0c;设置不同变量&#xff0c;生成不同的主题样式&#xff0c;但是这些样式都是会被打包成常量&#xff0c;我们只能在编译之前修改…

日志 中文乱码、nacos 中文乱码、saltstack 中文乱码、docker中文乱码

大家好&#xff0c;我是烤鸭&#xff1a; ​ 今天分享一个 saltstack 中文乱码 的问题。 问题说明 由于项目之前没有接入公司的发布系统&#xff0c;今天接入之后发现日志乱码&#xff0c;不仅如此&#xff0c;从nacos获取到的中文参数也是乱码。于是猜想是发布系统遗留了一…

redis出现过多command 慢查询slowlog出现command命令

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一个问题&#xff0c;一个关于redis slowlog&#xff0c;执行过多 command命令的问题。 问题来源 所有走redis 的接口tp99和平均耗时是原来的两倍不止&#xff0c;运维说redis 的qps也翻倍了。查了下slowlog&#xff0c;发现…