日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

dubbo protocol port 消费者端_springboot整合dubbo设置全局唯一ID进行日志追踪

發(fā)布時(shí)間:2025/3/15 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dubbo protocol port 消费者端_springboot整合dubbo设置全局唯一ID进行日志追踪 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

擊上方藍(lán)色“程序員白楠楠”,選擇“設(shè)為星標(biāo)”

作者:松下聽(tīng)泉

出處:https://blog.csdn.net/weixin_39427718

1.新建項(xiàng)目


利用idea創(chuàng)建一個(gè)父項(xiàng)目,三個(gè)子項(xiàng)目,其中一個(gè)項(xiàng)目為生產(chǎn)者,一個(gè)項(xiàng)目為消費(fèi)者,一個(gè)為接口等公共服務(wù)項(xiàng)目,生產(chǎn)者和消費(fèi)者需要有web依賴,可以作為tomcat容器啟動(dòng)。

2.項(xiàng)目依賴

<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.6</version>
</dependency>

<!-- zk的依賴 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.6</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>

3.在facade項(xiàng)目中新建接口

4.編寫(xiě)生產(chǎn)者

4.1 增加dubbo配置

server.port=8081
dubbo.registry.address=zookeeper://localhost:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.registry.timeout=30000
dubbo.application.name=dubbo-provider-ll

4.2 編寫(xiě)生產(chǎn)者dubbo filter

public class ProviderFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Object threadName= invocation.getAttachment("ThreadName");
if(null!=threadName){
Thread thread = Thread.currentThread();
thread.setName(threadName.toString());
}
return invoker.invoke(invocation);
}
}

注意:此處Filter 是dubbo的filter,不是servlet的filter

這里代碼的目的是將從消費(fèi)端傳來(lái)的線程名稱設(shè)置為線程名稱

在resources目錄下新建META-INF/dubbo/com.alibaba.dubbo.rpc.Filter 文件
即新增目錄META-INF/dubbo和文件 com.alibaba.dubbo.rpc.Filter

在文件中增加,等號(hào)后面為實(shí)現(xiàn)dubbo filter的實(shí)現(xiàn)類路徑providerFilter=com.dubbo.spring.provider.filter.ProviderFilter

4.3編寫(xiě)dubbo生產(chǎn)者實(shí)現(xiàn)類

@Service(filter = {"providerFilter"})
public class DemoServiceImpl implements IDemoService {
public Logger LOGGER= LoggerFactory.getLogger(DemoServiceImpl.class);
@Override
public String getName() {
LOGGER.info("provider ThreadName : "+Thread.currentThread().getName());
return "dubbo-test";
}
}

5.編寫(xiě)消費(fèi)者

5.1編寫(xiě)消費(fèi)者filter

public class DubboFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String name = Thread.currentThread().getName();
invocation.setAttachment("ThreadName",name);
return invoker.invoke(invocation);
}
}

此處是將線程名稱放入到attachment中,attachment底層是hashmap,后續(xù)使用dubbo請(qǐng)求生產(chǎn)者時(shí),會(huì)把a(bǔ)ttachment給到生產(chǎn)者,故在生產(chǎn)中中可以通過(guò)key ThreadName來(lái)獲取消費(fèi)者端的線程名稱在resources目錄下新建META-INF/dubbo/com.alibaba.dubbo.rpc.Filter 文件
即新增目錄META-INF/dubbo和文件 com.alibaba.dubbo.rpc.Filter

在文件中增加,等號(hào)后面為實(shí)現(xiàn)dubbo filter的實(shí)現(xiàn)類路徑consumerFilter=com.dubbo.spring.consumer.filter.DubboFilter

5.2 編寫(xiě)response對(duì)象

public class Response implements Serializable {

private static final long serialVersionUID = -3186818832535757509L;
private String code;

private String message;

private Object result;

private String index;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public Object getResult() {
return result;
}

public void setResult(Object result) {
this.result = result;
}

public String getIndex() {
return index;
}

public void setIndex(String index) {
this.index = index;
}
}

此response為web端返回到頁(yè)面統(tǒng)一對(duì)象

5.3 編寫(xiě)aop切面

@Aspect
@Component
public class AopContext {

@Before("execution(* com.dubbo.spring..*.*(..))")
public void before(){
Thread thread = Thread.currentThread();
thread.setName(UUIDUtil.getUUID());
}
@Around("execution(* com.dubbo.spring..*.*(..))")
public Object around(ProceedingJoinPoint pjp){
Response response=new Response();
try {
Object proceed = pjp.proceed();
if(proceed instanceof Response){
response=(Response) proceed;
response.setIndex(Thread.currentThread().getName());
}
} catch (Throwable throwable) {
throwable.printStackTrace();
}
return response;
}
}

1.before是在請(qǐng)求進(jìn)入時(shí)給線程設(shè)置名稱,為隨機(jī)生成的uuid
2.around是環(huán)繞通知,在執(zhí)行完之后,在返回的結(jié)果中將線程名稱設(shè)置進(jìn)去,便于以后異常追蹤

5.4 編寫(xiě)web

@RestController
public class WebController {

private Logger LOGGER= LoggerFactory.getLogger(WebController.class);

@Reference(filter = {"consumerFilter"})
private IDemoService iDemoService;

@GetMapping("/getName")
public Response getName(){
LOGGER.info("consumer ThreadName : "+Thread.currentThread().getName());
String name = iDemoService.getName();
Response response=new Response();
response.setResult(name);
response.setCode("1001");
response.setMessage("success");
return response;
}
}

請(qǐng)求結(jié)果


此處為postman響應(yīng)的,index 為1ca55cb7a17148879923265b89102ccf

生產(chǎn)者線程名稱:
消費(fèi)者線程名稱:可以看到從web頁(yè)面到生產(chǎn)者,消費(fèi)者,都有一個(gè)全局唯一id進(jìn)行貫穿,如果在web頁(yè)面提示有異常時(shí),可以通過(guò)這個(gè)uuid進(jìn)行日志追蹤

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的dubbo protocol port 消费者端_springboot整合dubbo设置全局唯一ID进行日志追踪的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。