一. 需求分析
业务流程如下:
1、管理员进入管理界面点击“页面发布”,前端请求cms页面发布接口。
2、cms页面发布接口执行页面静态化,并将静态化页面(html文件)存储至GridFS中。
3、静态化成功后,向消息队列发送页面发布的消息。
4、消息队列负责将消息发送给各各服务器上部署的Cms Client(Cms客户端)。
在服务器上部署Cms Client(Cms客户端),客户端接收消息队列的通知。
5、每个接收到页面发布消息的Cms Client从GridFS获取Html页面文件,并将Html文件存储在本地服务器。
二. 分析
发布一个页面,需发布到该页面所属的每个站点服务器,其它站点服务器不发布。
比如:发布一个门户的页面,需要发布到每个门户服务器上,而用户中心服务器则不需要发布。
采用routing模式,用站点id作为routingKey,这样就可以匹配页面只发布到所属的站点服务器上。
CmsClient根据页面发布消息的内容请求GridFS获取页面文件,存储在本地服务器。
页面发布流程图如下:
1、前端请求cms执行页面发布。
2、cms执行静态化程序生成html文件。
3、cms将html文件存储到GridFS中。
4、cms向MQ发送页面发布消息
5、MQ将页面发布消息通知给Cms Client
6、Cms Client从GridFS中下载html文件
7、Cms Client将html保存到所在服务器指定目录
三. 页面发布消费方
作为页面发布消费方,部署到多个服务器上,主要实现的功能是接收页面发布消息,从gridFS下载页面并保存到对应的服务器中.大体流程如下:
1、将cms Client部署在服务器,配置队列名称和站点ID。
2、cms Client连接RabbitMQ并监听各自的“页面发布队列”
3、cms Client接收页面发布队列的消息
4、根据消息中的页面id从mongodb数据库下载页面到本地
其中,消息体内容是页面id,通过页面id,调用 dao查询页面信息,获取到页面的物理路径,调用dao查询站点信息,得到站点的物理路径,从GridFS查询静态文件内容,将静态文件内容保存到页面物理路径下。
代码实现:
1.pom
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐data‐mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons‐io</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
2.配置文件
server:
port: 31000
spring:
application:
name: xc‐service‐manage‐cms‐client
data:
mongodb:
uri: mongodb://root:123@localhost:27017
database: xc_cms
rabbitmq: