Dubbo学习笔记 七:Nginx + Tomcat集群


项目地址:
https://github.com/FateSolo/Dubbo-Test

目录:

前两章分别对注册中心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
4
upstream dubbo-client {
server 192.168.16.1:8080 weight=2;
server 192.168.16.152:8080 weight=1;
}

更改server中的根location:

1
2
3
4
5
location / {
#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日