跟我学SpringCloud | 第十七篇:服务网关Zuul基于Apollo动态路由
目录
Springboot: 2.1.7.RELEASE
SpringCloud: Greenwich.SR2
上一篇文章我们介绍了Gateway基于Nacos动态网关路由的解决方案
Apollo概述
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
Apollo支持4个维度管理Key-Value格式的配置:
- application (应用)
- environment (环境)
- cluster (集群)
- namespace (命名空间)
Apollo相比于Spring Cloud Config优势
前面的文章我们也介绍了Spring Cloud Config
- 启动主类Chapter16Application.java如下:
代码清单:chapter16/src/main/java/com/springcloud/chapter16/Chapter16Application.java
***@SpringBootApplication @EnableEurekaClient @EnableZuulProxy @EnableApolloConfig public class Chapter16Application { public static void main(String[] args) { SpringApplication.run(Chapter16Application.class, args); } }
其中
@EnableZuulProxy
表示开启Zuul网关代理,@EnableApolloConfig
表示开启Apollo配置。- 路由刷新
代码路径:chapter16/src/main/java/com/springcloud/chapter16/config/ZuulProxyRefresher.java
***@Component public class ZuulProxyRefresher implements ApplicationContextAware { private ApplicationContext applicationContext; @Autowired private RouteLocator routeLocator; @ApolloConfigChangeListener(value = "zuul-config-apollo") public void onChange(ConfigChangeEvent changeEvent) { boolean zuulProxyChanged = false; for (String changedKey : changeEvent.changedKeys()) { if (changedKey.startsWith("zuul.")) { zuulProxyChanged = true; break; } } if (zuulProxyChanged) { refreshZuulProxy(changeEvent); } } private void refreshZuulProxy(ConfigChangeEvent changeEvent) { this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys())); this.applicationContext.publishEvent(new RoutesRefreshedEvent(routeLocator)); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
@ApolloConfigChangeListener(value = "zuul-config-apollo")
中value的默认参数是application
,因为这里我们自定义了namespace,所以需要指定,我们使用@ApolloConfigChangeListener
监听Apollo的配置下发,有配置更新时会调用refreshZuulProxy()
刷新路由信息。- 测试
我们启动Client-Apollo工程和Zuul-Apollo工程,打开浏览器访问:http://localhost:9091/client/hello ,页面可以正常显示,我们在Apollo中修改路由信息,具体如图:
修改完后点击发布,待发布成功后,我们刷新浏览器,之前的路由访问已经报错404,我们使用修改过后的路由http://localhost:9091/client_new/hello ,页面可以正常显示
Hel