当前位置: 首页 > 后端技术 > Java

《Java分享客栈》随时随地都能用:微服务链接追踪之zipkin搭建

时间:2023-04-01 17:13:31 Java

前言链接追踪是微服务治理解决方案中的必修课。SpringCloud的组件其实非常好用,真正让生产环境头疼的问题往往是软件维护。微服务之间的接口调用哪一部分有问题,哪个环节耗时长?这些都是项目上线后肯定会遇到的问题。生了。主流方案1)、SkyWalking:这个应该是目前最主流的方案。今年我的公司已经开始将它用于一个新项目。效果真的很显着,功能也很强大。酒吧!开个玩笑,哈哈,其实这个框架也有缺点,就是有点重,比较适合稍微大一点的项目,但是可以预见的是未来几年它会是最流行的解决方案;2)、Zipkin:这是一个老式的链接跟踪解决方案,已经被很多项目验证过。与SkyWalking相比,我个人更喜欢这个框架,因为它更轻巧,安装也很简单。是中小型微服务项目的首选方案。使用方法1、zipkin环境搭建docker官方版,非常简单。也可以下载并运行编译好的zipkin.jar,这是一个springboot工程。官网:https://zipkin.io/pages/quick...1)、启动默认端口号启动zipkin服务,默认端口9411.java-jarzipkin.jar2)、指定端口号java-jarzipkin.jar--server.port=80803),指定访问RabbitMQjava-jarzipkin.jar--zipkin.collector.rabbitmq.addresses=127.0.0.14),启动效果2,SpringCloud集成zipkinspringcloud等基础这里省略依赖包,直接模拟场景。会员服务:zipkin_member订单服务:zipkin_order消息服务:zipkin_msg流程:会员服务调用订单服务,订单服务调用消息服务。1)、引入依赖org.springframework.cloudspring-cloud-starter-zipkin2)、应用.yml配置注意事项:a)、添加服务名,调用RestTemplate时会用到;b)、添加zipkin服务器地址;c)、增加概率采集率设置,默认0.1,测试环境改为1.0保证每次都采集,生产环境适当采样。(因为10000个请求可以抽取1000个来发现问题,没必要全部收集起来)3)、引入RestTemplate,其中restTemplate主要用于接口调用,检查链接跟踪是否有效@ComponentpublicclassRestTemplateConfig{@Bean@LoadBalancedpublicRestTemplaterestTemplate(){返回新的RestTemplate();}}4)、controller调用会员调用订单order调用message消息处理具体业务5)、查看效果启动Zipkin服务器,访问:http://127.0.0.1:9411执行controller查看链接跟踪接口,可以看到接口调用的链接已经显示在zipkin中了。
3.zipkin集成RabbitMQ异步采集springboot2.0后,官方不再推荐使用自建zipkinserver,而是直接使用编译好的zipkin.jar供我们使用。zipkin.jar中的yml配置可以参考:https://github.com/openzipkin...1)在指定RabbitMQ作为服务端启动zipkin服务时,可以指定rabbitmq作为服务端,rabbitmq服务器必须先启动。java-jarzipkin.jar--zipkin.collector.rabbitmq.addresses=192.168.239.132启动后,可以发现rabbitmq中会自动添加一个zipkin队列,说明绑定成功。2)、引入中间依赖为每个微服务引入stream和rabbitmq中间件依赖org.springframework.cloudspring-cloud-stream-binder-rabbit3)、yml配置修改各个微服务的application.yml,加上rabbitmq的配置。rabbitmq:host:192.168.239.132port:5672username:guestpassword:guest4),startandcall启动微服务,执行调用。5)MQ是否收到消息,看rabbitmq是否收到消息。如果队列有响应,说明rabbitmq已经收到消息。6)查看zipkin是否收集信息,查看zipkin是否收集链接信息7)验证消息积压,关闭zipkin服务,查看消息是否会积压在rabbitmq中,再启动zipkin服务,查看消息是否会积压被消费,链接将被获取信息。获取消息查看,发现获取到traceId相关的json数据,证明整个流程正常。重启zipkin服务,发现积压的rabbitmq消息已经消耗完了。并且还可以获取链接信息4.Zipkin使用MySQL将yml配置存储在zipkin.jar中。你可以参考一下。里面有关于mysql的配置或者elasticsearch等其他的配置:https://github.com/openzipkin...这里上一节我们在上一节1)的MQ的基础上增加了MySQL的启动配置项。指定MySQL的命令看起来很长,但其实仔细看就会发现很简单。java-jarzipkin.jar--zipkin.collector.rabbitmq.addresses=192.168.239.132--zipkin.storage.type=mysql--zipkin.storage.mysql.host=127.0.0.1--zipkin.storage.mysql.port=3306--zipkin.storage.mysql.username=root--zipkin.storage.mysql.password=123456--zipkin.storage.mysql.db=zipkin2),创建zipkin数据库根据1中命令配置的信息,创建zipkin数据库,执行语句创建zipkin集合记录的三张表。参考官网??:https://github.com/apache/inc...这里我也贴出来zipkin-mysql.sqlCREATETABLEIFNOTEXISTSzipkin_spans(`trace_id_high`BIGINTNOTNULLDEFAULT0COMMENT'如果非零,这意味着trace使用128位traceIds而不是64位',`trace_id`BIGINTNOTNULL,`id`BIGINTNOTNULL,`name`VARCHAR(255)NOTNULL,`remote_service_name`VARCHAR(255),`parent_id`BIGINT,`debug`BIT(1),`start_ts`BIGINTCOMMENT'Span.timestamp():epochmicrosusedforendTsqueryandtoimplementTTL',`duration`BIGINTCOMMENT'Span.duration():microsusedforminDurationandmaxDurationquery',PRIMARYKEY(`trace_id_high`,`trace_id`,`id`))ENGINE=InnoDBROW_FORMAT=COMPRESSEDCHARACTERSET=utf8COLLATEutf8_general_ci;ALTERTABLEzipkin_spansADDINDEX(`trace_id_high`,`trace_id`)COMMENT'forgetTracesByIds';ALTERTABLEzipkin_spansADDINDEX(`name`)COMMENT'forgetTracesandgetSpanNames';ALTERTABLEzipkin_spansADDINDEX(`remote_service_name`)评论'forgetTracesandgetRemoteServiceNames';ALTERTABLEzipkin_spansADDINDEX(`start_ts`)COMMENT'forgetTracesorderingandrange';CREATETABLEIFNOTEXISTSzipkin_annotations(`trace_id_high`BIGINTNOTNULLDEFAULT0COMMENT'如果非零,这意味着trace使用128位traceIds而不是64位',`trace_id`BIGINTNOTNULLCOMMENT'与zipkin_spans.trace_id'重合',`span_id`BIGINTNOTNULLCOMMENT'与zipkin_spans.id重合',`a_key`VARCHAR(255)NOTNULLCOMMENT'BinaryAnnotation.keyorAnnotation.valueiftype==-1',`a_value`BLOBCOMMENT'BinaryAnnotation.value(),whichmustbesmallerthan64KB',`a_type`INTNOTNULLCOMMENT'BinaryAnnotation.type()or-1ifAnnotation',`a_timestamp`BIGINTCOMMENT'用于实现TTL;Annotation.timestamporzipkin_spans.timestamp',`endpoint_ipv4`INTCOMMENT'NullwhenBinary/Annotation.endpointisnull',`endpoint_ipv6`BINARY(16)COMMENT'NullwhenBinary/Annotation.endpoint为空,或没有IPv6地址'、`endpoint_port`SMALLINTCOMMENT'当Binary/Annotation.endpoint为空时为空'、'endpoint_service_name`VARCHAR(255)COMMENT'当Binary/Annotation.endpoint为空时为空')ENGINE=InnoDBROW_FORMAT=COMPRESSEDCHARACTERSET=utf8COLLATEutf8_general_ci;ALTERTABLEzipkin_annotationsADDUNIQUEKEY(`trace_id_high`,`trace_id`,`span_id`,`a_key`,`a_timestamp`)COMMENT'Ignoreinsertonduplicate';ALTERTABLEzipkin_annotations添加索引(`trace_id_high`,`trace_id`,`span_id`)COMMENT'forjoiningwithzipkin_spans';ALTERTABLEzipkin_annotationsADDINDEX(`trace_id_high`,`trace_id`)COMMENT'forgetTraces/ByIds';ALTERTABLEzipkin_annotationsADDINDEX(`endpoint_service_name`)COMMENT'forgetTracesandgetServiceNames';ALTERTABLEzipkin_annotationsADDINDEX(`a_type`)COMMENT'forgetTracesandautocompletevalues';ALTERTABLEzipkin_annotationsADDINDEX(`a_key`)COMMENT'forgetTracesandautocomplete值价值观';ALTERTABLEzipkin_annotationsADDINDEX(`trace_id`,`span_id`,`a_key`)COMMENT'fordependenciesjob';如果不存在则创建表,`parent`,`child`))ENGINE=InnoDBROW_FORMAT=COMPRESSEDCHARACTERSET=utf8COLLATEutf8_general_ci;3),Effect启动微服务,执行控制器请求,看是否成功RabbitMQzipkinMySQL至此,springcloudsleuth+zipkin+rabbitmq+mysql全部集成成功!综上所述,微服务的管理方案有很多,学习方向看个人喜好。我的经验是,你不必盲目地遵循这个辅助解决方案。比如现在有SkyWalking,以后可能会有SkyFlying、SkySwimming。
要成为一名高级软件工程师,必须要有这样的意识,当层出不穷的开源框架如雨后春笋般冒出来的时候,你要有信心用自己花一点时间搭建的框架,这是提升自己最好的有用方法。
一个项目用哪种治理方案,最重要的不是跟风,而是用最合适的,就像找女朋友,而不是只找漂亮的,但要找最好的一起住,否则就不协调了。分享这篇文章其实是我8年多工作学习中记录在云笔记中的内容之一。其实还有很多其他的东西是我业余时间整理的。有兴趣的朋友可以下载看看。什么到时候打开它可能会节省很多时间。链接:https://pan.baidu.com/doc/sha...提取码:bxaa本人原创文章纯手写,重点分享主流技术和实际工作经验。如果觉得有一点帮助,请点赞评论收藏一下吧!更多最新技术文章,请关注GZH:【Java分享客栈】

最新推荐
猜你喜欢