springCloud(F版)(4)——zuul集群及顶层负载均衡

上一篇博文我们引入了zuul路由网关实现了对不同生产者服务集群的路由转发。不过真正系统发布时有以下问题:

1.zuul里的配置文件会暴露我们所有接口的信息,放在顶层不合适

2.毕竟落实了路由分发和过滤器功能,当接口很多的时候也是可能宕机的

其他考虑应该还有很多,我只是简单理解了一下。下面优化一下我上一个博文里的系统结构图,将来zuul集群化实现高可用,另外放一个顶层的负载均衡去访问下面的zuul集群。

项目源码和可执行jar包已上传到百度云盘备份:链接:https://pan.baidu.com/s/1QrfJbNUk9WAbRKf5ApoB7Q 密码:375p

 

springCloud(F版)(4)——zuul集群及顶层负载均衡_第1张图片

其实改造很简单,打包上一个博文里的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,那么这里的启动指令怕是要多敲好多字了。强迫症的话研究一下怎么把配置文件外置吧,我后续也会专门写博文教程去学习配置文件的问题。

springCloud(F版)(4)——zuul集群及顶层负载均衡_第2张图片

springCloud(F版)(4)——zuul集群及顶层负载均衡_第3张图片

如果没报错的话,那么恭喜你,一个zuul路由集群已经在注册中心注册了。

springCloud(F版)(4)——zuul集群及顶层负载均衡_第4张图片

三、再创建一个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 试试效果吧(反复刷新)。

springCloud(F版)(4)——zuul集群及顶层负载均衡_第5张图片

由于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

注册中心显示效果如图:

springCloud(F版)(4)——zuul集群及顶层负载均衡_第6张图片

可以看到我们一个小型的集群部署完成,所有系统注册成功。下面访问顶层负载均衡测试一下效果,浏览器输入:

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了。

 

你可能感兴趣的:(springCloud学习)