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,应该会有个优先