项目地址:
https://github.com/FateSolo/Dubbo-Test
目录:
- 0. 序
- 1. Maven构建项目
- 2. Gradle构建项目
- 3. 搭建Spring + Dubbo框架
- 4. 支持RESTful Remoting
- 5. Dubbo服务集群
- 6. ZooKeeper集群
- 7. Nginx + Tomcat集群
- 8. Redis共享session
前两章分别对注册中心ZooKeeper和服务提供者dubbo-server做了集群测试,在本章将用Nginx + Tomcat对服务消费者dubbo-client进行集群。
1. 集群配置总览:
本机ip:192.168.16.1,部署Nginx反向代理服务器、服务消费者dubbo-client、服务提供者dubbo-server。
虚拟机ip:192.168.16.152,部署三个ZooKeeper节点、服务消费者dubbo-client、服务提供者dubbo-server。
2. dubbo-client打包:
1) 在BookController类中增加一个方法:1
2
3
4@RequestMapping(value = "/info", method = RequestMethod.GET)
public String getInfo(HttpServletRequest request) {
return request.getLocalAddr();
}
2) 在dubbo-client目录下,键入如下命令:1
gradle build
在dubbo-client/build/libs目录下已经生成了war包。
3. 项目部署:
1) 确认dubbo-server和dubbo-client配置文件里注册中心地址的正确性。
虚拟机端:1
<dubbo:registry address="zookeeper://127.0.0.1:2181?backup=127.0.0.1:2182,127.0.0.1:2183"/>
本机端:1
<dubbo:registry address="zookeeper://192.168.16.152:2181?backup=192.168.16.152:2182,192.168.16.152:2183"/>
2) 部署ZooKeeper集群:1
2
3./zookeeper-1/bin/zkServer.sh start
./zookeeper-2/bin/zkServer.sh start
./zookeeper-3/bin/zkServer.sh start
3) 部署本机和虚拟机的dubbo-server:1
java -jar dubbo-server-1.0-SNAPSHOT.jar
4) 部署本机和虚拟机的dubbo-client,将项目放在Tomcat的webapps下,随后启动两个Tomcat即可。
5) 查看dubbo-admin,此时dubbo-server和dubbo-client都已经有了来自本机和虚拟机的服务提供者和服务消费者。
4. 部署Nginx:
1) 打开nginx目录下的conf/nginx.conf,在http中增加如下配置:1
2
3
4upstream dubbo-client {
server 192.168.16.1:8080 weight=2;
server 192.168.16.152:8080 weight=1;
}
更改server中的根location:1
2
3
4
5location / {
#root html;
#index index.html index.htm;
proxy_pass http://dubbo-client;
}
2) 启动Nginx即可,此时访问本机80端口将被反向代理至两个Tomcat上,负载均衡策略为本机:虚拟机=2:1。
5. 集群测试:
1) 连续访问http://192.168.16.1/dubbo-client/book/info ,将得到如下两个结果:1
192.168.16.1
192.168.16.152
并且出现的比例固定为2:1。
2) 关掉其中一个Tomcat,再次访问,需要很长时间才请求成功。
问题出在此时其中一个Tomcat宕机后,Nginx仍然将请求转发至该Tomcat,因此持续等待至Nginx默认超时时间后才重新转发至另一台Tomcat。
因此打开nginx.conf,在server的根location中增加如下配置:1
proxy_connect_timeout 3;
重启Nginx,再次访问,问题解决。
作者 [@FateSolo]
2017 年 06月 05日