前言

网关是流量请求的入口,在微服务架构中承担了非常重要的角色,网关高可用的重要性不言而喻。在使用网关的过程中,为了满足业务诉求,经常需要变更配置,比如流控规则、路由规则等等。因此,网关动态配置是保障网关高可用的重要因素。那么,Soul 网关又是如何支持动态配置的呢?

使用过 Soul 的同学都知道,Soul 的插件全都是热插拔的,并且所有插件的选择器、规则都是动态配置,立即生效,不需要重启服务。但是我们在使用 Soul 网关过程中,用户也反馈了不少问题

  • 依赖 zookeeper,这让使用 etcd、consul、nacos 注册中心的用户很是困扰
  • 依赖 redis、influxdb,我还没有使用限流插件、监控插件,为什么需要这些

因此,我们对 Soul 进行了局部重构,历时两个月的版本迭代,我们发布了 2.0 版本

  • 数据同步方式移除了对 zookeeper 的强依赖,新增 http 长轮询 以及 websocket
  • 限流插件与监控插件实现真正的动态配置,由之前的 yml 配置,改为 admin 后台用户动态配置

1.可能有人会问我,配置同步为什么不使用配置中心呢?

答:首先,引入配置中心,会增加很多额外的成本,不管是运维,而且会让 Soul 变得很重;另外,使用配置中心,数据格式不可控,不便于 soul-admin 进行配置管理。

2.可能还有人会问?动态配置更新?每次我查数据库,或者redis不就行了吗?拿到的就是最新的,哪里那么多事情呢?

答:soul作为网关,为了提供更高的响应速度,所有的配置都缓存在JVM的Hashmap中,每次请求都走的本地缓存,速度非常快。所以本文也可以理解为分布式环境中,内存同步的三种方式。

原理分析

先来张高清无码图,下图展示了 Soul 数据同步的流程,Soul 网关在启动时,会从从配置服务同步配置数据,并且支持推拉模式获取配置变更信息,并且更新本地缓存。而管理员在管理后台,变更用户、规则、插件、流量配置,通过推拉模式将变更信息同步给 Soul 网关,具体是 push 模式,还是 pull 模式取决于配置。关于配置同步模块,其实是一个简版的配置中心。

Soul数据同步流程图

在 1.x 版本中,配置服务依赖 zookeeper 实现,管理后台将变更信息 push 给网关。而 2.x 版本支持 webosocket、http、zookeeper,通过 soul.sync.strategy 指定对应的同步策略,默认使用 http长轮询同步策略,可以做到秒级数据同步。但是,有一点需要注意的是,soul-web 和 soul-admin 必须使用相同的同步机制。

如下图所示,soul-admin 在用户发生配置变更之后,会通过 EventPublisher 发出配置变更通知,由 EventDispatcher 处理该变更通知,然后根据配置的同步策略(http、weboscket、zookeeper),将配置发送给对应的事件处理器

  • 如果是 websocket 同步策略,则将变更后的数据主动推送给 soul-web,并且在网关层,会有对应的 WebsocketCacheHandler 处理器处理来处 admin 的数据推送
  • 如果是 zookeeper 同步策略,将变更数据更新到 zookeeper,而 ZookeeperSyncCache 会监听到 zookeeper 的数据变更,并予以处理
  • 如果是 http 同步策略,soul-web 主动发起长轮询请求,默认有 90s 超时时间,如果 soul-admin 没有数据变更,则会阻塞 http 请求,如果有数据发生变更则响应变更的数据信息,如果超过 60s 仍然没有数据变更则响应空数据,网关层接到响应后,继续发起 http 请求,反复同样的请求
  • Soul配置同步策略流程图

zookeeper同步

基于 zookeeper 的同步原理很简单,主要是依赖 zookeeper 的 watch 机制,soul-web 会监听配置的节点,soul-admin 在启动的时候,会将数据全量写入 zookeeper,后续数据发生变更时,会增量更新 zookeeper 的节点,与此同时,soul-web 会监听配置信息的节点,一旦有信息变更时,会更新本地缓存

zookeeper节点设计

soul 将配置信息写到zookeeper节点,是通过精细设计的。

websocket同步

websocket 和 zookeeper 机制有点类似,将网关与 admin 建立好 websocket 连接时,admin 会推送一次全量数据,后续如果配置数据发生变更,则将增量数据通过 websocket 主动推送给 soul-web

使用websocket同步的时候,特别要注意断线重连,也叫保持心跳。soul使用java-websocket 这个第三方库来进行websocket连接。

