API网关如何实现对服务下线实时感知

上篇文章《Eureka 缓存机制》介绍了Eureka的缓存机制,相信大家对Eureka 有了进一步的了解,本文将详细介绍API网关如何实现服务下线的实时感知。

一、前言

在基于云的微服务应用中,服务实例的网络位置都是动态分配的。而且由于自动伸缩、故障和升级,服务实例会经常动态改变。因此,客户端代码需要使用更加复杂的服务发现机制。

目前服务发现主要有两种模式:客户端发现和服务端发现。

  • 服务端发现:客户端通过负载均衡器向服务注册中心发起请求,负载均衡器查询服务注册中心,将每个请求路由到可用的服务实例上。
  • 客户端发现:客户端负责决定可用服务实例的网络地址,并且在集群中对请求负载均衡, 客户端访问服务登记表,也就是一个可用服务的数据库,然后客户端使用一种负载均衡算法选择一个可用的服务实例然后发起请求。

客户端发现相对于服务端发现最大的区别是:客户端知道(缓存)可用服务注册表信息。如果Client端缓存没能从服务端及时更新的话,可能出现Client 与 服务端缓存数据不一致的情况。

二、网关与Eureka结合使用

Netflix OSS 提供了一个客户端服务发现的好例子。Eureka Server 为注册中心,Zuul 相对于Eureka Server来说是Eureka Client,Zuul 会把 Eureka Server 端服务列表缓存到本地,并以定时任务的形式更新服务列表,同时zuul通过本地列表发现其它服务,使用Ribbon实现客户端负载均衡。

API网关如何实现对服务下线实时感知

正常情况下,调用方对网关发起请求即刻能得到响应。但是当对生产者做缩容、下线、升级的情况下,由于Eureka这种多级缓存的设计结构和定时更新的机制,LoadBalance 端的服务列表B存在更新不及时的情况(由上篇文章《Eureka 缓存机制》可知,服务消费者最长感知时间将无限趋近240s),如果这时消费者对网关发起请求,LoadBalance 会对一个已经不存在的服务发起请求,请求是会超时的。

三、解决方案

3.1 实现思路

生产者下线后,最先得到感知的是 Eureka Server 中的 readWriteCacheMap,最后得到感知的是网关核心中的 LoadBalance。但是 loadBalance 对生产者的发现是在 loadBalance 本地维护的列表中。

所以要想达到网关对生产者下线的实时感知,可以这样做:首先生产者或者部署平台主动通知 Eureka Server, 然后跳过 Eureka 多级缓存之间的更新时间,直接通知 Zuul 中的 Eureka Client,最后将 Eureka Client 中的服务列表更新到 Ribbon 中。

但是如果下线通知的逻辑代码放在生产者中,会造成代码污染、语言差异等问题。

借用一句名言:

“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”

API网关如何实现对服务下线实时感知

Gateway-SynchSpeed 相当于一个代理服务,它对外提供REST API来负责响应调用方的下线请求,同时会将生产者的状态同步到 Eureka Server 和 网关核心,起着 状态同步 和 软事物 的作用。

思路:在生产者做 缩容、下线、升级 前,spider 平台(spider为容器管理平台)会主动通知 Gateway-SynchSpeed 某个生产者的某个实例要下线了,然后 Gateway-SynchSpeed 会通知 Eureka Server 生产者的某个实例下线了;如果Eureka Server 下线成功,Gateway-SynchSpeed 会直接通知 网关核心。

设计特点

  • 无侵入性、方便使用。不用关心调用方的基于何种语言实现,调用者只要对 Gateway-SynchSpeed 发起一个http rest请求即可,真正的实现逻辑不用侵入到调用方而是交给这个代理来实现。

  • 原子性。调用方先在Eureka Server下线,然后在所有相关网关核心中下线为最小工作执行单元,Gateway-SynchSpeed 相当于一个"软事物",保证服务下线的某种程度上原子特性。

3.2 实现步骤

