springboot整合dubbo设置全局唯一ID进行日志追踪
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进行日志追踪相关推荐
- springboot整合dubbo_springboot整合dubbo设置全局唯一ID进行日志追踪
1.新建项目 利用idea创建一个父项目,三个子项目,其中一个项目为生产者,一个项目为消费者,一个为接口等公共服务项目,生产者和消费者需要有web依赖,可以作为tomcat容器启动. 2.项目依赖 & ...
- dubbo protocol port 消费者端_springboot整合dubbo设置全局唯一ID进行日志追踪
击上方蓝色"程序员白楠楠",选择"设为星标" 作者:松下听泉 出处:https://blog.csdn.net/weixin_39427718 1.新建项目 利 ...
- springboot项目创建全局唯一id生成器
springboot项目创建全局唯一id生成方法,参考 Snowflake算法 yml文件 #app 全局唯一id生成 app:idGenerator:workerId: 1datacenterId: ...
- ef设置非自增长id_今日学习必备:分布式系统全局唯一ID你懂吗?
一 什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息, ...
- Springboot整合Dubbo简单示例
Springboot 整合dubbo: 1 简介 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的 ...
- SpringBoot整合Dubbo的三种(配置)
SpringBoot整合Dubbo的三种方式 1.使用application.properties 1.提供者 2.消费者 2.使用dubbo.xml 1.提供者 2.消费者 3.使用注解配置 1.提 ...
- java产生全局唯一的int类型_全局唯一ID设计
在分布式系统中,经常需要使用全局唯一ID查找对应的数据.产生这种ID需要保证系统全局唯一,而且要高性能以及占用相对较少的空间. 全局唯一ID在数据库中一般会被设成主键,这样为了保证数据插入时索引的快速 ...
- 阿里P8架构师谈:分布式系统全局唯一ID简介、特点、5种生成方式
什么是分布式系统唯一ID 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识. 如在金融.电商.支付.等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据 ...
- SpringBoot整合Dubbo+Zookeeper进行分布式搭建系统
QUESTIONl:SpringBoot整合Dubbo+Zookeeper进行分布式搭建系统? ANSWER: 一:创建项目模块 1.1.创建一个Empty Project 名称:Dubbo 1.2. ...
最新文章
- 常见SMT极性元器件识别方法(图解)
- 腾讯---生成格雷码
- 信息学奥赛一本通(2024:【例4.10】末两位数)
- 关于go访问rabbitmq的连接池
- 【原】==与isEqual的比较
- 微信小程序自定义字体及自定义图标问题说明
- 晶振时钟原理图、PCB设计指南
- 线性代数基本公式结论简要总结(1)
- C语言测量平差课程设计,测量平差课程设计-20210419024415.docx-原创力文档
- python爬虫学习之爬取169图片网站
- 全球及中国焦磷酸钠行业“十四五”规划建议与创新环境分析报告2022-2028年版
- Function的含义
- 服务器性能管理系统,服务器系统性能管理是什么
- 用html写箭头的原理,5个编写高质量箭头函数的最佳实践
- 恢复通讯录显示服务器开小差,手机通讯录误删除怎么恢复?教你几招一看就会...
- 怎么使用迅捷文字转语音软件转换文字
- 动手练一练,用纯 CSS 制作一款侧滑显示留言面板的网页组件
- 闲鱼疯转 6800 份!大厂内部数据分析资料首次公开!
- 一个家最好的投资:陪伴
- 老男孩教育 | 从0基础小白到年薪25w+,他是如何逆风翻盘的?
热门文章
- C++实现二维快速傅里叶变换(FFT)
- 传输层 TCP UPD 应用场景
- 用Pytest+Allure生成漂亮的HTML图形化测试报告
- http://www.dewen.net.cn/q/14879/搜索引擎结果自动跳转
- 【平衡树】 [HNOI2012]永无乡
- SSD与HDD、HHD的区别
- html点击除某个元素之外的元素的事件添加技巧
- 关于R语言中时间类POSIXct和POSIXlt的一点儿学习收获
- 信用卡客户风险评估-聚类分析实验报告(python)
- 华米2020,硬件继续去小米化、加强健康数据服务探索