【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream

这篇具有很好参考价值的文章主要介绍了【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本课时,我将带你一起了解入口网关服务的注册发现,并使用 OpenResty 实现一套动态 Upstream。

课前学习提示

基于本课时我们将要学习的内容,我建议你课前先了解一下 Nginx 的基础,同时熟悉基础的 Lua 语言语法,另外再回顾一下 HTTP 的请求过程,对于 Nginx 的负载均衡基本原理也要有基础的了解,掌握这些对我们学习此课时能起到一定的帮助。

关于本课时的内容,我用思维导图来先给你做一个整体的介绍:

首先,我会讲解动态 Upstream 的实现意义和场景,以及企业常见的基于开源实现方式。同时还会摘选其中一种实现方式,也就是基于 OpenResty 实现动态 Upstream 的案例进行演示。

动态 Upstream 场景

首先,我们来讲解第一部分内容,也就是动态 Upstream 的场景。

我们先来看一下这样一个典型的场景,整体了解动态 Upstream 的作用。

【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream,运维开发,运维,nginx,openresty

从图中流量的整体入口开始看,流量从左上方按照箭头方向访问站点,最先交给第一级服务 Nginx,Nginx 承担入口网关的作用,通常情况下,通过 Nginx Upstream来作负载均衡,从而实现将入口的流量均匀地分配给后台的 real server处理。

从图中我们可以看到,右上角的方框中有两台 Real server ,分别是 App server 1 和 App server 2。

那我们需要的动态 Upstream 是一个什么场景呢?当往这组集群中再添加一台新的后台服务 real server,也就是 App server 3 ,并且实现将入口的流量动态的(非手动方式)分发给新 App server 3,这个时候我们就需要用到动态配置upstream了。

动态 Upstream 实现意义

那么实现动态 Upstream 有什么好处呢?

再结合在上面的场景,要实现动态upsteam,首先后台服务节点App server 1 和 App server 2 ,它们将自己的信息(如:负载情况、服务状态情况、连接信息、服务名称等)实时的上报给管理中心,使得管理中心会收集 App server 1 和 App server 2 的节点状态,同时管理中心也会根据自身的策略动态地调整 Nginx 的 Upstream 配置。

假如当某一个Real server的负载过高,此时便可以通过管理中心去动态地调整 Nginx 的 Upstream 策略,入口网关动态地添加新的节点从而实时性的实现Real server资源水平的扩容,反之实现动态减少后台节点也是同样原理。这样的场景中作到及时调整upstream策略,从而使得入口网关动态分流,实现及时资源缩容和故障感知。

这个场景中,如果upstream配置不是通过动态的方式去实现调整,就需要通过手动的方式(先修改配置,再手工重启服务等),手动的方式没法作到自动化及实时触发调整。

【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream,运维开发,运维,nginx,openresty

我们再看一个常见的 K8s 的入口网关架构,这里就使用了动态 Upstream。我们知道 K8s + Docker 的服务部署模式下,ETCD 作为服务注册发现中的 KV存储数据库,存取着后台节点服务的注册信息,包含服务名称、连接方式等。所以,在图中会把所有后台的 服务节点(App1-App4) 的信息注册到 ETCD 的数据库中存储。然后 入口网关(如:Nginx) 通过查看etcd中数据并根据变化情况动态地调整 Upstream 配置,这个就是在K8S中动态入口网关理论原理。

图中上面的箭头表示一个服务的注册和动态的 Upstream 更新配置文件。下面的箭头表示动态的实现负载均衡策略流量转发,这个就是在 K8s 和 Docker 的部署场景中入口网关的实现原理。

动态 Upsteam 实现方式

那么,动态 Upstream 的实现方式都有哪些呢?下面我给你具体讲解一下。

我们知道Nginx 本身诞生的比 K8s 和 Docker 更早,Nginx 默认的配置模块是有来实现动态Upstream 是有局限的,这也是上一讲中我所认为Nginx存在缺陷,所以我们想要实现,通常有这么几种方式:

