流量调度、微服务可寻址性和注册中心

流量,调度,服务,寻址,注册,中心 · 浏览次数 : 242

小编点评

## 内容摘要 本文介绍了基于Nginx的流量调度技术,包括以下主要内容: * **控制平面/数据平面控制平面**:解释了控制平面和数据平面的概念,以及它们如何用于流量调度。 * **东西/南北流量南北流量**:介绍了东西/南北流量的概念,以及如何实现单体流量的双向传输。 * **NGINX动态服务发现**:介绍了NGINX的动态服务发现功能,以及如何使用`nginx_http_dyups_module`模块实现动态修改upstream配置的功能。 * **例子**:提供了一些使用NGINX动态服务发现的例子,展示如何根据名称修改upstream配置。 ## 内容要点 * **流量调度**:指将请求从多个服务器分配处理的技术。 * **控制平面和数据平面**:控制平面的任务是配置流量,数据平面则是处理流量的任务。 * **东西/南北流量**:指从同一个服务器上接收和发送请求。 * **NGINX动态服务发现**:NGINX可以根据请求的各种信息动态地选择最佳的服务器进行处理。 * **`nginx_http_dyups_module`**:这是一个用于动态修改upstream配置的第三方组件。 * **动态修改upstream配置**:可以通过NGINX动态修改upstream配置,以实现灵活的流量调度。 * **例子**:展示了如何使用`nginx_http_dyups_module`在不重启NGINX的情况下修改upstream配置。

正文

前言

现代计算机基于计算、存储和调度的体系, 于是现代架构都是围绕这三大话题不断演进。

在基础架构部, 也是主要为了解决这三个难题,为业务事业部提供透明的、高可用、可快速伸缩的 三大能力, 我们组主要负责 [流量调度] 这个话题,下面是一些宏观的技术笔记。



在单体结构, 流量调度是直观且无感的(DNS+Nginx就可以完成一次流量调度)。
演进到 微服务结构(服务粒度变得更细、服务伸缩更灵活(上下线更加频繁),团队松耦合),流量调度并没有消失,而是变得更加复杂。

关键名词解释

1. 控制平面/数据平面

控制平面: 内含路由表、负责路由控制, 引导流量的走向,注重“引导”, 属于旁路业务(核心)。  

数据平面:根据控制平面的路由逻辑,业务流量的实际走向。

控制面很多属于[核心]旁路业务:要求一致性=> raft协议。

2. 东西/南北流量

南北流量: 业务客户端--->服务器;
东西流量: 数据中心内或者数据中心之间的服务间调用;

东西/南北流量都属于数据平面流量。



服务治理的演进

服务治理的基石是动态服务发现, 阿里云服务治理的演进 大而全,这里只记录我的理解。

阶段 目标 手段
孵化期 动态服务发现 客户端/服务端服务发现,负载均衡
成长期 提高开发和迭代效率 规范API、 统一配置、 版本管理
成熟期 部署边界、链路追踪,弹性伸缩 服务预热、优雅下线、监控追踪、限流,熔断, 回退

核心的技能点

1. 为什么需要注册中心?

并不是微服务催生了 注册中心,而是微服务强化了注册中心。

早期DNS+nginx 就能完成单体的 流量调度,但是不管是DNS解析出ip, 还是nginx解析出upstream ,底层都有注册中心的影子。

这里面有一个addressability的概念,也即服务可寻址性, 服务必须有一个唯一的可寻址的名字,这个名字不依赖于部署环境,表征一组可以处理流量的实例资源。

对于资源,必定存在CRUD交互,这便是部署平台和服务发现,与此同时当实例出现故障时,注册中心必须能够指示服务现在在何处运行。

很多时候除了在部署层面,存在健康探测告知业务方目前的应用就绪情况; 实际在接流的时候,负载层还会有自己的主动健康检查探测。

2. 规范API接口, 统一配置 , 集中式日志

  • 提高开发迭代效率,统一使用一种method、body payload形式的API接口(规避错误格式的传参导致的撕逼)、

各个团队是松耦合的关系,上下游的变更并不会主动通知,故需要版本管理(低版本不能直接下线)、提供给开发团队的版本调试接口。

  • 不用上n台实例修改配置
  • 集中式日志,不需要上n台机器拿日志, 通过聚合日志指标探究应用运行状态。

3. 服务发现

