Spring Cloud的Zuul高可用的理解

之前做过一个项目,是将页面渲染都放在了zuul上,然后在zuul所在的微服务中用Feign去请求service层的数据。

这样一来,我其实没有用到Zuul的网关功能,所以我后来就Zuul给去掉了。。。

但是我部署的方式是分布式的,所以我打算想要把把它单独拿出来做负载均衡。

然后在四台服务器上各自放了一个Feign服务(之前叫Zuul服务的),本来应该有Zuul做负载均衡的,结果我的一个学长告诉我说,Zuul比不上Nginx,所以后来的结果就是我没有用Zuul。整个项目就把Zuul服务去掉了。。。

 

回头一想,不行啊,不是说Spring Cloud是做了一个完整的体系的么?负载均衡,门面啊,咋这坑呢?

 

然后我读了周立的《Spring Cloud与Docker微服务架构实战》,可能我的理解有点慢,所以思考了半天,有点眉目了。感觉网上也好多地方没有明说,也看到有人提问,但是没人回答。。。我想写一下。

 

以下是我的理解:

 

18年11月24日添加:

在Spring Cloud中国社区的QQ群内看各位大佬们聊天。结合自己脑袋里的一点东西,想到一个完整的思路。

思路〇:

  • 在最外部,做Nginx的负载均衡。这里知道所有zuul服务的地址。可以把请求分发到正确的zuul中。
  • 再加上Zuul做服务网关,这里做zuul的路由功能,以及鉴权的任务。
    • 可以加一个过滤器方面的功能。通过借助网关的特点,还可以做对外部的其他应用调用Mysql,Redis这些东西的鉴权。或者说路由
    • 建议是把zuul之后的东西放在内网访问。如果非要跨越千山万水,那就加上view模块里的Feign和Freemarker。减少网络开销。而且如果对鉴权不是很感冒的话,直接把Zuul去掉就好了。简单粗暴
  • 接下来是Feign或者Ribbon部分。这里做数据的请求,包装的这些工作。这里对其他数据服务的包装作用,把不同位置的数据整合到一块来,同一个服务里可以请求SaaS那儿的数据,还可以去拿自己写的数据服务。这里有Hystrix需要注意。
    • 在这一级,Feign可以有俩种类型,一种是专门提供rest风格的数据接口展现
    • 另一种是结合Freemarker方面的东西,做页面渲染。在这里有个css,js,pic这些的静态资源。如果有条件可以把这些放在cdn里面,那速度,美滋滋。
    • 不过我以前经历过一个事儿!就是pic本来是动态生成的!但是cdn非要给你优化,程序员给那些图片的名字都是一样一样的!然后所有人下载证书的时候,都下载成了一个人的。。。。。。我被拉过去做了一个多月的客服,一直搞不清楚这是为啥。那边擅自做了cdn,我们不知道的情况下,那几天头都炸了!
  • 最后边需要开发的就是涉及Mybatis部分的内容了。这一层比较容易了,针对某个数据库去做一个服务,每个表做个Dao。
    • 至于其他地方的数据调用的话,就不要放在这一层了。网络开销尽量少一点吧。这里还是好好的放在内网里,让自家的Feign或者Ribbon部分去调用就好了。

 

思路一:

Zuul是分为俩部分,一个是Zuul的服务端,另一个是Zuul的客户端。他们都是注册在Eureka这样的注册中心上的。

  1. Zuul客户端,对外网公开的

    设想为只部署一个。只做到Zuul服务端的路由功能。负责负载均衡和向Eureka注册的功能。不做过滤器,和到其他服务的路由。这个地方用到的东西尽量少一点。不求达到Nginx的水平,但是减少多余的处理。而且不做验证,如果可以,关闭到除了路由以外的其他步骤。这样子就不用外边加一个单独的Nginx了。
  2. Zuul服务端,针对于内网中的

    做一些必要的路由和过滤器,服务端设立的出发点就是要部署多个,以达到高可用的目的。在这个部分,可以加上页面渲染的模块。也就是把Ribbon层或者Feign层加到这里面来,在这个服务中加上Freemarker来渲染数据。在同一个服务中处理这部分内容,减少http请求中的网络耗时。

现在再思考一下,觉得这个方法可能有些不靠谱。因为这样子相当于增加了一个外部的模块开发。有些多次一举的感觉了。

不过呢,zuul这里的思路,就是把其中的一个zuul作为负载均衡。不用Nginx的前提下对外公开的那种。那样子可以把鉴权,路由到其他地方的功能加到那个Zuul里面。只要负载均衡不至于被影响,那应该也是可以做为一个备选方案的。

 

思路二:

这个是我之前用过的方法,但是我觉得有点子坑。

就是把Zuul只作为一个整体,不分服务端客户端啥的,该做的都正常的做。做路由,做过滤,加Ribbon或者Feign,做Freemarker渲染。

这里也需要吧Zuul注册到Eureka上,毕竟里面有用到路由和Ribbon或者Feign。

将这个服务部署到多个服务器上,或者部署到多个端口上,通过主服务器上的Nginx做负载均衡。。。

这是我去年做的一个项目的方法。

 

以上是我的思路,如果有什么问题,还请指出。可以一起讨论一下。没准能闹出个非常方便的思路

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值