击上方蓝色“程序员白楠楠”,选择“设为星标”

作者:松下听泉

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

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=8081dubbo.registry.address=zookeeper://localhost:2181dubbo.protocol.name=dubbodubbo.protocol.port=20880dubbo.registry.timeout=30000dubbo.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@Componentpublic 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

@RestControllerpublic 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进行日志追踪

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

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

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

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

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

  3. dubbo protocol port 消费者端_企业级 SpringBoot 与 Dubbo 的并用

    点击上方"匠心零度",选择"设为星标" 做积极的人,而不是积极废人 作者:SimpleWu cnblogs.com/SimpleWu/p/10833555.ht ...

  4. dubbo protocol port 消费者端_Dubbo源码:搞定URL,就走完了进度条的一半

    Dubbo 中的 URL 大家都知道,在互联网领域,每个信息资源都有统一的且在网上唯一的地址,该地址就叫 URL(Uniform Resource Locator,统一资源定位符),它是互联网的统一资 ...

  5. dubbo protocol port 消费者端_Dubbo 优雅停机演进之路

    一.前言 在 『ShutdownHook- Java 优雅停机解决方案』 一文中我们聊到了 Java 实现优雅停机原理.接下来我们就跟根据上面知识点,深入 Dubbo 内部,去了解一下 Dubbo 如 ...

  6. 游戏服务端开发-全局唯一ID

    结构 | PlatId (10bit) | ServerId (12bit) | UnixTime(s) (32bit) | IncreaseId (10bit) | | 平台id (10bit) | ...

  7. maven整合@data注解_SpringBoot 整合 Dubbo实践(实用文章)

    作者:Cott 来源:https://www.cnblogs.com/cott/p/12373043.html 1.选择ZooKeeper作为注册中心 在linux环境中使用docker安装ZooKe ...

  8. Dubbo 提供者和消费者

    一.说明 Dubbo官方建议将服务接口.服务模型.服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP). ...

  9. springboot整合dubbo之多注册中心配置(服务提供者和消费者均配置 2.7.0版本)

    一开始之前怎么配置都不能运行,会绕过远程连接的地址直接去链接127.0.0.1:2181这个地址,一直报错.再换回去单注册中心还是会一直多连一个莫须有的注册中心一直一直启动不开.类似于下面这样 ,因为 ...

最新文章

  1. 初探可编程网关 Pipy
  2. PowerDesigner小技巧
  3. PowerDesigner建立UML序列图
  4. mysql scope runtime_Maven依赖scope属性详解-一个报错引发的问题 - 老郭种树
  5. java登录界面_java实现登陆页面
  6. 贪婪算法+小应用(调度问题)
  7. python3.6找到不_sqlite3模块
  8. 光(复振幅)在自由空间中传播的matlab仿真——傅里叶光学方法
  9. Setup Factory安装结束自动启动程序
  10. 在线计算机系统考试测试题,最新计算机考试题库及答案.docx
  11. 【菜gou的CS61A学习笔记10 Abstraction Trees】
  12. 高盛发布区块链报告:从理论到实践(中文版)三
  13. 微信小程序app.json全局配置项
  14. android 禁用触摸屏,animation时禁用所有触摸屏交互
  15. 【Xilinx】Spartan 7上手指南(ARTY S7开发板)
  16. Winsock Fix for Windows 7
  17. 大数据如此火爆 如何看待大数据行业发展趋势
  18. Oracle Chp3 复杂查询 key point:数据分页;子查询;表连接;集合运算符
  19. 多普达 699之不完全新手须知
  20. 渗透测试笔记(三)——SQL注入攻击及防御(1)

热门文章

  1. Linux源码编译(一):从头文件说起
  2. 凸优化问题工具包cvxpy安装
  3. java数据结构编程_Java数据结构编程
  4. [云炬python3玩转机器学习笔记] 3-12 数据加载和简单的数据探索
  5. GitHub如何下载单个文件夹
  6. python代码物理_利用python求解物理学中的双弹簧质能系统详解
  7. 2020-10-29
  8. c语言一整行一整行读取文件
  9. Android新建项目选择SDK的区别
  10. 如何写windows系统已保护的内存区域