【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream,运维开发,运维,nginx,openresty

第一种方式是通过 Nginx+Lua,使用 Lua 语言开发接口,做到动态调用,也就是基于 Openresty 动态实现 Upstream,因为我们知道 Openresty 服务本身就是基于 Nginx 和 Lua 的一个结合体。

第二种方式是通过已经开源并成熟的组件,如 confd 工具或 国内某大公司开源的 nginx-upsync-module 的模块来实现动态 Upstream。

第三种方式是通过一个独立的入口网关把 Nginx 完全替换掉,比如我们现在了解的 Kong 网关还有 Traefik,都是在 K8s 中支持云原生的非常好的网关服务。

那我总结的实现方式有以上三种,接下来本课时我们来演示 Openresty 动态 Upstream 方案,使用 Lua 语言开发一套动态的接口,我们可以动态地调用接口实现一个动态的分流。

这个方案中实现了3个接口,让 Openresty 支持添加、删除、监控 Upstream 后台节点的功能(如图接口1-接口3)。

我们看下如图描述的内容:

【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream,运维开发,运维,nginx,openresty

通过开放接口,管理中心或者配置中心用可以调用这三个接口动态修改入口网关的负载均衡配置。我们接下来重点介绍Openresty Lua 语言如何开发实现这三个接口。

在正式演示之前再带你熟悉一下 Openresty。Openresty 是一个基于 Nginx 与 Lua 开发的高性能web平台,内部集成了大量的 Lua 库和第三方模块,如果使用Nginx则需要通过 Nginx 编译 Lua 模块非常繁琐,所以需要支持LUA直接使用 Openresty 就可以了。

