Zuul作为一个老牌的开源服务网关组件,动态路由对它来讲是一个十分必要的功能,毕竟我们不能随便重启服务网关,服务网关是一个微服务系统的大门,今天我们介绍的Zuul动态路由的解决方案来自于携程开源的配置中心Apollo。(了解源码可+求求: 1791743380) Apollo概述Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。 Apollo支持4个维度管理Key-Value格式的配置:
Apollo相比于Spring Cloud Config优势Spring Cloud Config的精妙之处在于它的配置存储于Git,这就天然的把配置的修改、权限、版本等问题隔离在外。通过这个设计使得Spring Cloud Config整体很简单,不过也带来了一些不便之处。
工程实战这里需要准备一个Apollo配置中心,具体如何构建Apollo配置中心我这里不多做介绍
代码清单:chapter16/pom.xml <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>${apollo-client.version}</version></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId></dependency>
app.properties如下: 代码清单:chapter16/src/main/resources/META-INF/app.properties app.id=123456789 这里配置的 application.yml如下: 代码清单:chapter16/src/main/resources/application.yml apollo: bootstrap: enabled: true namespaces: zuul-config-apollo Meta: http://localhost:8080 在Apollo上新建一个命名空间 其余的配置都配置在Apollo中,具体如图:
代码清单:chapter16/src/main/java/com/springcloud/chapter16/Chapter16Application.java @SpringBootApplication@EnableEurekaClient@EnableZuulProxy@EnableApolloConfigpublic class Chapter16Application { public static void main(String[] args) { SpringApplication.run(Chapter16Application.class, args); }} 其中
代码路径:chapter16/src/main/java/com/springcloud/chapter16/config/ZuulProxyRefresher.java @Componentpublic 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; }}
我们启动Client-Apollo工程和Zuul-Apollo工程,打开浏览器访问:http://localhost:9091/client/hello ,页面可以正常显示,我们在Apollo中修改路由信息,具体如图: 修改完后点击发布,待发布成功后,我们刷新浏览器,之前的路由访问已经报错404,我们使用修改过后的路由http://localhost:9091/client_new/hello ,页面可以正常显示 |
|
来自: 新用户32269360 > 《待分类》