服务发现是服务治理的基石,三板斧: 注册、心跳、寻址。

  • 部署系统做[注册]动作。
  • 微服务客户端寻址
  • 主动上报心跳/注册中心主动探活: 维护实例资源状态。

存在两种模式: 客户端服务发现、服务器服务发现, 核心区别在于 : 客户端是否保存服务列表信息。

4. 负载均衡

先得有负载、再能谈论均衡

均衡策略:

  • 随机
  • 轮询
  • 带权轮询
  • 根据后端实例服务质量动态调度

最近思考了一个问题,负载均衡不仅是拿到服务的可用实例列表,然后做流量均分; 其实负载均衡的存在也为我们无损切流提供了契机。

5. 飞机起飞和降落最容易出事故

  • 服务预热: 服务进程启动,等待业务配置/缓存就绪,再向注册中心通报实例资源就绪,可以接流。
  • 优雅下线: 下线时设置服务终止时间(30s),处理在途流量, 不再接收新的请求流量。

6. 限流 熔断

链路上部分服务的状态会影响整个链路(雪崩), 故需要保障微服务链路的高可用 => 服务的熔断、限流

熔断: 熔断掉对于下游的调用; 限流: 限制进入本应用的流量。

不管是客户端服务发现,还是服务器服务发现,都存在注册中心,也可以叫名字服务,是流量调度的基石,统一了流量调度的入口。



现代互联网结构,流量在打到应用之前,都会以对应的姿势接入某种负载层。

大多数时候,流量其实不care某个特定的应用实例,更在意的是服务的可用性;

服务端服务发现,在客户端和接流应用之间形成了一个负载层,除了负载均衡外,还提供了故障转移和无损扩缩容、无损切流的契机,这些都涉及动态上下线实例, 不同负载层有不同的接流姿势。


基于nginx7层负载的动态服务发现

我们着重聊一聊基于nginx主机名字的动态服务发现(服务端服务发现)。

nginx做反向代理,负载均衡的时候,我们关注nginx [http配置节]的上下文[server配置节][upstream配置节]。

上面这个配置,nginx会匹配请求的Host头server_name指令,决定该请求转发给哪一个upstream虚拟主机。

相关知识,请关注Host请求头在虚拟主机服务多网域服务中的关键作用

利用nginx的第三方组件nginx_http_dyups_module,可以做到动态修改upstream的配置。

This module can be used to update your upstream-list without reloadding Nginx.

daemon off;
error_log logs/error.log debug;

events {
}

http {
    upstream test_upstream {
         server 127.0.0.1:8088;
         server 127.0.0.1:8089;
     }

    server {
        listen   80;

        location / {
            # The upstream here must be a nginx variable
             set $up test_upstream ;
             proxy_pass http://$up;
        }
    }

    server {                    # server1
        listen 8088;
        location / {
            return 200 "8088";
        }
    }

    server {                    # server2
        listen 8089;
        location / {
            return 200 "8089";
        }
    }

    server {                      # server3
        listen  8090;
        location / {
           return 200  "8090" ;
       }
    }

    server {                   #  dyups moudle在8081端口监听CRUD
        listen 8081;
        location / {
            dyups_interface;
        }
    }
}


1. 该组件默认不被编译进tengine(淘宝开源的具备强特性的nginx分发版),请使用--with-http_dyups_module配置参数启用。

./configure --add-module=./modules/ngx_http_upstream_dyups_module              // 配置成静态组件
 make             // 编译
 make install     // 安装

2. 需要添加dyups_interface指令激活[动态修改upstream配置]能力

/detail get all upstreams and their servers
/list get the list of upstreams
/upstream/name find the upstream by it's name

/upstream/name update one upstream, 这个api也能新增upstream-server

body commands;
body server ip:port;

/upstream/name delete one upstream

3. 演示利用dyups api在不重启nginx的情况下修改upstream配置。

查询所有upstream和server:localhost:8081/detail

test_upstream
server 127.0.0.1:8088 weight=1 max_conns=0 max_fails=1 fail_timeout=10 backup=0 down=0
server 127.0.0.1:8089 weight=1 max_conns=0 max_fails=1 fail_timeout=10 backup=0 down=0

// `curl 127.0.0.1` ==> 显示server1 server2的响应
//  output: 8088或者8089

修改test_upstream: curl -d "server 127.0.0.1:8090;" localhost:8081/upstream/test_upstream