API网关如何实现对服务下线实时感知

步骤说明

  • 第一步:在生产者做 缩容、下线、升级 前,spider平台会以http请求的形式通知到 Gateway-SynchSpeed 服务,通知的粒度为服务实例所在的容器IP。

  • 第二步:Gateway-SynchSpeed 接受到请求后,先校验IP的可用性,然后通知Eureka Server。

  • 第三步:Eureka Server 将 Producer 置为失效状态,并返回处理结果(Eureka 下线形式分为两种,一种是直接从服务注册列表直接剔除,第二种是状态下线,即是将 Producer 的状态置为OUT_OF_SERVICE。 如果是以第一种形式下线,Spider平台发出下线请求后,不能保证Producer进程立刻被kill,如果这期间 Producer 还有心跳同步到 Eureka Server,服务会重新注册到 Eureka Server)。

  • 第四步:Gateway-SynchSpeed 得到上一步结果,如果结果为成功,则执行下一步;反之,则停止。

  • 第五步:Gateway-SynchSpeed 为Eureka Client。Gateway-SynchSpeed 通过 IP 到本地服务注册列表中得到 Producer 的 Application-Name。

  • 第六步:Gateway-SynchSpeed 通过 Application-Name 到网关核心库中查询所有与下线服务相关的 网关组名字

  • 第七步:Gateway-SynchSpeed 通过 网关组名字 到本地服务列表中查找网关组下所有的服务地址 ipAddress(ip : port)。

  • 第八步:Gateway-SynchSpeed 异步通知所有相关网关节点。

  • 第九步:Gateway-Core 收到通知后,对 Producer 做状态下线,同时记录所有状态下线成功的实例信息到缓存 DownServiceCache 中。

  • 第十步:Gateway-Core 更新本地 Ribbon 服务列表。

四、补偿机制

Eureka 提供了一种安全保护机制。Eureka Client 从 Eureka Server 更新服务列表前,会校验相关Hash值是否改变( Client 服务列表被修改,hash值会改变),如果改变,更新方式会从增量更新变成全量更新,(由《Eureka 缓存机制》可知这30s内 readOnlyCacheMap 和 readWriteCacheMap 的数据可能存在差异),如果Client端缓存列表被readOnlyCacheMap 覆盖,最终会导致 Ribbon 端服务列表与 readWriteCacheMap 数据不一致。

API网关如何实现对服务下线实时感知

针对 Eureka 这种机制,引入监听器 EurekaEventListener 作为补偿机制,它会监听 Eureka Client 全量拉取事件,对于缓存中未超过30s的服务,将其状态重新设置成 OUT_OF_SERVICE

五、API安全设计

考虑到系统的安全性问题,如果被人恶意访问,可能会使生产者在Eureka Server中无故下线,导致消费者无法通过 Eureka Server 来发现生产者。

使用黑白名单做安全过滤,基本流程如下:

  • 对 Gateway-Synchspeed 中设置白名单网段(IP网段)

  • 在 Gateway-Synchspeed 加入过滤器,对下线请求方进行IP校验,如果请求端IP在网段中,则放行;反之,过滤。

六、日志回溯

由于 Gateway-SynchSpeed 和 Gateway-Core 是部署在 Docker 容器中,如果容器重启,会导致日志文件全部丢失。所以需要将 Gateway-SynchSpeed 和 Gateway-Core 中相关日志写入到 Elasticsearch ,最终由 Kibana 负责查询 Elasticsearch 的数据并以可视化的方式展现。

七、代码片段展示

Gateway-SynchSpeed 做状态同步

API网关如何实现对服务下线实时感知

EurekaEventListener 处理缓存数据

API网关如何实现对服务下线实时感知

八、 补充说明

目前网关实现对服务下线的实时感知中,使用的 Zuul 和 Eureka 版本为 Spring Cloud Zuul 1.3.6.RELEASE 、Spring Cloud Eureka 1.4.4.RELEASE。