public class WebsocketSyncCache extends WebsocketCacheHandler { /** * The Client. */ private WebSocketClient client; public WebsocketSyncCache(final SoulConfig.WebsocketConfig websocketConfig) { ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, SoulThreadFactory.create("websocket-connect

zookeeper 网关_多图,5000 字分享,API 网关如何实现配置动态更新?相关推荐

  1. api商品分享源码_谈谈微服务中的 API 网关(API Gateway)

    在本篇文章中,我们就一起来探讨一下 API 网关在整个微服务分布式架构中的一个作用. # 背景我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的系统他们可以自成体系, ...

  2. 华为管理学案例分析_管理学论文5000字如何高质量写作

    攻读管理学专业的学生,在开始写作毕业论文之前,首先要确保自身满足两方面的要求.其一是有不错的写作功底,以便从容应对管理学论文内容写作.其二是有扎实专业基础知识,才能通过总结分析得出研究观点,确定好论文 ...

  3. 计算机未来的发展趋势三百字,数字媒体毕业论文5000字_大专毕业论文5000字_计算机类毕业论文5000字文库...

    求视觉传达毕业论文5000字 设计-天涯问答 [摘要]本文在对视觉传达设计师各个创作阶段进行了详细分析的基础上,从视觉传达设计师的非数字化创作时期及数字化创作时期出发,将个人创作的完全独立时期.合作创 ...

  4. python实训报告5000字_实习报告5000字

    实习报告 5000 字 建筑实习报告 5000 字一 我们这学期的前四周是毕业实习时间,之前我们分别进行了认识实习. 生产实习.建筑施工与管理实训,这次是毕业实习. 我们都很重视这次实习,因为这是我们 ...

  5. 阿里大佬分享API网关在微服务架构中的应用

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自:未知的瞬间 案例背景介绍: 在实践微服务架构时,我们经常会面对以下需求:如何隔离外部和内 ...

  6. C++轻量级微服务_微服务技术栈:API网关中心,落地实现方案

    一.服务网关简介 1.外观模式 客户端与各个业务子系统的通信必须通过一个统一的外观对象进行,外观模式提供一个高层次的接口,使得子系统更易于使用: 简单说一下外观模式,网关和这个模式很像,但是比外观模式 ...

  7. java实现iam登录认证_是否可以通过Cloudfront对API网关进行IAM身份验证?

    是否可以通过Cloudfront将IAM角色身份验证用于API网关 endpoints ? 这是一个基本用例: / api - > API网关 / * - > S3 HTML / Java ...

  8. 什么是ip地址什么是网关_一文看懂什么是网关、DNS、子网掩码、MAC地址

    什么是网关.DNS.子网掩码,它有什么作用,确实,我们平时在网络中总是在不断的提到网关,却很少真正的去了解它. 例: 一.什么是网关 1.什么是网关 网关是一种充当转换重任的计算机系统或设备.在使用不 ...

  9. 访问 localhost 的请求遭到拒绝_软件架构-Spring Cloud Zuul作为API网关实现请求路由转发...

    感谢老铁们的支持,不同的微服务一般有不同的网络地址,而外部的客户端可能需要调用多个服务的接口才能完成一个业务需求.比如一个电影购票的手机APP,可能回调用电影分类微服务,用户微服务,支付微服务等. 源 ...

最新文章

  1. 在Centos 7下编译openwrt+njit-client
  2. 逆天通用水印支持Winform,WPF,Web,WP,Win10。支持位置选择(9个位置 ==》[X])...
  3. Simulink仿真教程6---对控制系统的阶跃响应进行仿真
  4. IDEA如何像ecplise一样添加jar包?
  5. Spring Boot与Docker||Docker基本使用、Docker环境||安装Docker
  6. 华为鸿蒙系统内部消息,华为鸿蒙系统内部曝光,并且将于年底发布?网友:还能再假点?...
  7. 是哪个机场_南宁和昆明哪个更强?南宁城建强于昆明,昆明经济强于南宁
  8. c语言 有趣的代码,分享一段有趣的小代码
  9. python中0xff_强悍的Python读取大文件的解决方案
  10. 2020胡润慈善榜揭晓:许家印以28亿元捐赠额成为中国首善
  11. 利用cookies实现对弹出窗口频率的控制
  12. 玩转Git三剑客01:Git基础
  13. OracleSpatial函数实例
  14. excel设置曲线图横坐标值
  15. C# 置顶EXE 把EXE放最前面 ProcessStartInfo
  16. 计算机应用基础练习题库与答案
  17. RFID电子标签对于图书管理的应用
  18. 大事 | 生活终于对我的联想Y430P下手了!
  19. java 字体宽度_Java字体大小从宽度
  20. safari浏览器模拟ipone,ipad以及其他浏览器版本

热门文章

  1. Visual Paradigm 教程[UML]:如何在SoaML中建模多方服务?
  2. python 基础
  3. 如何处理大数据:微博信息流数据库设计
  4. how to create view (windows)
  5. 阿里某leader因年轻下属不主动找活干,提醒对方继续这样绩效不好看,对方竟直接辞职!...
  6. Redis 主库宕机如何快速恢复?面试必问!
  7. Redis为什么变慢了?一文讲透如何排查Redis性能问题 | 万字长文
  8. 面试官问我什么是扩展自适应机制
  9. 200 道 Java 面试题解!某阿里 P7 只答上来 70%!
  10. Spring:一个Java框架15年的演化