// `curl localhost:8081/detail`
test_upstream
server 127.0.0.1:8090 weight=1 max_conns=0 max_fails=1 fail_timeout=10 backup=0 down=0

//  `curl 127.0.0.1` ===> 显示server3的响应
// output: 8090

以上是对于流量调度这个大的topic的理解,限于篇幅,战术性动作没有展开,路漫漫其修远兮,文辞拙劣,如果错误或者不同见解,欢迎留言探讨。

与流量调度、微服务可寻址性和注册中心相似的内容:

流量调度、微服务可寻址性和注册中心

前言 现代计算机基于计算、存储和调度的体系, 于是现代架构都是围绕这三大话题不断演进。 在基础架构部, 也是主要为了解决这三个难题,为业务事业部提供透明的、高可用、可快速伸缩的 三大能力, 我们组主要负责 [流量调度] 这个话题,下面是一些宏观的技术笔记。 在单体结构, 流量调度是直观且无感的(DN

Dubbo架构设计与源码解析(二) 服务注册

作者:黄金 一、Dubbo简介 Dubbo是一款典型的高扩展、高性能、高可用的RPC微服务框架,用于解决微服务架构下的服务治理与通信问题。其核心模块包含 【RPC通信】 和 【服务治理】 ,其中服务治理又分为服务注册与发现、服务容错、负载均衡、流量调度等。今天将重点介绍Dubbo的服务注册与发现。

关于自动限流的思考

目标 保证系统不因流量过载而挂。 现状:人工限流 正常的微服务限流工具都需要人工配置:支持应用负责人事先配置限流规则(接口 + 调用方 + 限流阈值),流量在阈值以下可以正常响应,超过阈值的流量会快速失败。这种方案存在如下问题: 问题 1. 接口多,无法全面覆盖 要想保证系统不因流量过载而挂,那就需

[转帖]linux 调优各项监控指标小记

https://z.itpub.net/article/detail/8A4E4E96522BD59D45AB5A4CA442EDB3 自开始负责生产环境部署,中间遇到了若干线上环境内存以及CPU的问题。由于微服务以及容器的流行,现在已经可以很方便的使用 K8s + prometheus + gra

哈啰面试:说说Dubbo运行原理?

Dubbo 是一款高性能、轻量级的开源 RPC(远程过程调用)框架,主要用于构建分布式服务和微服务架构。那 Dubbo 又是如何运行的呢?让我们一起来看。 1.核心组件 要说 Dubbo 运行流程就不得不先来了解一下 Dubbo 的核心组件了,因为 Dubbo 的交互流程是和核心组件息息相关的。 D

一套基于 .NET Core 开发的支付SDK集 - paylink

前言 在我们的日常工作开发中对接一些第三方支付是比较常见的,如最常见的就是支付宝、微信支付的对接。今天给大家推荐一个基于.NET Core开发的支付SDK集:paylink,它极大简化了API调用及通知的处理流程从而大大提供我们的工作生产效率。 运行环境 .NET Core 3.1、.NET 6.0

[转帖]058、集群优化之PD

PD调度基本概念 调度流程 调度中还有这还缺来了merge,例如合并空region。 store: 基本信息,容量,剩余空间,读写流量等 region: 范围,副本分布,副本状态,数据量,读写流量等 相关调度说明 balance-leader-scheduler: 保持不同节点的leader均衡ba

Kubernetes Pod调度:从基础到高级实战技巧

本文深入探讨了Kubernetes中的Pod调度机制,包括基础概念、高级调度技术和实际案例分析。文章详细介绍了Pod调度策略、Taints和Tolerations、节点亲和性,以及如何在高流量情况下优化Pod调度和资源管理。 关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识

《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作

1.简介 有些网站为了节省流量和资源,提高加载效率,采用的是动态加载(懒加载)的,也就是当拖动页面右侧滚动条后会自动加载网页下面的内容,不拖动就不会加载的或者通过鼠标滚轮操作。 2.wheel模拟鼠标滚动 wheel模拟鼠标滚动,就是通过调度一个wheel事件。(滚轮事件如果不处理可能会导致滚动,该

阿里DataX极简教程

目录简介工作流程核心架构核心模块介绍DataX调度流程支持的数据实践下载环境执行流程引用 简介 DataX是一个数据同步工具,可以将数据从一个地方读取出来并以极快的速度写入另外一个地方。常见的如将mysql中的数据同步到另外一个mysql中,或者另外一个mongodb中。 工作流程 read:设置一