上一篇博文我们引入了zuul路由网关实现了对不同生产者服务集群的路由转发。不过真正系统发布时有以下问题:
1.zuul里的配置文件会暴露我们所有接口的信息,放在顶层不合适
2.毕竟落实了路由分发和过滤器功能,当接口很多的时候也是可能宕机的
其他考虑应该还有很多,我只是简单理解了一下。下面优化一下我上一个博文里的系统结构图,将来zuul集群化实现高可用,另外放一个顶层的负载均衡去访问下面的zuul集群。
项目源码和可执行jar包已上传到百度云盘备份:链接:https://pan.baidu.com/s/1QrfJbNUk9WAbRKf5ApoB7Q 密码:375p
其实改造很简单,打包上一个博文里的zuul工程,运行两个做成路由集群,再创建一个zuul工程去专门做顶层的负载均衡。
一、mvn打包上一个博文中做好的zuul工程:
打包方法参考我之前的博文:https://blog.csdn.net/qq_15903671/article/details/81938934
二、运行zuul集群测试一下:
打包好之后开启Eureka server和两个生产者服务集群,指令上我前面的博文里找吧。然后启动我们新的zuul集群:
命令行进入工程根目录的target目录,输入指令 java -jar **.jar --server.port=8751
再开一个命令行进入相同路径,输入指令 java -jar **.jar --server.port=8752
不要粘贴我的指令。。。手敲。。。不然会有莫名其妙的字符出现在空格的位置,导致指令参数报错。其实配置文件里Eureka server什么的也都写死了,本地测试的时候如果按我教程上写的8761启动server不会报错,要是你DIY了注册中心端口,或者改了生产者服务集群的name,那么这里的启动指令怕是要多敲好多字了。强迫症的话研究一下怎么把配置文件外置吧,我后续也会专门写博文教程去学习配置文件的问题。
如果没报错的话,那么恭喜你,一个zuul路由集群已经在注册中心注册了。
三、再创建一个zuul工程去专门做顶层的负载均衡:
创建过程跟之前的zuul工程一样我就不截图了,命名叫balance,也放到testSpringCloud下(还是为了父pom.xml的引入)。
pom.xml和入口类**application.java引入依赖跟上一个博文一样,我就不赘述了。
修改配置文件application.properties,内容如下:
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
server.port: 8750
spring.application.name=balance
zuul.routes.client1.path=/balance/**
zuul.routes.client1.service-id=service-zuul
编译运行,浏览器输入 http://localhost:8750/balance/client1/hi?name=qftest&token=test 试试效果吧(反复刷新)。
由于zuul中我们写了token校验,会有一个ok的输出,我们可以在控制台看到两个zuul轮询的响应输出情况。
至此,我们得到了一个高可用的路由网关集群,一个顶层负载均衡,进一步完善了我们的系统结构。
为了测试一下我们的系统结构在分布式环境中的效果,我特意弄了四台笔记本做了一个简单的集群环境。
第一台专门做eureka server注册中心,端口8761
第二台运行service-client1:8762、service-client2:8764、service-zuul:8751
第三台运行service-client1:8763、service-client2::8765、service-zuul:8752
第四台专门做顶层负载均衡,端口8750
注册中心显示效果如图:
可以看到我们一个小型的集群部署完成,所有系统注册成功。下面访问顶层负载均衡测试一下效果,浏览器输入:
http://10.48.4.236:8750/balance/client1/hi?name=qftest&token=test
当然,IP和后面的接口都可以自己DIY,只要你开了相应的service接口就好。分布式部署的时候我的程序出了很大的bug,那就是注册中心里全是我的机器名而非ip,当zuul去注册中心取servic-client*的时候拿到的是对应接口的机器名+端口。。。蛋疼了,无法访问。。。
解决方法其实很简单,让注册中心知道你所有的service的ip就好,重新启动所有的service(client1和2还有zuul),启动的java -jar 指令最后面补一个配置参数进去--eureka.instance.prefer-ip-address=true,意思是把ip也注册进去。当然了,强迫症可以修改你的源码,在配置文件application.properties中把eureka.instance.prefer-ip-address=true写进去,就OK了。