大家用浏览器打开 Openresty 的官方网站(https://openresty.org/cn/),你可以看到 Openresty 的官方文档,同时因为本课时会作 Openresty 的演示,如果你希望模拟安装,可以按照官网的方式来进行安装。

同样,接下来演示案例也用到了Nginx模拟后台服务,Nginx 的安装建议你参考官方的安装方式,这里可以通过 官方提供yum 源的方式来安装 Nginx。

演示

接下来演示这个动态 Upstream, 分为三大部分进行讲解。

  • 第一部分是安装流程;
  • 第二部分是配置方式;
  • 第三部分是测试;

现在,我登录到一台虚拟主机上,来具体演示 Openresty 如何实现动态 Upstream。首先,我们需要安装 Nginx 和 Openresty,你可以参考官方文档来自行安装。

然后配置 Nginx 服务,Nginx这里作用不是作代理入口,而是 在整个演示场景的 real server 节点,我们需要模拟三个端口的后台服务。通过 Openresty 来负责作代理网关并负载均衡,所以我们可以配置一个基于 Nginx 的虚拟端口的虚拟主机。这里我做了三份配置文件 81、82、83,三份配置文件分别占用三个端口,然后我们可以自己参考这三个配置文件来进行配置,然后启用 Nginx。

启用 Nginx 后会占用 81、82、83 三个端口,我们还可以用浏览器来访问这三个端口。访问 83 端口时会显示一个 Server 3 和 url 3 的黄色的页面。然后我们访问 82 端口,显示的是 Server 2 和 url 2 的红色背景页面信息。访问 81 端口时显示的是 Server 1 和 url 1 的蓝色文字背景信息。这就是后台提供的三个 HTTP 服务,已经分别都做好了,然后我们需要配置 Openresty 的 Upstream 。

cd到 Openresty 的目录下,然后 cd 到 Nginx 目录,Nginx 的 conf 目录下有一个 Nginx.conf 文件,这是一个 Openresty 的主配置文件。同一级的 Nginx 目录下还有一个 ngx_lua 配置目录,这里已经放好了lua开发的代码文件。

这个目录是我自定义新建的,里面有三个脚本;upsops 是用来做动态调节 Upstream 节点信息的接口代码;upstream.lua 是用来设置负载均衡策略的代码,另外一个是实现节点信息获取的代码。

那么我们来看 openresty 服务的配置 nginx.conf 中,分别对这三个代码文件做了引用,配置会对外提供几个访问路径,其中一个是根的访问路径,也就是对外提供服务的访问路径,一个是 location=/ups一会我们拿这个重点讲解这个,它是实现动态更新配置 Upstream 主机节点信息的接口。

往上会看到我的 location 对外提供服务的时候,会引用到 proxy_pass 的本地的一组服务单元。服务单元分别配置了三台主机,也就是我们刚刚配置的三台 Nginx 虚拟主机的连接信息,然后后面的 balancer_by_lua_flie 就是修改了默认的配置负载均衡策略。

好,我们重点看upsops.lua 脚本的实现逻辑是什么样子的?我们来看一下。当用户请求这个路径是 ups 的时候,它会交给 Lua 解析处理。然后到 ngx_lua 目录下我们打开文件(upsops.lua )看一下,在最上面定义了一些本地的变量,有获取请求的参数,客户端的请求方法赋值给了 OP。

OP 主要是有哪两个方法呢?这个接口代码支持是增加(add)\删除(del)两个,这里会先获取所有主机的 Upstream 的服务节点,客户端通过发送put 请求传递过来的需要添加或者删除的新节点的信息,然后传递给 变量server ,这里会判断一个请求是否有带参数,并进行一个校验,接着还会关联一个独立的函数【function down_server(upstream_name,server)】。这里会用来判断一个逻辑,这个逻辑用来控制在 Upstream 后台 Real server 里最少应该保持一台主机,如果低于一台的话是不允许的,现实中如果upstream的后台服务节点数不可能为零。

代码最后会去判断客户端传递过来的操作方法(OP),是选择增加 Upstream 节点,还是删除 Upstream 节点,如果在删除节点时候会调用 down_server 的方法判断,判断它是不是符合至少保留一个节点的要求。

整体上,我们看到删除和添加成功后都会有对应的提示,如果有错误的话也会暴露出对应的错误信息,如果你看到对应的错误代码,可以分析具体的原因。

这就是整个 upsops.lua代码 中的大概逻辑,现在我们可以启用 Openresty 来简单做一个测试。

先关闭之前的服务,然后再启动。这个时候会看到暴露出一个 800 端口,这个就是 Openresty 占用的端口,我们可以通过 800 端口来进行访问测试。

首先显示的是一个蓝色的页面,我们再来刷新这个页面,第 2 次的时候会出现 server 2 url 2,再刷就会到 server 3 url 3 了,所以我们会看到它是一个因为配置负载均衡而轮循展示。

接下来我们可以删除一台主机,调用刚刚讲到的 upsops 脚本里面暴露出来的 ups 接口。我们用 curl 命令来模拟一个 put 的方法,-v 显示整个的请求过程,后面就是请求的链接,ups 就是我们刚请求的接口路径,然后 op=add 就是选择添加主机操作。这里,我们先删除一台主机,选择删除 83 端口节点,然后回车。

这个时候会看到返回的是 200 的状态码,并且会有一个提示删除 83 端口的后台服务成功。这个时候我们再来刷新页面,看看 server 3 还会不会再出现,我们可以多刷新几次。这个时候会发现我的浏览器会停留在 server 1 和 url 2 间进行不断的变更,而不会出现 server 3(对应 83 端口的服务)。

同样我们来演示如何把 server 3 加回来,也就是 端口为 83 节点的信息加回来,这时我们把 op后的操作改成 add。这时同样也会返回正确的提示。同样,再到浏览器端中看一下。这个时候 server 3 就加回来了。

你有没有发现,整个过程都是通过调用接口来实现的,也就是说我们要模拟动态发现的时候,其实就可以在管理或者注册中心节点,通过调用这种 HTTP API 接口的方式来动态的调用upstream配置。这个演示大家可以按照我给的这些脚自己模拟。文章来源地址https://www.toymoban.com/news/detail-573675.html

到了这里,关于【运维】第04课:入口网关服务注册发现-Openrety 动态 uptream的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springcloud gateway网关+认证服务+token方式,入口层认证统一微服务鉴权【设计实践】

    目录 背景 实现 gateway maven配置 yml配置 页面登录拦截配置类 白名单配置 token工具类 登录配置类 全局过滤器类 项目启动类 分布式项目的单点登录分为认证服务(单点登录服务端)和业务服务(单点登录客户端)两个角色, 当访问业务服务时,认证服务客户端SDK校验一下是否

    2024年02月15日
    浏览(49)
  • 服务注册与服务发现

    Eureka客户端:使用了@EnableEurekaClient注解的应用服务,如订单服务等,甚至Eureka本身也是一个客户端 Eureka服务端:使用了@EnableEurekaServer注解的应用服务,该服务提供了注册表以及对服务节点的操作 服务提供者:服务启动后,可以向注册中心发起register请求,将服务信息注册进

    2024年02月09日
    浏览(39)
  • eureka服务注册和服务发现

    我们要在orderservice中根据查询到的userId来查询user,将user信息封装到查询到的order中。 一个微服务,既可以是服务提供者,又可以是服务消费者,因此eureka将服务注册、服务发现等功能统一封装到了eureka-client端

    2024年02月10日
    浏览(38)
  • 服务注册发现_搭建单机Eureka注册中心

    创建cloud-eureka-server7001模块 pom添加依赖 写yml文件 主启动类 测试 访问浏览器localhostL:7001 参数: Environment: 环境,默认为test,该参数在实际使用过程中,可以不用更改 Data center: 数据中心,使用的是默认的是 “MyOwn” Current time:当前的系统时间 Uptime:已经运行了多少时间

    2024年02月07日
    浏览(47)
  • Nacos:服务的注册、发现和配置中心(注册篇)

    Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 N

    2024年02月15日
    浏览(39)
  • 微服务之SpringCloud服务注册与发现

    目录 一,前言 二,Eureka实现服务注册与发现 单机Eureka服务注册流程 集群模式搭建模拟 Eureka自我保护机制 三,Zookeeper实现服务注册与发现 四,Consul是实现服务注册与发现 基本简介 安装 服务注册测试 ​五,三个注册中心的异同点 什么是服务治理 Spring Cloud 封装了Netflix公司

    2024年02月02日
    浏览(46)
  • 基于 Zookeeper 实现服务注册和服务发现

    无论是采用SOA还是微服务架构,都需要使用服务注册和服务发现组件。我刚开始接触 Dubbo 时一直对服务注册/发现以及 Zookeeper 的作用感到困惑,现在看来是因为对分布式系统的理解不够深入,对 Dubbo 和 Zookeeper 的工作原理不够清楚。 本文将基于 Zookeeper 实现服务注册和服务发

    2024年02月10日
    浏览(41)
  • Consul服务注册发现集群搭建

    Consul 是一种用于服务发现、配置和分布式一致性的开源工具和平台。它由 HashiCorp 公司开发和维护,旨在简化构建和维护分布式系统的任务。 Consul 提供了许多功能,包括: 服务发现 :Consul允许服务注册和发现。当服务启动时,它可以向Consul注册自己的位置和元数据。其他服

    2024年04月08日
    浏览(42)
  • 微服务注册与发现——Eureka

    服务发现(注册)机制 nodejs的Eureka Client开源实现 服务发现组件具备功能: 服务注册表 服务注册与服务发现 服务检查 Eureka架构图 http://localhost:8761/ 微服务工程添加引用 注意添加版本号,否则会下载不下来 增加配置 启动类增加注解 启动服务注册 防止因Eureka Server宕机导致微

    2024年02月04日
    浏览(48)
  • springcloud Eureka服务注册与发现

    代码上传到 :https://github.com/13thm/study_springcloud/tree/main/days3 什么是服务治理 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 什么是服务注册与发现 Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使

    2024年01月18日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包