设为首页 收藏本站
查看: 759|回复: 0

[经验分享] JavaWeb项目架构之Redis分布式日志队列

[复制链接]

尚未签到

发表于 2018-11-3 06:54:09 | 显示全部楼层 |阅读模式
  架构、分布式、日志队列,标题自己都看着唬人,其实就是一个日志收集的功能,只不过中间加了一个Redis做消息队列罢了。
DSC0000.jpg


前言

为什么需要消息队列?
  当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。
  比如我们系统中常见的邮件、短信发送,把这些不需要及时响应的功能写入队列,异步处理请求,减少响应时间。

如何实现?
  成熟的JMS消息队列中间件产品市面上有很多,但是基于目前项目的架构以及部署情况,我们采用Redis做消息队列。

为什么用Redis?
  Redis中list数据结构,具有“双端队列”的特性,同时redis具有持久数据的能力,因此redis实现分布式队列是非常安全可靠的。
  它类似于JMS中的“Queue”,只不过功能和可靠性(事务性)并没有JMS严格。Redis本身的高性能和"便捷的"分布式设计(replicas,sharding),可以为实现"分布式队列"提供了良好的基础。

提供者端
  项目采用第三方redis插件spring-data-redis,不清楚如何使用的请自行谷歌或者百度。
  redis.properties:
  

#redis 配置中心  
redis.host=192.168.1.180
  
redis.port=6379
  
redis.password=123456
  
redis.maxIdle=100
  
redis.maxActive=300
  
redis.maxWait=1000
  
redis.testOnBorrow=true
  
redis.timeout=100000
  

  redis配置:
  

      
  
  
  
  
  
  
  
  
  
  
  
  

  切面日志配置(伪代码):
  

/**  * 系统日志,切面处理类
  * 创建者 小柒2012
  * 创建时间 2018年1月15日
  */
  
@Component
  
@Scope
  
@Aspect
  
public>  

  @Autowired
  private RedisTemplate redisTemplate;
  //注解是基于swagger的API,也可以自行定义
  @Pointcut("@annotation(io.swagger.annotations.ApiOperation)")
  public void logPointCut() {
  

  }
  

  @Around("logPointCut()")
  public Object around(ProceedingJoinPoint point) throws Throwable {
  Object result = point.proceed();
  //把日志消息写入itstyle_log频道
  redisTemplate.convertAndSend("itstyle_log","日志数据,自行处理");
  return result;
  }
  
}
  

消费者端
  Redis配置:
  

      
  

  
  
  
  
  
  
  
  
  

  
  
  
  
  
  
  
  
  

  
  
  
  
  
  
  
  

  监听接口:
  

public interface MessageDelegateListener {  public void handleLog(Serializable message);
  
}
  

  监听实现:
  

public>@Override
  public void handleLog(Serializable message) {
  if(message == null){
  System.out.println("null");
  }else {
  //处理日志数据
  }
  }
  
}
  

Q&A


  •   【问题一】为什么使用Redis?
      上面其实已经有做说明,尽管市面上有许多很稳定的产品,比如可能大家会想到的Kafka、RabbitMQ以及RocketMQ。但是由于项目本身使用了Redis做分布式缓存,基于省事可行的原则就选定了Redis。

  •   【问题二】日志数据如何存储?
      原则上是不建议存储到关系数据库的,比如MySql,毕竟产生的日志数量是巨大的,建议存储到Elasticsearch等非关系型数据库。

  • 【问题三】切面日志收集是如何实现的?  切面日志需要引入spring-aspects相关Jar包,并且配置使Spring采用CGLIB代理 。

  开源项目源码(参考):https://gitee.com/52itstyle/spring-boot-mail
  作者: 小柒
  出处: https://blog.52itstyle.com
  分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-629980-1-1.html 上篇帖子: redis-cli 常见操作及命令 下篇帖子: redis-rdb-tools安装部署及使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表