SpringCloud微服务Zuul网关动态路由
这篇文章不止是普通的动态路由,他可以帮你将zuul网关由静态路由升级为动态路由,还可以在路由之后,再将利用自定义规则实现同一个URL请求根据用户(或者别的属性)访问到不同的服务中。
我在的公司是个半外包的公司,想做成一个产品但是又要满足不同客户的不同需求。采用微服务拆分所有业务模块,每一个业务模块根据不同的客户可能会有不同的场景。对于前端请求和后端服务间相互调用来说,不可能因为一个模块新增了一种业务场景就重写或者修改一次代码。于是就想,同一个模块的所有场景能否用同一个URL来请求,根据客户不同来请求不同的服务的接口。这样就有了这两个动态路由和场景选择。
源码在这里:动态路由源码 ,这个项目是我的微服务脚手架项目,基于eureka-zuul构建的。
zuul动态路由
1. 网关层动态配置路由映射规则
动态配置与网上其他文章的思路是一样的,继承org.springframework.cloud.netflix.zuul.filters.SimpleRouteLocator
重写locateRoutes
方法并实现org.springframework.cloud.netflix.zuul.filters.RefreshableRouteLocator
接口的refresh
方法。
SimpleRouteLocator
是zuul基础路由加载类,初始化的时候自动将配置文件中配置的路由规则加载到内存中,重写locateRoutes
方法将路由规则配置改为自定义的源。RefreshableRouteLocator
接口仅提供刷新路由表的方法,实现很简单。
代码如下:
/**
* 动态路由实现
* @author 無痕剑
* @date 2018/11/15 22:05
*/
public class DynamicRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {
/**
* 是否启用动态路由。
* 在配置文件中:saas.routes.dynamic.enabled,默认为false
*/
private boolean enabled;
public DynamicRouteLocator(boolean enabled, String servletPath, ZuulProperties properties) {
super(servletPath, properties);
this.enabled = enabled;
}
/**
* 重载路由规则
*/
@Override
protected Map<String, ZuulProperties.ZuulRoute> locateRoutes() {
if (!enabled) {
return super.locateRoutes();
}
Map<String, ZuulProperties.ZuulRoute> routeMap = new HashMap<>();
// 从数据源获取路由配置