1: zuul如何做网关。大家百度一下。有很多例子。比如这篇就很不错的介绍了用法
https://blog.csdn.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;
}
}