zuul网关实现问题和总结
1: zuul如何做网关。大家百度一下。有很多例子。比如这篇就很不错的介绍了用法
https://blog.****.net/zhouhao88410234/article/details/88927686
2:我要介绍的是,我们系统实现网关遇到的问题。
我们的系统之前是使用启动的时候,用配置文件进行加载路由的。
本次改造。我们把配置放到数据库中进行了数据库的加载。
由于之前的系统是比较稳定的。所以如果重构后,加了个切换开关,如果开关是走数据库的配置。
我们就切到重构后的代码,走数据库的。如果开关是是走配置的。我们就调用老的代码。走启动的配置路由。
继承的路由加载是这样写的。本来以为这样写就可以了。
后来发现取配置的时候,源码中把启动配置中的路由和数据库中的进行了合并。这个是进行了路由合并的地方。
routelocators 中除了我们自己写的路由定位器,还有程序自动给我们加载的。DiscoveryClientRouteLocator 这个类就是罪魁祸首。这个路由定位器是我们不需要的。就是他会进行路由的合并。发现这个问题后。我们就开始想办法不加载这个类。发现启动压根无法进行排除。所以我们决定重写这个类。里面啥也不干。具体上代码。
a : 启动类中
@SpringBootApplication(scanBasePackages = "com.gateway",exclude = {ZuulProxyAutoConfiguration.class})
b: 程序自动加载这个配置,然后继承ZuulProxyAutoConfiguration
@Configuration public class MyZuulProxyAutoConfiguration extends ZuulProxyAutoConfiguration { @Autowired protected ZuulProperties zuulProperties; @Bean public DiscoveryClientRouteLocator discoveryRouteLocator() { return new NopDiscoveryClientRouteLocator(null, null, zuulProperties, null, null); } }
c: 重写DiscoveryClientRouteLocator 路由
public class NopDiscoveryClientRouteLocator extends DiscoveryClientRouteLocator { public NopDiscoveryClientRouteLocator(String servletPath, DiscoveryClient discovery, ZuulProperties properties, ServiceRouteMapper serviceRouteMapper, ServiceInstance localServiceInstance) { super(servletPath, discovery, properties, serviceRouteMapper, localServiceInstance); } @Override public void addRoute(String path, String location) { } @Override public void addRoute(ZuulRoute route) { } @Override public void refresh() { } @Override public List<Route> getRoutes() { return new ArrayList<>(); } @Override public Collection<String> getIgnoredPaths() { return new ArrayList<>(); } @Override public Route getMatchingRoute(String path) { return null; } @Override public int getOrder() { return 0; } @Override public void setOrder(int order) { } @Override protected LinkedHashMap<String, ZuulRoute> locateRoutes() { return new LinkedHashMap<>(); } @Override protected String mapRouteToService(String serviceId) { return null; } @Override protected void addConfiguredRoutes(Map<String, ZuulRoute> routes) { } @Override protected Map<String, ZuulRoute> getRoutesMap() { return new HashMap<>(); } @Override protected Route getSimpleMatchingRoute(String path) { return null; } @Override protected ZuulRoute getZuulRoute(String adjustedPath) { return null; } @Override protected Route getRoute(ZuulRoute route, String path) { return null; } @Override protected void doRefresh() { } @Override protected boolean matchesIgnoredPatterns(String path) { return false; } }