同为Spring Cloud服务网关组件的Spring Cloud Zuul在生产环境中使用更为广泛,那么它有没有方便的动态路由解决方案呢?答案当然是肯定的,Zuul作为一个老牌的开源服务网关组件,动态路由对它来讲是一个十分必要的功能,毕竟我们不能随便重启服务网关,服务网关是一个微服务系统的大门,今天我们介绍的Zuul动态路由的解决方案来自于携程开源的配置中心Apollo。(了解源码可+求求: 1791743380)
Apollo概述
Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。
Apollo支持4个维度管理Key-Value格式的配置:
- application (应用)
- environment (环境)
- cluster (集群)
- namespace (命名空间)
Apollo相比于Spring Cloud Config优势
前面的文章我们也介绍了Spring Cloud Config《跟我学SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh》,但是它和我们今天要使用的相比,又有什么劣势呢?
Spring Cloud Config的精妙之处在于它的配置存储于Git,这就天然的把配置的修改、权限、版本等问题隔离在外。通过这个设计使得Spring Cloud Config整体很简单,不过也带来了一些不便之处。
配置界面 | 一个界面管理不同环境、不同集群配置 | 无,需要通过git操作 | |
配置生效时间 | 实时 | 重启生效,或手动refresh生效 | Spring Cloud Config需要通过Git webhook,加上额外的消息队列才能支持实时生效 |
版本管理 | 界面上直接提供发布历史和回滚按钮 | 无,需要通过git操作 | |
灰度发布 | 支持 | 不支持 | |
授权、审核、审计 | 界面上直接支持,而且支持修改、发布权限分离 | 需要通过git仓库设置,且不支持修改、发布权限分离 | |
实例配置监控 | 可以方便的看到当前哪些客户端在使用哪些配置 | 不支持 | |
配置获取性能 | 快,通过数据库访问,还有缓存支持 | 较慢,需要从git clone repository,然后从文件系统读取 | |
客户端支持 | 原生支持所有Java和.Net应用,提供API支持其它语言应用,同时也支持Spring annotation获取配置 | 支持Spring应用,提供annotation获取配置 | Apollo的适用范围更广一些 |
工程实战
这里需要准备一个Apollo配置中心,具体如何构建Apollo配置中心我这里不多做介绍,大家可以参考Apollo的官方文档:https://github.com/ctripcorp/apollo/wiki
- 工程依赖pom.xml如下:
代码清单: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
这里配置的app.id
是在Apollo中创建项目时配置的。
application.yml如下:
代码清单:chapter16/src/main/resources/application.yml
apollo: bootstrap: enabled: true namespaces: zuul-config-apollo Meta: http://localhost:8080
在Apollo上新建一个命名空间zuul-config-apollo
。
其余的配置都配置在Apollo中,具体如图:
- 启动主类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 ,页面可以正常显示Hello, i am dev from apollo update.
,测试成功,我们通过Apollo实现了Zuul的路由信息动态刷新。
相关推荐
Spring Cloud是一套微服务架构下的分布式系统解决方案,提供了在分布式系统环境下快速构建一些常见模式的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...
Apollo整合Zuul是将Apache Apollo配置中心与Netflix Zuul边缘服务框架相结合的过程,旨在实现微服务架构中的动态配置管理和路由转发。在这个过程中,我们可以利用Apollo的强大配置管理能力,为Zuul提供实时的、动态...
11.Zuul路由网关 12.Gateway新一代网关 13.SpringCloud Config分布式配置中心 14.SpringCloud Bus 消息总线 15.SpringCloud Stream 消息驱动 16.SpringCloud Sleuth 分布式请求链路跟踪 17. Apollo配置中心 18....
网关服务组件Zuul是一个开源的API网关服务器,可以动态路由、监控、弹性、安全等,集成了断路器Hystrix。API网关是微服务架构中的重要组件,它位于客户端和服务端之间,主要负责请求路由、负载均衡、权限校验等功能...
3. **整合Zuul**:Zuul是Spring Cloud中的一个边缘服务组件,用于实现API网关功能,包括路由、过滤等。要将Apollo整合到Zuul,你需要在`apollo-zuul`项目的`pom.xml`文件中添加Eureka Client、Apollo Client、Spring...
- **SpringCloud**:SpringCloud 是一套用于构建微服务架构的工具集,它提供了开箱即用的微服务解决方案,使得开发者能够轻松地构建分布式系统中的服务管理、配置管理、智能路由等功能。 - **微服务**:微服务架构...
• 支持Spring Cloud Gateway、Zuul网关和微服务三大模块的灰度发布和路由等一系列功能 兼容的Spring相关技术栈 • 兼容Spring Cloud Edgware版,兼容Spring Cloud Alibaba 1.5.x.RELEASE,兼容Spring Boot 1.5.x....
Fizz Gateway是一个基于Java开发的微服务网关,能够实现热服务编排,自动授权选择,在线服务脚本编码,在线测试,高性能路由,API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并提供友好的图形化配置...
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等...
1. **服务网关Zuul**:作为智能路由和认证中心,Zuul在Netflix和Spring Cloud中均有广泛应用,具备动态可编程性,是构建微服务网关的理想选择。 2. **服务注册发现Eureka + Ribbon**:Eureka作为经过大规模验证的...
- **Zuul**:Netflix 开发的 API 网关,与 Spring Cloud 集成度高,支持动态过滤器脚本机制。 - **Kong**:基于 Nginx 的高性能 API 网关,具有丰富的插件机制和良好的社区支持。 ##### 1.2.3 配置中心 配置中心...
2. **配置服务**:使用了携程的Apollo作为统一配置中心,相比Spring Cloud Config,Apollo提供了更强大的动态配置管理能力。 3. **分布式调用链监控**:采用了大众点评的CAT,而非Spring Cloud Sleuth + Zipkin组合...
课程内容包括了Eureka,EurekaServer高可用,Ribbon,Consul集群,Feign,Hystrix,Sentinel,Nginx模拟API网关,Zuul路由,SpringCloudGateway路由,网关限流算法,SCG网关,开源配置中心Apollo等等非常有提升性的...
5. **网关(Gateway)**:可能采用Zuul或Spring Cloud Gateway作为统一的入口,负责路由转发、权限验证、限流等任务。 6. **数据库脚本**:可能包含初始化数据库的SQL脚本,用于创建支付相关的表结构,如订单表、...
2. **SpringCloud2.x**: 基于SpringBoot设计的一套微服务解决方案,包括服务发现(Eureka)、API网关(Zuul)、客户端负载均衡(Ribbon)、服务调用(Feign)、服务降级/熔断/隔离(Hystrix)等功能。 3. **Eureka*...
6. **API网关**:如果包含Zuul或Spring Cloud Gateway,它们作为统一的入口,负责路由、认证、限流和过滤等功能,简化了后端服务的接口管理和安全控制。 7. **配置中心**:例如使用Spring Cloud Config或Apollo,...
6. **API网关**:Zuul或Spring Cloud Gateway作为统一入口,处理权限验证、限流、熔断等业务逻辑。 三、具体步骤 1. **服务拆分**:根据业务逻辑,将功能模块拆分为独立的服务,例如订单服务、商品服务、用户服务等...
4. **配置中心**:如Spring Cloud Config或Apollo,集中管理所有服务的配置,实现动态配置更新。 5. **服务治理**:如Spring Cloud Netflix中的Hystrix,提供熔断、降级、隔离等机制,增强系统的容错能力。 6. **...
1. **服务网关Zuul**:Zuul是Netflix开源的智能路由和过滤器网关,它可以实现认证、区域感知路由和动态配置。因其简单轻量、易于编程和扩展的特点,被许多公司如携程和拍拍贷采纳。与Kong或Nginx相比,虽然Zuul不...