SSM(十二) dubbo日志插件
来源:互联网 发布:java httpconnection 编辑:程序博客网 时间:2024/05/16 09:53
SSM(十二) dubbo日志插件
前言
在之前dubbo分布式框架中讲到了如何利用dubbo来搭建一个微服务项目。其中还有一些值得优化提高开发效率的地方,比如日志:
当我们一个项目拆分为N多个微服务之后,当其中一个调用另一个服务出现了问题,首先第一步自然是查看日志。
出现问题的有很多情况,如提供方自身代码的问题,调用方的姿势不对等。
自身的问题这个管不了,但是我们可以对每一个入参、返回都加上日志,这样首先就可以判断调用方是否姿势不对了。
为了规范日志已经后续的可扩展,我们可以单独提供一个插件给每个项目使用即可。
效果如下:
12345678910111213
2017-04-25 15:15:38,968 DEBUG [com.alibaba.dubbo.remoting.transport.DecodeHandler] - [DUBBO] Decode decodeable message com.alibaba.dubbo.rpc.protocol.dubbo.DecodeableRpcInvocation, dubbo version: 2.5.3, current host: 127.0.0.12017-04-25 15:15:39,484 DEBUG [com.crossoverJie.dubbo.filter.DubboTraceFilter] - dubbo请求数据:{"args":[1],"interfaceName":"com.crossoverJie.api.UserInfoApi","methodName":"getUserInfo"}2017-04-25 15:15:39,484 INFO [com.crossoverJie.api.impl.UserInfoApiImpl] - 用户查询Id=12017-04-25 15:15:39,505 DEBUG [org.mybatis.spring.SqlSessionUtils] - Creating a new SqlSession2017-04-25 15:15:39,525 DEBUG [org.mybatis.spring.SqlSessionUtils] - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6f56b29] was not registered for synchronization because synchronization is not active2017-04-25 15:15:39,549 DEBUG [org.mybatis.spring.transaction.SpringManagedTransaction] - JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@778b3121] will not be managed by Spring2017-04-25 15:15:39,555 DEBUG [com.crossoverJie.api.dubbo.dao.T_userDao.selectByPrimaryKey] - ==> Preparing: select id, username, password,roleId from t_user where id = ?2017-04-25 15:15:39,591 DEBUG [com.crossoverJie.api.dubbo.dao.T_userDao.selectByPrimaryKey] - ==> Parameters: 1(Integer)2017-04-25 15:15:39,616 DEBUG [com.crossoverJie.api.dubbo.dao.T_userDao.selectByPrimaryKey] - <== Total: 12017-04-25 15:15:39,616 DEBUG [com.alibaba.druid.pool.PreparedStatementPool] - {conn-10003, pstmt-20000} enter cache2017-04-25 15:15:39,617 DEBUG [org.mybatis.spring.SqlSessionUtils] - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6f56b29]2017-04-25 15:15:45,473 INFO [com.crossoverJie.dubbo.filter.DubboTraceFilter] - dubbo执行成功2017-04-25 15:15:45,476 DEBUG [com.crossoverJie.dubbo.filter.DubboTraceFilter] - dubbo返回数据{"args":[{"id":1,"password":"123456","roleId":1,"userName":"crossoverJie"}],"interfaceName":"com.crossoverJie.api.UserInfoApi","methodName":"getUserInfo"}
dubbo filter拓展
参考官方文档,我们可以通过
1234567891011
## 定义实体首先定义一个实体类用于保存调用过程中的一些数据:```javapublic class FilterDesc {private String interfaceName ;//接口名private String methodName ;//方法名private Object[] args ;//参数//省略getter setter}
DubboTraceFilter具体拦截逻辑
1234567891011121314151617181920212223242526272829303132333435363738
999)(group = Constants.PROVIDER, order = -public class DubboTraceFilter implements Filter{private static final Logger logger = LoggerFactory.getLogger(DubboTraceFilter.class);public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {try {FilterDesc filterReq = new FilterDesc() ;filterReq.setInterfaceName(invocation.getInvoker().getInterface().getName());filterReq.setMethodName(invocation.getMethodName()) ;filterReq.setArgs(invocation.getArguments());logger.debug("dubbo请求数据:"+JSON.toJSONString(filterReq));Result result = invoker.invoke(invocation);if (result.hasException() && invoker.getInterface() != GenericService.class){logger.error("dubbo执行异常",result.getException());}else {logger.info("dubbo执行成功");FilterDesc filterRsp = new FilterDesc() ;filterRsp.setMethodName(invocation.getMethodName());filterRsp.setInterfaceName(invocation.getInvoker().getInterface().getName());filterRsp.setArgs(new Object[]{result.getValue()});logger.debug("dubbo返回数据"+JSON.toJSONString(filterRsp));}return result ;}catch (RuntimeException e){logger.error("dubbo未知异常" + RpcContext.getContext().getRemoteHost()+ ". service: " + invoker.getInterface().getName() + ", method: " + invocation.getMethodName()+ ", exception: " + e.getClass().getName() + ": " + e.getMessage(), e);throw e ;}}}
逻辑非常简单,只是对调用过程、异常、成功之后打印相应的日志而已。
但是有个地方要注意一下:
需要在resource
目录下加上META-INF.dubbo/com.alibaba.dubbo.rpc.Filter
文件。
1
dubboTraceFilter=com.crossoverJie.dubbo.filter.DubboTraceFilter
目录结构如下:
12345678910
src|-main|-java|-com|-xxx|-XxxFilter.java (实现Filter接口)|-resources|-META-INF|-dubbo|-com.alibaba.dubbo.rpc.Filter (纯文本文件,内容为:xxx=com.xxx.XxxFilter)
总结
该项目已经托管到GitHub:
https://github.com/crossoverJie/SSM-DUBBO-FILTER
使用方法
安装
1
cd /SSM-DUBBO-FILTER
1
mvn clean
1
mvn install
使用
在服务提供的项目中加上依赖,这样每次调用都会打上日志。
12345
<dependency><groupId>com.crossoverJie</groupId><artifactId>SSM-TRACE-FILTER</artifactId><version>1.0.0</version></dependency>
在拦截器中最好不要加上一些耗时任务,需要考虑到性能问题。
项目地址:https://github.com/crossoverJie/SSM.git
个人博客地址:http://crossoverjie.top。
GitHub地址:https://github.com/crossoverJie。
阅读全文
0 0
- SSM(十二) dubbo日志插件
- SSM(十二) dubbo日志插件
- Dubbo+Zookeeper集成SSM
- ssm dubbo 分布式商城
- dubbo 日志
- SSM综合项目实战(TTSC) -- day02 Dubbo注册中心,通用Mapper,分页插件
- dubbo学习笔记 十二 dubbo-cluster
- Dubbo分布式日志追踪
- dubbo-插件化
- dubbo插件机制
- 【Dubbo三】SSM集成Dubbo+Zookeeper实现服务化
- SSM整合+Dubbo+zookeeper-3.4.6
- SSM(十一) 基于dubbo的分布式架构
- SSM(十一) 基于dubbo的分布式架构
- SSM(十三) 将dubbo暴露出HTTP服务
- SSM(十一) 基于dubbo的分布式架构
- SSM(十三) 将dubbo暴露出HTTP服务
- dubbo改造旧工程(ssm/ssh)
- 安卓的滑动事件
- 纪念校招第一次面试夭折
- butterKnife注解框架
- WHU暑假集训总结&&新学期展望
- 数据库三范式
- SSM(十二) dubbo日志插件
- 如何看技术类型的书籍,并从中学到自己想要的知识?
- jQuery控制单选与复选按钮
- sensor的skipping and binning 模式
- SSM(十四) 基于annotation的http防重插件
- 湖南省第十三届省赛总结
- 通俗易懂的解释什么是CDN
- appium自动化获取信息命令集合
- 测试入门之软件的生命周期