U8SDK——U8Server业务分离部署实践
经过几天的努力, 终于将U8Server逻辑一分为二, 分割为U8Server和U8ServerManager。 其中U8Server职责,负责登录认证和支付回调业务的处理;U8ServerManager负责后台管理逻辑的处理。同时,顺便将之前使用的Spring3和Hibernate3框架版本升级到了Spring4和Hibernate4版本。
分割逻辑之后, 根据我们之前说的,为了多个U8Server实例和U8ServerManager之间能够实现数据同步,同时减小Mysql数据库压力,提高U8Server并发处理能力,我们引入了Redis共享缓存组件。
虽然同步数据,我们也可以引入消息中间件组件来实现,比如之间已经有客户同学使用Redis的pub/sub来实现数据同步了,但是,相比于都需要引入一个组件成本,我们这里就彻底一些,直接使用Redis做共享缓存,因为除了缓存游戏,渠道,渠道商等数据,我们还将用户,订单等数据也一并进行缓存处理。
Spring已经将Redis API进行了抽象和封装, 在Spring框架中,使用Redis还是比较简单的。 同时,Redis的哨兵模式和集群模式,也得到比较好的支持,通过一些配置即可实现。
这些代码细节不再赘述, 这里我们主要来看下拆分之后,分开部署,然后通过nginx负载均衡,让u8server对于前端的访问透明化。
首先, 我们准备一下需要的基础工具:
1、安装两个Tomcat 7,IP地址和端口分别如下:
1 2 3 |
121.42.144.254:8080 (用来部署U8Server) 121.42.144.254:8087 (用来部署U8ServerManager) |
2、Redis 3.2.5版本 一个(这里我们暂时不采用哨兵和集群,只配置一个redis)
3、nginx 1.10.1
4、mysql 5.7
下面是配置步骤:
1、配置U8Server和U8ServerManager
我们配置U8Server和U8ServerManager中的jdbc.properties, 让其连接相同的mysql和redis
U8Server的jdbc.properties配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
u8server.base_url=http://121.42.144.254:8080 u8server.deploy_id=1 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/udb?useUnicode=true&characterEncoding=UTF-8 jdbc.username=u8sdkdemo jdbc.password=u8sdkdemo hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true hibernate.hbm2ddl.auto=update hibernate.current_session_context_class=thread c3p0.init_pool_size=10 c3p0.max_idle_time=300 c3p0.max_pool_size=50 c3p0.min_pool_size=10 c3p0.checkout_timeout=30000 c3p0.idle_conn_test_period=150 redis.hostName=121.42.144.254 redis.port=6379 redis.password=u8sdkdemo redis.maxIdle=100 redis.maxActive=300 redis.maxWaitMillis=60000 redis.testOnBorrow=false redis.testOnReturn=false redis.timeBetweenEvictionRunsMillis=60000 redis.minEvictableIdleTimeMillis=120000 redis.numTestsPerEvictionRun=-1 |
U8ServerManager的jdbc.properties配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/udb?useUnicode=true&characterEncoding=UTF-8 jdbc.username=u8sdkdemo jdbc.password=u8sdkdemo hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true hibernate.hbm2ddl.auto=update hibernate.current_session_context_class=thread c3p0.init_pool_size=10 c3p0.max_idle_time=300 c3p0.max_pool_size=50 c3p0.min_pool_size=10 c3p0.checkout_timeout=30000 c3p0.idle_conn_test_period=150 redis.hostName=127.0.0.1 redis.port=6379 redis.password=u8sdkdemo redis.maxIdle=100 redis.maxActive=300 redis.maxWaitMillis=60000 redis.testOnBorrow=false redis.testOnReturn=false redis.timeBetweenEvictionRunsMillis=60000 redis.minEvictableIdleTimeMillis=120000 redis.numTestsPerEvictionRun=-1 |
配置好了之后,我们分别编译U8Server和U8ServerManager,生成u8server.war和u8servermanager.war两个部署包
2、配置Tomcat,并部署
将u8server.war文件放到Tomcat1的webapp目录下, 将u8servermanager.war文件放到Tomcat2的webapp目录下
然后,我们分别将tomcat的根目录设置为这两个项目的目录, 打开Tomcat1/conf/server.xml文件, 在
1 2 |
<Context path="" docBase="u8server" debug="0" reloadable="true" crossContext="true" /> |
打开Tomcat2/conf/server.xml文件,除了将里面的8080等端口进行修改之外, 我们也在
1 2 |
<Context path="" docBase="u8servermanager" debug="0" reloadable="true" crossContext="true" /> |
3、配置Redis
这里我们仅仅配置一个Redis,Redis在我们这里仅仅作为缓存使用,所以,我们不需要开启他的持久化功能。 打开redis.conf配置文件
在里面找到:save 900 1等配置, 删掉, 并添加一条:save “”
然后,找到bind 127.0.0.1 改为 bind 127.0.0.1 121.42.144.254
4、配置nginx
为了让前端应用或者浏览器中访问无需关心后端U8Server实例的部署情况,我们这里采用nginx来做代理。
我们希望通过访问http://121.42.144.254/admin/index 可以访问到后台管理系统,访问http://121.42.144.254/user/getToken可以访问到登录认证接口。虽然这两个协议,已经在两个不同的Tomcat实例中
为了能够实现这样的效果, 我们需要根据访问URL来做针对性的代理匹配。 在后台管理系统U8ServerManager中, 所有请求的相对路径都是/admin和/analytics
,所以,我们根据URL的规则来匹配。 完整的代理配置如下,具体一些细节可以参考下面注释
nginx/conf.d/default.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
#Tomcat实例1,部署U8Server的 upstream web_app{ server 121.42.144.254:8080; } #Tomcat实例2,部署U8ServerManager的 upstream web_app2{ server 121.42.144.254:8087; } server { listen 80; server_name 121.42.144.254; root /www; index index.html index.htm index.php; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; location / { root html; #默认都代理到web_app对应的U8Server上 proxy_pass http://web_app; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forward-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 100m; } #代理之后,后台管理系统中的图片等文件需要指定一下路径 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { root /home/tomcat/apache-tomcat-7.0.70-2/webapps/u8servermanager; } #代理之后,后台管理系统中的css,js等文件需要指定一下路径 location ~ .*\.(js|css)$ { root /home/tomcat/apache-tomcat-7.0.70-2/webapps/u8servermanager; } #header.jsp头文件比较特殊,后台管理中,作为界面的引用存在的,这里单独映射一下 location /header.jsp{ root html; proxy_pass http://web_app2; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forward-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 100m; } #所有访问http://121.42.144.254/admin/*这样的地址,都代理到U8ServerManager location /admin { root html; proxy_pass http://web_app2; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forward-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 100m; } location /analytics { root html; proxy_pass http://web_app2; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forward-For $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 100m; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /www; try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } |
现在我们启动mysql,redis,两个tomcat和nginx来看一下访问效果, 看看能否正确访问到对应的地址。
U8Server上的协议测试:
1 2 3 |
http://121.42.144.254/user/getToken http://121.42.144.254/pay/getOrderID |
U8ServerManager上的协议测试:
1 2 |
http://121.42.144.254/admin/index (后台管理系统,用户名admin,密码admin) |
目前阿里云上上面这些演示地址,就是这样部署之后的效果了。
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=2136