1. 项目架构
应用
manager-web 后台管理系统(activeMQ 更新商品,异步更新solr全文检索库,已经更新商品详情静态化页面)
portal-web 门户
search-web 搜索(solr 全文检索技术)
item-web 商品详情(redis缓存,页面静态化,)
cart-web 购物车(redis,多终端同步保存购物车)
order-web 订单()
SSO-web 单点登录系统(分布式session,jsonp请求验证token)
微服务如下
ContentCategoryService(消费者: manager-web)
ContentService(消费者: manager-web portal-web)
UserService(消费者: order-web sso-web )
ItemCatService(消费者: item-web cart-web manager-web)
ItemService(消费者: manager-web)
SearchService(消费者: search-web )
SearchItemService(消费者:manager-web )
OrderService(消费者: order-web )
2. 网络拓扑图
3. 系统部署分析
- Taotao-manager
- Taotao-manager-web
- Taotao-portal-web
- Taotao-content
- Taotao-search
- Taotao-search-web
- Taotao-item-web
- Taotao-sso
- Taotao-sso-web
- Taotao-cart-web
- Taotao-order
- Taotao-order-web
12个应用,每个应用2个集群,需要24台服务器。 24
Mysql 2(mycat 一主一备 读写分离)
Solr 7(三个Solr实例( 每个实例包括两个Core),组成一个SolrCloud。)
Redis 6(3个组成集群,一主一从,3*2=6)
图片服务器 2(FastDFS Tracker+Storage 1个组,两个成员,成员存放内容一致)
Nginx 2(负载均衡,反向代理,keepalive高可用)
注册中心 3(zookeeper 3台集群,Leader选举)
Activemq 2(Master/Slave 2台 高可用 共享存储原理 3台 负载均衡 Replicated LevelDB Store 基于zookeeper 选举)
共需要48台服务器。
4. 搭建伪分布式
服务器规划
域名规划
Tomcat热部署
可以使用maven实现tomcat热部署。Tomcat启动时 部署工程。
Tomcat有个后台管理功能,可以实现工程热部署。
配置方法:
第一步:需要修改tomcat的conf/tomcat-users.xml配置文件。添加用户名、密码、权限。
<role rolename="manager-gui" />
<role rolename="manager-script" />
<user username="tomcat" password="tomcat" roles="manager-gui, manager-script"/>
第二步:重新启动tomcat。
使用maven的tomcat插件实现热部署:
第一步:配置tomcat插件,需要修改工程的pom文件。
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8081</port>
<path>/</path>
<url>http://192.168.25.135:8080/manager/text</url>
<username>tomcat</username>
<password>tomcat</password>
</configuration>
</plugin>
</plugins>
</build>
第二步:使用maven命令进行部署。
tomcat7:deploy
tomcat7:redeploy
部署的路径是“/”会把系统部署到webapps/ROOT目录下。
部署工程跳过测试:
clean tomcat7:redeploy -DskipTests
工程部署
每个工程运行在不同的tomcat上,修改tomcat的端口号。
反向代理的配置
访问举例
- 用户访问 manager.taotao.com
- 通过域名配置 ,访问192.168.25.141:80
- 通过nginx反向代理
upstream manager.taotao.com {
server 192.168.25.137:8080;
}
跳转 : 192.168.25.137:8080(到达manager应用)
测试时使用域名访问网站,需要修改host文件。
所有的域名应该指向反向代理服务器。
192.168.25.141 manager.taotao.com
192.168.25.141 www.taotao.com
192.168.25.141 search.taotao.com
192.168.25.141 item.taotao.com
192.168.25.141 sso.taotao.com
192.168.25.141 cart.taotao.com
192.168.25.141 order.taotao.com
nginx反向代理的配置:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream manager.taotao.com {
server 192.168.25.137:8080;
}
upstream www.taotao.com {
server 192.168.25.137:8081;
}
upstream search.taotao.com {
server 192.168.25.137:8082;
}
upstream item.taotao.com {
server 192.168.25.138:8080;
}
upstream sso.taotao.com {
server 192.168.25.138:8081;
}
upstream cart.taotao.com {
server 192.168.25.139:8080;
}
upstream order.taotao.com {
server 192.168.25.139:8081;
}
server {
listen 80;
server_name manager.taotao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://manager.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.taotao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://www.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name search.taotao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://search.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name item.taotao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://item.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name sso.taotao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://sso.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name cart.taotao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://cart.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name order.taotao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://order.taotao.com;
index index.html index.htm;
}
}
}
5. 项目拓展
电商活动倒计时方案:
1、确定一个基准时间。可以使用一个sql语句从数据库中取出一个当前时间。SELECT NOW();
2、活动开始的时间是固定的。
3、使用活动开始时间-基准时间可以计算出一个秒为单位的数值。
4、在redis中设置一个key(活动开始标识)。设置key的过期时间为第三步计算出来的时间。
5、展示页面的时候取出key的有效时间。Ttl命令。使用js倒计时。
6、一旦活动开始的key失效,说明活动开始。
7、需要在活动的逻辑中,先判断活动是否开始。
秒杀方案:
1、把商品的数量放到redis中。
2、秒杀时使用decr命令对商品数量减一。如果不是负数说明抢到。
3、一旦返回数值变为0说明商品已售完。