Dubbo實現(xiàn)分布式日志鏈路追蹤
技術(shù)場景
在日常的開發(fā)、測試或運維的過程中,經(jīng)常存在這樣的場景,開發(fā)人員在代碼中使用日志工具(log4j、slf4j)記錄日志,比如請求ID、IP等,方便在線上快速、精準(zhǔn)的定位問題,通過完整的日志鏈路清晰的進行信息定位。
一般的項目都是分層的、分布式的,在眾多的日志信息中,如何區(qū)分哪些日志信息是同一請求發(fā)出來的,詳細(xì)的實現(xiàn)如下。
技術(shù)框架
項目框架:Spring boot
分布式協(xié)調(diào):Zookeeper、Dubbo
日志工具:Sf4j
構(gòu)建工具:Maven
開發(fā)工具:IDEA
項目框架

mdc-dubbo-api:接口服務(wù)
mdc-dubbo-provider:服務(wù)端服務(wù)
mdc-dubbo-consumer:消費端服務(wù)
項目配置
mdc-dubbo-api
提供一個接口
public interface OrderService {
String getOrder(String orderid);
}
mdc-dubbo-consumer
在服務(wù)端,在Controller層使用MDC工具類放入一個TRACE_LOG_ID信息,在此請求的service層、mdc-dubbo-provider中使用該信息。

項目分為Controller、Service、Filter等各層:
Controller層:存放TRACE_LOG_ID, 打印
@GetMapping("get/{id}")
public String get(@PathVariable("id") String id){
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
MDC.put(Constants.TRACE_LOG_ID, uuid);
LOGGER.info("controller->param:{}", id);
return consumerService.getName(id);
}
Service層:打印TRACE_LOG_ID
@Override
public String getName(String id) {
LOGGER.info("consumer->service->param:{}", id);
return orderService.getOrder(id);
}
Filter:
public class TraceFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
//從MDC中獲取
String logId = MDC.get(Constants.TRACE_LOG_ID);
Map<String, String> attachments = invocation.getAttachments();
attachments.put(Constants.TRACE_LOG_ID, logId);
return invoker.invoke(invocation);
}
需要過濾器配置在resources->MATE-INF->dobbo文件夾下
![過濾器配置https://img-blog.csdnimg.cn/20181219100406136.png)
traceFilter=com.bestpay.provider.filter.TraceFilter
此處注意 此處使用到了Dubbo中spi機制,文件名必須是com.alibaba.dubbo.rpc.Filter
dubbo配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--過濾器配置-->
<!-- <dubbo:provider filter="traceFilter" />-->
<!-- 應(yīng)用名-->
<dubbo:application name="dmc-dubbo-provider"/>
<!--zookeeper注冊中心-->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<dubbo:protocol name="dubbo" port="20880"/>
<!--服務(wù)注冊-->
<dubbo:service interface="com.bestpay.service.OrderService" ref="orderService" timeout="10000" **filter="traceFilter"**/>
<bean id="orderService" class="com.bestpay.provider.service.OrderServiceImpl" />
</beans>
其中filter="traceFilter是引用dobbo目錄下配置中的key
logback配置
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] %logger %line --%mdc{client} [%X{TRACE_LOG_ID}] %msg%n</pattern>
<!-- 控制臺也要使用UTF-8,不要使用GBK,否則會中文亂碼 -->
<charset>UTF-8</charset>
</encoder>
</appender>
TRACE_LOG_ID對應(yīng)放入MDC中的key
mdc-dubbo-provider
配置和## mdc-dubbo-consumer類似,其中在Filter上稍微有些差別
public class TraceFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String logId = invocation.getAttachment(Constants.TRACE_LOG_ID);
MDC.put(Constants.TRACE_LOG_ID, logId);
return invoker.invoke(invocation);
}
}
項目運行
mdc-dubbo-consumer日志:
[2018-12-19 10:16:56] [INFO ] com.bestpay.comsumer.controller.ConsumerController 33 – [d88ecba6581c47b1b3ade78d2821d13a] controller->param:223
[2018-12-19 10:16:56] [INFO ] com.bestpay.comsumer.service.impl.ComsumerServiceImpl 20 – [d88ecba6581c47b1b3ade78d2821d13a] consumer->service->param:223mdc-dubbo-provider日志:
[2018-12-19 10:16:56] [INFO ] com.bestpay.provider.service.OrderServiceImpl 13 – [d88ecba6581c47b1b3ade78d2821d13a] provider->service->param:223
以上,完成了dubbo分布式服務(wù)之間日志的完整鏈路。為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實現(xiàn)protocol傳輸?shù)目蛻舳撕头?wù)端的示例代碼
本文主要介紹了java實現(xiàn)protocol傳輸?shù)目蛻舳撕头?wù)端的示例代碼,基于TCP協(xié)議的客戶端和服務(wù)端,包括了基本的連接、消息傳遞和關(guān)閉連接的操作,感興趣的可以了解一下2024-07-07
java中Integer包裝類裝箱的一個細(xì)節(jié)詳解
Java中的Integer是int的包裝類型,下面這篇文章主要給大家介紹了關(guān)于java中Integer包裝類裝箱的一個細(xì)節(jié)的相關(guān)資料,文中介紹的這個細(xì)節(jié)挺重要的,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧2018-07-07
maven創(chuàng)建spark項目的pom.xml文件配置demo
這篇文章主要為大家介紹了maven創(chuàng)建spark項目的pom.xml文件配置demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05
Plugin ‘org.springframework.boot:spring-boot-maven-plug
這篇文章給大家介紹了Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found的解決方案,親測可用,文中給出了兩種解決方法,需要的朋友可以參考下2024-01-01

