}

传智播客旗下技术交流社区北京校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1 页面发布 1.1 技术方案 本项目使用MQ实现页面发布的技术方案如下: 1547088375.jpg
技术方案说明:
1、平台包括多个站点,页面归属不同的站点。
2、发布一个页面应将该页面发布到所属站点的服务器上。
3、每个站点服务部署cms client程序,并与交换机绑定,绑定时指定站点Id为routingKey。 指定站点id为routingKey就可以实现cms client只能接收到所属站点的页面发布消息。
4、页面发布程序向MQ发布消息时指定页面所属站点Id为routingKey,将该页面发布到它所在服务器上的cms client。
路由模式分析如下:
发布一个页面,需发布到该页面所属的每个站点服务器,其它站点服务器不发布。
比如:发布一个门户的页面,需要发布到每个门户服务器上,而用户中心服务器则不需要发布。
所以本项目采用routing模式,用站点id作为routingKey,这样就可以匹配页面只发布到所属的站点服务器上。

页面发布流程图如下:

1547088526(1).jpg
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保存到所在服务器指定目录

1.2 页面发布消费方 1.2.1需求分析
功能分析:
创建Cms Client工程作为页面发布消费方,将Cms Client部署在多个服务器上,它负责接收到页面发布 的消息后从 GridFS中下载文件在本地保存。
需求如下:
1、将cms Client部署在服务器,配置队列名称和站点ID。
2、cms Client连接RabbitMQ并监听各自的“页面发布队列”
3、cms Client接收页面发布队列的消息
4、根据消息中的页面id从mongodb数据库下载页面到本地

调用dao查询页面信息,获取到页面的物理路径,调用dao查询站点信息,得到站点的物理路径 页面物理路径=站点物理路径+页面物理路径+页面名称。
从GridFS查询静态文件内容,将静态文件内容保存到页面物理路径下。

1.2.2创建Cms Client工程
1、创建maven工程
pom.xml

[AppleScript] 纯文本查看 复制代码
 <?xml version="1.0" encoding="UTF‐8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0"      
    xmlns:xsi="http://www.w3.org/2001/XMLSchema‐instance"  
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
 [url]http://maven.apache.org/xsd/maven[/url]‐4.0.0.xsd">
     <parent>     
    <artifactId>xc‐framework‐parent</artifactId>   
      <groupId>com.xuecheng</groupId>  
       <version>1.0‐SNAPSHOT</version>  
       <relativePath>../xc‐framework‐parent/pom.xml</relativePath> 
    </parent>    
 <modelVersion>4.0.0</modelVersion> 
      <artifactId>xc‐service‐manage‐cms‐client</artifactId> 
      <dependencies>     
    <dependency>       
      <groupId>com.xuecheng</groupId>      
       <artifactId>xc‐framework‐model</artifactId>    
         <version>1.0‐SNAPSHOT</version>      
   </dependency>     
    <dependency>     
        <groupId>org.springframework.boot</groupId>    
         <artifactId>spring‐boot‐starter‐test</artifactId>   
          <scope>test</scope>  
       </dependency>       
  <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>

[AppleScript] 纯文本查看 复制代码
 <artifactId>fastjson</artifactId>       
  </dependency>    
 </dependencies>
   </project>

2、配置文件 在resources下配置application.yml和logback-spring.xml。 application.yml的内容如下:

[AppleScript] 纯文本查看 复制代码
server:  
 port: 31000 spring:  
 application: 
    name: xc‐service‐manage‐cms‐client 
  data:    
 mongodb:  
     uri:  mongodb://root:123@localhost:27017  
     database: xc_cms   rabbitmq:   
  host: 127.0.0.1  
   port: 5672  
   username: guest   
  password: guest  
   virtualHost: / xuecheng: 
  mq:   #cms客户端监控的队列名称(不同的客户端监控的队列不能重复) 
    queue: queue_cms_postpage_01   
  routingKey: 5a751fab6abb5044e0d19ea1 #此routingKey为门户站点ID

说明:在配置文件中配置队列的名称,每个 cms client在部署时注意队列名称不要重复  
3、启动类

[AppleScript] 纯文本查看 复制代码
@SpringBootApplication 
@EntityScan("com.xuecheng.framework.domain.cms")//扫描实体类 @ComponentScan(basePackages={"com.xuecheng.framework"})//扫描common下的所有类 @ComponentScan(basePackages={"com.xuecheng.manage_cms_client"}) public class ManageCmsClientApplication {   
  public static void main(String[] args) {   
      SpringApplication.run(ManageCmsClientApplication.class, args);  
   }   
}



分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马
关闭

站长推荐 上一条 /5 下一条