你的位置:首页 > 软件开发 > Java > 第十一章 企业项目开发

第十一章 企业项目开发

发布时间:2016-03-01 01:00:10
注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2)代码的github地址:https://github.com/zhaojigang/ssmm0 消息队列是分布式系统中实现RPC的一种手段。1、消息队列的基本使用流程假设:我们有这样一个需求,当每注册一 ...

注意:本章代码基于 第十章 企业项目开发--分布式缓存Redis(2)

代码的github地址:https://github.com/zhaojigang/ssmm0

 

消息队列是分布式系统中实现RPC的一种手段。

1、消息队列的基本使用流程

假设:

  • 我们有这样一个需求,当每注册一个admin的之后,就写一条日志log数据到数据库

分析:

  • 在实际中,我们是不会把日志直接写入数据库的,因为日志数据通常是庞大的,而且日志的产生是频繁的,如果我们使用数据库存储日志,哪怕是使用异步存储,也是极耗性能的。在企业中,对于日志的处理方式很多,比较简单的一种是,日志直接产生于nginx或后端服务器(eg.resin),我们写一个定时任务,每隔一段时间,将产生的日志文件使用shell和Python进行正则过滤,取出有用信息,之后进行处理统计,最后将处理后的数据写入数据库。

在这里我们作为演示,,每当注册一个admin的之后,我们异步写一条日志log数据到数据库。

下边的举例也是对代码的解释。

  • server1:部署ssmm0-userManagement
  • server2:部署ssmm0-rpcWeb
  • server3:部署消息队列服务器

当server1执行一个"http://localhost:8080/admin/register?username=canglang25&password=1457890"操作,即向数据库插一条admin信息时,同时将日志log信息写入server3,之后不会等待log信息被server2消费掉就直接返回(异步);

server2循环接收server3中的消息队列中的消息,并将这些log消息写入数据库。

 

2、消息队列的作用

  • 异步
  • 解耦:server1(消息生产者服务器)和server3(消息消费者服务器)没有直接联系
  • 削峰填谷:当大量请求涌入应用服务器时,应用服务器如果处理不过来,就将这些请求先放入队列,之后再从队列中取出请求慢慢处理(秒杀的一种处理方式)

 

3、消息队列的两种方式

  • P2P
    • 消息生产者产生的消息只能由一个消息消费者消费
    • 基于队列queue
    • 执行流程
      • 生产者:创建连接工厂-->创建连接-->启动连接-->创建session-->创建队列,创建生产者,创建消息-->发送消息
      • 消费者:创建连接工厂-->创建连接-->启动连接-->创建session-->创建队列,创建消费者-->接收消息
  • 发布-订阅
    • 消息生产者产生的消息可以由所有订阅了(监听了)该消息的消费者消费
    • 基于主题topic
    • 执行流程
      • 生产者:创建连接工厂-->创建连接-->启动连接-->创建session-->创建topic,创建消息发布者,创建消息-->发布消息
      • 消费者:创建连接工厂-->创建连接-->启动连接-->创建session-->创建topic,创建消息订阅者-->消息订阅者通过**接收消息

 

4、实例(基于P2P实现)

4.1、整体代码结构:

第十一章 企业项目开发

 

4.2、模块依赖关系

第十一章 企业项目开发

注:箭头的指向就是当前模块所依赖的模块。(eg.rpcWeb依赖data)

  • userManagement:用户管理模块--war
  • rpcWeb:rpc测试模块(这里用于模拟接收处理消息的应用)--war
  • cache:缓存模块--jar
  • rpc:rpc模块(包含mq/mina/netty)--jar
  • data:数据处理模块--jar
  • common:通用工具类模块--jar

 

4.3、代码

代码整体没变,只列出部分新增代码,完整代码从文首的github进行clone即可。

4.3.1、ssmm0

pom.第十一章 企业项目开发第十一章 企业项目开发

  <!-- 管理子模块 -->  <modules>    <module>common</module><!-- 通用类模块 -->    <module>cache</module><!-- 缓存模块 -->    <module>rpc</module><!-- rpc模块 -->    <module>data</module><!-- 封装数据操作 -->    <module>userManagement</module><!-- 具体业务1-人员管理系统,这里的userManagement部署在serverA上(配合rpcWeb测试rpc) -->    <module>rpcWeb</module><!-- 具体业务2-用于测试RPC的另一台机器,这里的rpcWeb项目部署在serverB上 -->  </modules>      <!-- 日志:若没有,activemq获取连接报错 -->      <dependency>        <groupId>org.slf4j</groupId>        <artifactId>slf4j-log4j12</artifactId>        <version>1.5.11</version>      </dependency>

原标题:第十一章 企业项目开发

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录