1.新建项目


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

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 {@Overridepublic 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);@Overridepublic String getName() {LOGGER.info("provider ThreadName : "+Thread.currentThread().getName());return "dubbo-test";}
}

5.编写消费者

5.1编写消费者filter

public class DubboFilter implements Filter {@Overridepublic 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;}
}

请求结果


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

生产者线程名称:

消费者线程名称:

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

springboot整合dubbo设置全局唯一ID进行日志追踪相关推荐

  1. springboot整合dubbo_springboot整合dubbo设置全局唯一ID进行日志追踪

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

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

    击上方蓝色"程序员白楠楠",选择"设为星标" 作者:松下听泉 出处:https://blog.csdn.net/weixin_39427718 1.新建项目 利 ...

  3. springboot项目创建全局唯一id生成器

    springboot项目创建全局唯一id生成方法,参考 Snowflake算法 yml文件 #app 全局唯一id生成 app:idGenerator:workerId: 1datacenterId: ...

  4. ef设置非自增长id_今日学习必备:分布式系统全局唯一ID你懂吗?

    一 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...

  5. Springboot整合Dubbo简单示例

    Springboot 整合dubbo: 1 简介 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的 ...

  6. SpringBoot整合Dubbo的三种(配置)

    SpringBoot整合Dubbo的三种方式 1.使用application.properties 1.提供者 2.消费者 2.使用dubbo.xml 1.提供者 2.消费者 3.使用注解配置 1.提 ...

  7. java产生全局唯一的int类型_全局唯一ID设计

    在分布式系统中,经常需要使用全局唯一ID查找对应的数据.产生这种ID需要保证系统全局唯一,而且要高性能以及占用相对较少的空间. 全局唯一ID在数据库中一般会被设成主键,这样为了保证数据插入时索引的快速 ...

  8. 阿里P8架构师谈:分布式系统全局唯一ID简介、特点、5种生成方式

    什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据 ...

  9. SpringBoot整合Dubbo+Zookeeper进行分布式搭建系统

    QUESTIONl:SpringBoot整合Dubbo+Zookeeper进行分布式搭建系统? ANSWER: 一:创建项目模块 1.1.创建一个Empty Project 名称:Dubbo 1.2. ...

最新文章

  1. 常见SMT极性元器件识别方法(图解)
  2. 腾讯---生成格雷码
  3. 信息学奥赛一本通(2024:【例4.10】末两位数)
  4. 关于go访问rabbitmq的连接池
  5. 【原】==与isEqual的比较
  6. 微信小程序自定义字体及自定义图标问题说明
  7. 晶振时钟原理图、PCB设计指南
  8. 线性代数基本公式结论简要总结(1)
  9. C语言测量平差课程设计,测量平差课程设计-20210419024415.docx-原创力文档
  10. python爬虫学习之爬取169图片网站
  11. 全球及中国焦磷酸钠行业“十四五”规划建议与创新环境分析报告2022-2028年版
  12. Function的含义
  13. 服务器性能管理系统,服务器系统性能管理是什么
  14. 用html写箭头的原理,5个编写高质量箭头函数的最佳实践
  15. 恢复通讯录显示服务器开小差,手机通讯录误删除怎么恢复?教你几招一看就会...
  16. 怎么使用迅捷文字转语音软件转换文字
  17. 动手练一练,用纯 CSS 制作一款侧滑显示留言面板的网页组件
  18. 闲鱼疯转 6800 份!大厂内部数据分析资料首次公开!
  19. 一个家最好的投资:陪伴
  20. 老男孩教育 | 从0基础小白到年薪25w+,他是如何逆风翻盘的?

热门文章

  1. C++实现二维快速傅里叶变换(FFT)
  2. 传输层 TCP UPD 应用场景
  3. 用Pytest+Allure生成漂亮的HTML图形化测试报告
  4. http://www.dewen.net.cn/q/14879/搜索引擎结果自动跳转
  5. 【平衡树】 [HNOI2012]永无乡
  6. SSD与HDD、HHD的区别
  7. html点击除某个元素之外的元素的事件添加技巧
  8. 关于R语言中时间类POSIXct和POSIXlt的一点儿学习收获
  9. 信用卡客户风险评估-聚类分析实验报告(python)
  10. 华米2020,硬件继续去小米化、加强健康数据服务探索