zuul的动态路由

主要继承以下的类,重写locateRoutes方法


在方法中加入自己的获取路由的方式 ,我这里是基于数据库配置




写完后注册到springioc容器中,这样zuul就会从数据库中获取路由的配置信息,手动刷新的需要调用zuul内部的事件通知机制来让zuul刷新配置



数据库中的路由设定



请求ccc/hello 转发到了client服务的hello上



调用刷新方法,会直接刷新配置



zuul简单认证

首先要创建一个认证授权服务


暂时不用shiro或者springsecurity,直接判定输入的用户名或者密码是否正确



返回的token就直接使用base64简单加密一下,过期之类的先不加入。接下来在zuul中加入pre过滤器,认证的主要逻辑如下

1、如果是 auth/login 请求则进行参数校验后放过

2、如果是 auth/check 请求也进行参数校验后放过

3、其他的请求需要进行token校验



这里之后肯定要加入缓存,不然每次请求太耗时了,不利于高并发,最后注入spring容器中



登录展示



校验token



请求时放在header中然后做认证校验



代码仓库

https://github.com/cdy1996/sample-springcloud/tree/zuul-dymamic





-----------------------------------------------

这边提一下我配置动态网关时出现的状况

1、加载数据库会加载两边

2、每30秒就会自动加载,即不需要自己调用刷新接口

那么这2个问题很简单,因为我们把zuul注册在eureka上,那么它每30秒就会去eureka的服务其上拉取数据,拉到后刚好也会触发刷新的接口,且zuul有两个事件监听器会触发我们配置的接口zuulRefreshListener和zuulDiscoverRefreshListener,具体触发时的栈可以看下面两张图,至于为什么又这两个监听器,我还未开始看源码,等我看了源码在告诉大家,或者有高人可以提前给我剧透一下。




3、如何配置serviceId对应的动态路由

这个问题可以很明确的,因为我们创建的实体类中有url也有serviceId,所以很明确是支持的,但是前提是我们的zuul要注册在erueka上,但是这样就会出项上面两个问题,如果想要彻底解决问题,还是建议通过springcloud config+spring bus来达到动态路由,自己来实现的话可能要对其源码非常熟知,难度较大(个人看法,大牛勿喷)。

最后附上用serviceId的路由配置,没有测试同时配置serivceId和url,应该会有个优先



Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