目前网关实现的是对网关下游服务的实时感知,而且需满足以下条件:

  • 生产者需部署在 kubernetes 容器管理平台
  • 生产者做正常的下线、升级或者缩容操作。如果是由于容器资源不足,导致服务异常宕机等非正常下线,不支持。

网关服务下线实时感知是网关对业务方提供的一种可选的解决方案,在 spider 平台中默认是没有开启此功能,是否开启此功能由业务方根据本身系统要求决定,具体如何配置可参考 API网关接入指南 中 《网关实时感知在spider上配置文档说明》。

作者:谢国辉

来源:宜信技术学院

转载于:https://blog.51cto.com/14159827/2405120

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

反射笔记-----------------------------

1.反射基本概念: 01.定义: 反射是指在程序运行期间,能够观察和修改类或者类的对象的属性和行为的特性! 02.作用: 001.在运行期间获取类的修饰符,包名,类名,实现的接口,继…

kubernetes 集群部署

kubernetes 集群部署 环境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152.113JiaoJiao_Centos7-3(152.114) 192.168.152.114已开通 4C8G80G 集群规划 部署方式 环境准备:基于主机名称通信,时间同步,关…

wordpress 显示数学公式 (MathJax-LaTeX)

blog 不放一堆数学公式怎么能显得高大上,所以 MathJax-LaTeX 也是必装的插件之一了。 一、安装 MathJax-LaTex 插件 直接在 wordpress 插件中,搜索并安装 MathJax-LaTeX 二、安装本地 MathJax 服务 不过由默认的 MathJax cdn 服务经常被墙,所…

ConstraintLayout

ConstraintLayout使用笔记 具体使用参考:http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayout 好处还是很明显,确实可以减少嵌套。性能对比参阅:http://www.cnblogs.com/liujingg/p/7161319.html 简单嵌套Constrain…

python(5)- 基础数据类型

一 int 数字类型 #abs(x)      返回数字的绝对值&#xff0c;如abs(-10) 返回 10 # ceil(x)    返回数字的上入整数&#xff0c;如math.ceil(4.1) 返回 5 # cmp(x, y)    如果 x < y 返回 -1, 如果 x y 返回 0, 如果 x > y 返回 1 # exp(x)…

基于HTK的语音拨号系统

为什么80%的码农都做不了架构师&#xff1f;>>> 基于 HTK 的语音拨号系统 Veket NWPU 2011-6-22 目标&#xff1a; 该系统能够识别连续说出的数字串和若干组姓名。建模是针对子词&#xff08; sub-word,eg.. 音素&#xff09;&#xff0c;具有一定的…

MySQL无法重启问题解决Warning: World-writable config file '/etc/my.cnf' is ignored

为什么80%的码农都做不了架构师&#xff1f;>>> 今天帮朋友维护服务器&#xff0c;在关闭数据库的命令发现mysql关不了&#xff0c;提示Warning: World-writable config file /etc/my.cnf is ignored &#xff0c;大概意思是权限全局可写&#xff0c;任何一个用户都…

用户体验分析: 以 “南通大学教务管理系统微信公众号” 为例

基于实例分析&#xff0c;体会用户体验设计的 7 条准则&#xff0c;分析“南通大学教务管理系统微信公众号” 在用户体验设计方面让你觉得满意的地方&#xff08;不少于2点&#xff09;&#xff1b;&#xff08;20分&#xff09;&#xff0c;请陈述理由。 同样&#xff0c;分析…

JVM学习笔记(一):Java内存区域

由于Java程序是交由JVM执行的&#xff0c;所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前&#xff0c;先来看一下Java程序具体执行的过程&#xff1a; 首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀)&am…

EdgeRouter X设置外网远程访问和HTTPS连接指定出口网关

EdgeRouter X虽然小巧&#xff0c;但功能强大&#xff0c;为方便远程管理&#xff0c;必须对防火墙进行设置&#xff0c;允许从外部进行访问&#xff0c;由于公网的80、443端口都已被运营商关闭&#xff0c;必须设置端口转发才能从外部访问。一、设置外网远程访问通过浏览器进入…

