Git地址
服务端实现代码路径:https://gitee.com/yicj/web-server1
客户端实现代码路径:https://gitee.com/yicj/web-client1
本文旨在实现一个简单的高可用方案。示例工程使用了Servlet模拟实现controller层对外提供服务,实际的项目中基本上都是SpringMVC的方式(或者Struts2)。当一个单体项目性能遇到瓶颈的时候,可以考虑部署水平复制进行扩展。说的通俗一点就是原来一个tomcat运行一个项目,现在运行多个tomcat,每个tomcat还是运行同样的一个项目。如果是正式环境,我推荐使用nginx来实现反向代理和负载均衡。如果你不想增加系统的复杂度,可以考虑使用zookeeper来实现服务的注册和发现,同样可以实现系统的高可用和负载均衡(这篇只是简单的随机算法,如果有具体的业务需要,修改服务发现的算法即可)。
一、服务端的实现
1.创建maven webapp项目,并添加相关依赖
2.使用了servlet注解,在3.0之后添加的新特性,避免了xml中的配置。必须使用修改web.xml为3.0(如果仍有错误提示,需要修改settings目录下的文件,将内容中的2.3修改为3.0)。
3.定义实体类User,模拟用户数据
4.定义控制层UserController,并模拟生成用户列表数据
servlet初始化加载的时候执行init方法,这时进行服务的注册。
5.服务注册过程,注册的原理就是将服务的IP地址和端口写入zookeeper的服务节点。
6.服务提供的配置信息conf.properties
7.本地服务运行使用jetty插件
二、客户端的实现
1.创建一个maven的Java项目,并添加相关依赖。
2.使用客户端发起调用请求,这里使用了2个工具类。
3.ZkUtil 服务发现的具体实现
4.HttpUtil 发送get请求
5.客户端同样也需要连接到zookeeper,需要zk的相关配置conf.properties
三、测试服务端和客户端的连通性。
1.启动本地zookeeper服务
2.启动web-server的服务,选中项目 -> 鼠标右键 -> Run As --> Maven build... ,在Goals中输入 jetty:run ,然后点击 Run 按钮即可。从日志中可以看到服务端口为8080.
3.为了模拟实际生产环境的多个运行环境。需要修改conf.properties中SERVER_IP_PORT=127.0.0.1:8081,pom.xml中<port>8081</port>。
4.修改完成后,安装上面的操作步骤再次启动服务。从日志中看出服务端口为8081.
5.再次修改上述2个文件的端口,修改为8082,并启动服务
6.执行客户端的main方法。从打印的日志可以看出,这3个服务提供者都有被调用。
所谓高可用就是任何一个服务宕机,服务调用依然能够正常返回。
客户端调用时,获取服务地址,使用的随机数。
这个地方可以按照实际的业务场景进行定制:比如轮询,使用一个变量,从0开始累加,到达最大值后重置为0,重新开始计算。