`
Swifie
  • 浏览: 10722 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

SpringCloud第十七篇:服务网关Zuul基于Apollo动态路由

 
阅读更多

Zuul作为一个老牌的开源服务网关组件,动态路由对它来讲是一个十分必要的功能,毕竟我们不能随便重启服务网关,服务网关是一个微服务系统的大门,今天我们介绍的Zuul动态路由的解决方案来自于携程开源的配置中心Apollo。(了解源码可+WX:  haiwabbc)

 

SpringCloud系列教程 | 第十七篇:服务网关Zuul基于Apollo动态路由
 

 

Apollo概述

Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。

Apollo支持4个维度管理Key-Value格式的配置:

  1. application (应用)
  2. environment (环境)
  3. cluster (集群)
  4. namespace (命名空间)

Apollo相比于Spring Cloud Config优势

Spring Cloud Config的精妙之处在于它的配置存储于Git,这就天然的把配置的修改、权限、版本等问题隔离在外。通过这个设计使得Spring Cloud Config整体很简单,不过也带来了一些不便之处。

功能点 Apollo 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

  1. 工程依赖pom.xml如下:

代码清单:chapter16/pom.xml

Java代码  收藏代码
  1. <dependency>  
  2.     <groupId>com.ctrip.framework.apollo</groupId>  
  3.     <artifactId>apollo-client</artifactId>  
  4.     <version>${apollo-client.version}</version>  
  5. </dependency>  
  6. <dependency>  
  7.     <groupId>org.springframework.cloud</groupId>  
  8.     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>  
  9. </dependency>  
  10. <dependency>  
  11.     <groupId>org.springframework.cloud</groupId>  
  12.     <artifactId>spring-cloud-starter-netflix-zuul</artifactId>  
  13. </dependency>  

 

  1. 配置文件

app.properties如下:

代码清单:chapter16/src/main/resources/META-INF/app.properties

Java代码  收藏代码
  1. app.id=123456789  

 这里配置的app.id是在Apollo中创建项目时配置的。

application.yml如下:

代码清单:chapter16/src/main/resources/application.yml

Java代码  收藏代码
  1. apollo:  
  2.   bootstrap:  
  3.     enabled: true  
  4.     namespaces: zuul-config-apollo  
  5.   Meta: http://localhost:8080  

 在Apollo上新建一个命名空间zuul-config-apollo

其余的配置都配置在Apollo中,具体如图:

 

SpringCloud系列教程 | 第十七篇:服务网关Zuul基于Apollo动态路由
 

 

  1. 启动主类Chapter16Application.java如下:

代码清单:chapter16/src/main/java/com/springcloud/chapter16/Chapter16Application.java

Java代码  收藏代码
  1. @SpringBootApplication  
  2. @EnableEurekaClient  
  3. @EnableZuulProxy  
  4. @EnableApolloConfig  
  5. public class Chapter16Application {  
  6.   
  7.     public static void main(String[] args) {  
  8.         SpringApplication.run(Chapter16Application.class, args);  
  9.     }  
  10.   
  11. }  

 其中@EnableZuulProxy表示开启Zuul网关代理,@EnableApolloConfig表示开启Apollo配置。

  1. 路由刷新

代码路径:chapter16/src/main/java/com/springcloud/chapter16/config/ZuulProxyRefresher.java

Java代码  收藏代码
  1. @Component  
  2. public class ZuulProxyRefresher implements ApplicationContextAware {  
  3.   
  4.     private ApplicationContext applicationContext;  
  5.   
  6.     @Autowired  
  7.     private RouteLocator routeLocator;  
  8.   
  9.     @ApolloConfigChangeListener(value = "zuul-config-apollo")  
  10.     public void onChange(ConfigChangeEvent changeEvent) {  
  11.         boolean zuulProxyChanged = false;  
  12.         for (String changedKey : changeEvent.changedKeys()) {  
  13.             if (changedKey.startsWith("zuul.")) {  
  14.                 zuulProxyChanged = true;  
  15.                 break;  
  16.             }  
  17.         }  
  18.         if (zuulProxyChanged) {  
  19.             refreshZuulProxy(changeEvent);  
  20.         }  
  21.     }  
  22.   
  23.     private void refreshZuulProxy(ConfigChangeEvent changeEvent) {  
  24.         this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys()));  
  25.         this.applicationContext.publishEvent(new RoutesRefreshedEvent(routeLocator));  
  26.     }  
  27.   
  28.     @Override  
  29.     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
  30.         this.applicationContext = applicationContext;  
  31.     }  
  32. }  

 @ApolloConfigChangeListener(value = "zuul-config-apollo")中value的默认参数是application,因为这里我们自定义了namespace,所以需要指定,我们使用@ApolloConfigChangeListener监听Apollo的配置下发,有配置更新时会调用refreshZuulProxy()刷新路由信息。

  1. 测试

我们启动Client-Apollo工程和Zuul-Apollo工程,打开浏览器访问:http://localhost:9091/client/hello ,页面可以正常显示,我们在Apollo中修改路由信息,具体如图:

 

SpringCloud系列教程 | 第十七篇:服务网关Zuul基于Apollo动态路由
 

 

修改完后点击发布,待发布成功后,我们刷新浏览器,之前的路由访问已经报错404,我们使用修改过后的路由http://localhost:9091/client_new/hello ,页面可以正常显示Hello, i am dev from apollo update.,测试成功,我们通过Apollo实现了Zuul的路由信息动态刷新。

分享到:
评论

相关推荐

    Spring Cloud 学习笔记.pdf

    Spring Cloud是一套微服务架构下的分布式系统解决方案,提供了在分布式系统环境下快速构建一些常见模式的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式...

    SpringCloud配置大全.pdf

    网关服务组件Zuul是一个开源的API网关服务器,可以动态路由、监控、弹性、安全等,集成了断路器Hystrix。API网关是微服务架构中的重要组件,它位于客户端和服务端之间,主要负责请求路由、负载均衡、权限校验等功能...

    Apollo整合zuul

    Apollo整合Zuul是将Apache Apollo配置中心与Netflix Zuul边缘服务框架相结合的过程,旨在实现微服务架构中的动态配置管理和路由转发。在这个过程中,我们可以利用Apollo的强大配置管理能力,为Zuul提供实时的、动态...

    SpringCloud思维导图

    11.Zuul路由网关 12.Gateway新一代网关 13.SpringCloud Config分布式配置中心 14.SpringCloud Bus
消息总线 15.SpringCloud Stream
消息驱动 16.SpringCloud Sleuth
分布式请求链路跟踪 17. Apollo配置中心 18....

    SpringCloud实战

    - **SpringCloud**:SpringCloud 是一套用于构建微服务架构的工具集,它提供了开箱即用的微服务解决方案,使得开发者能够轻松地构建分布式系统中的服务管理、配置管理、智能路由等功能。 - **微服务**:微服务架构...

    配置中心1

    【配置中心1】这篇文章主要介绍了如何在Windows系统上搭建基于携程Apollo的分布式配置中心,并结合Zuul实现动态路由的功能。Apollo配置中心是一款强大的配置管理工具,尤其适用于大型分布式系统的配置管理和更新。...

    Nepxion Discovery【探索】微服务企业级解决方案 V5.4.0.pdf

    • 支持Spring Cloud Gateway、Zuul网关和微服务三大模块的灰度发布和路由等一系列功能 兼容的Spring相关技术栈 • 兼容Spring Cloud Edgware版,兼容Spring Cloud Alibaba 1.5.x.RELEASE,兼容Spring Boot 1.5.x....

    fizz-gateway-community:Fizz网关是基于Java的微服务网关,可以实现热服务聚合,授权选择,服务脚本编码,在线测试,高性能路由,API审核管理和其他目的。 Fizz是基于Java异步框架WebFlux微服务网关,能够实现热服务编排,授权选择,脚本编码,在线测试,高性能路由,API审核等目的,强大的插件系统扩展,图形界面帮助企业API服务治理,减少中间Java中的Managerment API网关层胶水代码,降低编码占用,提高API服务稳定性安全性。

    Fizz Gateway是一个基于Java开发的微服务网关,能够实现热服务编排,自动授权选择,在线服务脚本编码,在线测试,高性能路由,API审核管理等目的,拥有强大的自定义插件系统可以自行扩展,并提供友好的图形化配置...

    微服务平台建设方案.docx

    - **Zuul**:Netflix 开发的 API 网关,与 Spring Cloud 集成度高,支持动态过滤器脚本机制。 - **Kong**:基于 Nginx 的高性能 API 网关,具有丰富的插件机制和良好的社区支持。 ##### 1.2.3 配置中心 配置中心...

    微服务架构技术栈指南.docx

    1. **服务网关Zuul**:作为智能路由和认证中心,Zuul在Netflix和Spring Cloud中均有广泛应用,具备动态可编程性,是构建微服务网关的理想选择。 2. **服务注册发现Eureka + Ribbon**:Eureka作为经过大规模验证的...

    spring-cloud 组件实现原理

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具集,它为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等...

    中国式微服务架构模拟案例.docx

    2. **配置服务**:使用了携程的Apollo作为统一配置中心,相比Spring Cloud Config,Apollo提供了更强大的动态配置管理能力。 3. **分布式调用链监控**:采用了大众点评的CAT,而非Spring Cloud Sleuth + Zipkin组合...

    第二代微服务电商项目实战笔记

    2. **SpringCloud2.x**: 基于SpringBoot设计的一套微服务解决方案,包括服务发现(Eureka)、API网关(Zuul)、客户端负载均衡(Ribbon)、服务调用(Feign)、服务降级/熔断/隔离(Hystrix)等功能。 3. **Eureka*...

    深度网关与集群企业级架构优化视频课程-网盘链接提取码下载 .txt

    课程内容包括了Eureka,EurekaServer高可用,Ribbon,Consul集群,Feign,Hystrix,Sentinel,Nginx模拟API网关,Zuul路由,SpringCloudGateway路由,网关限流算法,SCG网关,开源配置中心Apollo等等非常有提升性的...

    Dubbo支付系统源码.zip

    5. **网关(Gateway)**:可能采用Zuul或Spring Cloud Gateway作为统一的入口,负责路由转发、权限验证、限流等任务。 6. **数据库脚本**:可能包含初始化数据库的SQL脚本,用于创建支付相关的表结构,如订单表、...

    分布式集群电商平台搭建方案 代码

    6. **API网关**:Zuul或Spring Cloud Gateway作为统一入口,处理权限验证、限流、熔断等业务逻辑。 三、具体步骤 1. **服务拆分**:根据业务逻辑,将功能模块拆分为独立的服务,例如订单服务、商品服务、用户服务等...

    mendmix分布式架构 v1.4.2.zip

    6. **API网关**:如果包含Zuul或Spring Cloud Gateway,它们作为统一的入口,负责路由、认证、限流和过滤等功能,简化了后端服务的接口管理和安全控制。 7. **配置中心**:例如使用Spring Cloud Config或Apollo,...

    open-cloud微服务平台 v3.0.0.zip

    4. **配置中心**:如Spring Cloud Config或Apollo,集中管理所有服务的配置,实现动态配置更新。 5. **服务治理**:如Spring Cloud Netflix中的Hystrix,提供熔断、降级、隔离等机制,增强系统的容错能力。 6. **...

    一个可供中小团队参考的微服务架构技术栈

    1. **服务网关Zuul**:Zuul是Netflix开源的智能路由和过滤器网关,它可以实现认证、区域感知路由和动态配置。因其简单轻量、易于编程和扩展的特点,被许多公司如携程和拍拍贷采纳。与Kong或Nginx相比,虽然Zuul不...

Global site tag (gtag.js) - Google Analytics