CSV出力ボタンラッパー(asp.net)[イベントの作り方に役立つ]

为什么80%的码农都做不了架构师&#xff1f;>>> /// <summary> /// CSV出力ボタンラッパー。 /// </summary> public class CsvOutputButtonWrapper { /// <summary> /// CSV出力ボタン /// </summary> …

项目UML设计(团队)

团队信息 队名&#xff1a;massivehard 组长&#xff1a;晓辉 队员&#xff1a;一飞&#xff0c;帅珍&#xff0c;斌豪&#xff0c;锦谋 团队分工 模块序号模块名模块具体内容1日记编辑添加随笔2照片选择选择照片识别3消息模块收发消息4个人信息账号&#xff0c;密码等负责人分…

安装asp.net mvc4后mvc3项目编译报错

为什么80%的码农都做不了架构师&#xff1f;>>> 安装asp.net mvc4之后&#xff0c;之前的mvc3项目编译时报这个错“The type System.Web.Mvc.ModelClientValidationRule exists in both c:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.M…

POJ 3608 Bridge Across Islands 《挑战程序设计竞赛》

为什么80%的码农都做不了架构师&#xff1f;>>> POJ 3608 Bridge Across Islands跨岛大桥&#xff1a;在两个凸包小岛之间造桥&#xff0c;求最小距离&#xff1f;3.6与平面和空间打交道的计算几何 凸包 这题原始数据已经是凸包&#xff08;convex polygons&#x…

抓包(Charles工具入门)

一、charles工具简单使用 1、录制操作 录制请求、清空录制请求&#xff1a; 两种展示请求的视图方式&#xff1a; 2、录制请求的简单分析 &#xff08;1&#xff09;请求的总览页面Overview&#xff1a;可查看请求路径、请求方式、请求时间等有关该请求的内容 &#xff08;2&am…

探秘创造力

为什么80%的码农都做不了架构师&#xff1f;>>> 创造力&#xff0c;在很多行业和领域都被视为神奇的存在&#xff0c;大家都希望自己的创造力能够无限&#xff0c;感觉创造力已经被神话了。其实&#xff0c;一个简单问题可能很少人能够明确&#xff1a;”创造力是天…

Chrome Android 60.X+ 不能自动播放audio音频的解决办法

Chrome Android等一些浏览器默认限制了自动播放音频视频等&#xff0c;需要用户有点击的动作后才可以播放。这样的原因在于很多用户流量需要付费&#xff0c;而限制了自动播放可以避免用户在不知情的情况下产生高额的流量费用。 在60.X版本之前&#xff0c;chrome://flags中有一…

框架设计:实现数据的按需更新与插入的改进--用数据对比进一步说明

2019独角兽企业重金招聘Python工程师标准>>> 在发布完&#xff1a;框架设计&#xff1a;实现数据的按需更新与插入的改进 之后&#xff1a; 有网友表示不理解&#xff0c;于是这里给出一篇简单的说明对比&#xff0c;表示下改进后好处。 一&#xff1a;场景一&#…

Java异常详解及如何处理

来源&#xff1a;Java异常详解及如何处理 简介 程序运行时&#xff0c;发生的不被期望的事件&#xff0c;它阻止了程序按照程序员的预期正常执行&#xff0c;这就是异常。异常发生时&#xff0c;是任程序自生自灭&#xff0c;立刻退出终止&#xff0c;还是输出错误给用户&…

TransactionScope 的基本原理简介

C# 的事务编程 1 Db事务 DbConnection 中创建基于当前连接的 DbTransaction 2 使用TransactionScope ,创建环境事务 一旦创建&#xff0c;在这个环境包含的DbConnection 实例 都会根据连接字符串中的 Sqlserver 连接字符串支持&#xff0c;是否自动附加当前环境事务. 连接字符…