文章详情

1.新建项目

springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码

利用idea创建一个父项目,三个子项目,其中一个项目为生产者,一个项目为消费者,一个为接口等公共服务项目,生产者和消费者需要有web依赖,可以作为tomcat容器启动。

2.项目依赖

<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项目中新建接口

springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码

4.编写生产者

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 编写生产者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

这里代码的目的是将从消费端传来的线程名称设置为线程名称

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

在文件中增加,等号后面为实现dubbo filter的实现类路径
providerFilter=com.dubbo.spring.provider.filter.ProviderFilter

4.3编写dubbo生产者实现类

@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.编写消费者

5.1编写消费者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,后续使用dubbo请求生产者时,会把attachment给到生产者,故在生产中中可以通过key ThreadName来获取消费者端的线程名称
在resources目录下新建META-INF/dubbo/com.alibaba.dubbo.rpc.Filter 文件

即新增目录META-INF/dubbo和文件 com.alibaba.dubbo.rpc.Filter

在文件中增加,等号后面为实现dubbo filter的实现类路径
consumerFilter=com.dubbo.spring.consumer.filter.DubboFilter

5.2 编写response对象

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端返回到页面统一对象

5.3 编写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是在请求进入时给线程设置名称,为随机生成的uuid
2.around是环绕通知,在执行完之后,在返回的结果中将线程名称设置进去,便于以后异常追踪

5.4 编写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;
}
}

请求结果

springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码

此处为postman响应的,index 为1ca55cb7a17148879923265b89102ccf

生产者线程名称:

springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码

消费者线程名称:

springboot整合dubbo设置全局唯一ID进行日志追踪的示例代码

可以看到从web页面到生产者,消费者,都有一个全局唯一id进行贯穿,如果在web页面提示有异常时,可以通过这个uuid进行日志追踪

到此这篇关于springboot整合dubbo设置全局唯一ID进行日志追踪的文章就介绍到这了。

您可能感兴趣的文章:

  • springboot themaleaf 第一次进页面不加载css的问题
  • SpringBoot配置绑定方法详解
  • SpringBoot本地磁盘映射问题
  • SpringBoot参数校验与国际化使用教程
  • SpringBoot在yml配置文件中配置druid的操作
  • SpringBoot一个非常蛋疼的无法启动的问题解决
  • springboot中JSONObject遍历并替换部分json值
  • 在idea中显示springboot面板的方法

版权:版权申明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 70068002@qq.com 举报,一经查实,本站将立刻删除。

转载请注明出处:https://www.stntk.com/2600.html/dongtai/houduan/

相关推荐
php数据库怎样去重复的数据
当涉及到数据库去重功能时,PHP可以与数据库交互并执行相应的操作。以下是一个示例的PHP代码,用于从数据库中删除重复的记录并保留唯一的数据:…
头像
后端开发 2024-05-26
1,069
如何在 Python 中使用 try…else 块
在 Python 编程中,我们经常会遇到需要处理异常的情况。使用 try…except 块是一种常见的处理方法,它可以捕获和处理代码中可能出…
头像
后端开发 2024-05-26
1,353
php发送/显示 base64 编码图像
我需要向客户端发送一个 base64 编码的字符串。因此,我打开并读取服务器上的图像文件,对其进行编码并将该数据与 image/jpeg 内…
头像
后端开发 2024-05-26
11,560
php 生成条形码(支持任意php框架)
一:插件安装 在php中我们可以使用php-barcode-generator插件来生成条形码,php-barcode-generator插…
头像
后端开发 2024-05-26
1,020
如何在ThinkPHP6中使用队列技术
ThinkPHP 6(TP6)是一个流行的PHP框架,它提供了一些有用的工具和组件,其中之一就是队列(Queue)服务。队列是一种用于异步处…
头像
后端开发 2024-05-26
1,600
cURL error 60: SSL certificate problem: unable to get local issuer certificate 解决方法
fastadmin开发小程序登录功能报错: cURL error 60: SSL certificate problem: unable t…
头像
后端开发 2024-05-26
1,117
发表评论
暂无评论

还没有评论呢,快来抢沙发~

点击联系客服

在线时间:8:00-16:00

客服电话

400-888-8888

客服邮箱

70068002@qq.com

扫描二维码

关注微信公众号