- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
现代计算机基于计算、存储和调度的体系, 于是现代架构都是围绕这三大话题不断演进.
在基础架构部, 也是主要为了解决这三个难题,为业务事业部提供透明的、高可用、可快速伸缩的 三大能力, 我们组主要负责 [流量调度] 这个话题,下面是一些宏观的技术笔记.
在单体结构, 流量调度是直观且无感的(DNS+Nginx就可以完成一次流量调度)。 演进到 微服务结构(服务粒度变得更细、服务伸缩更灵活(上下线更加频繁),团队松耦合),流量调度并没有消失,而是变得更加复杂.
控制平面: 内含路由表、负责路由控制, 引导流量的走向,注重“引导”, 属于旁路业务(核心)。
数据平面:根据控制平面的路由逻辑,业务流量的实际走向。
控制面很多属于[核心]旁路业务:要求一致性=> raft协议.
南北流量: 业务客户端--->服务器; 东西流量: 数据中心内或者数据中心之间的服务间调用; 。
东西/南北流量都属于数据平面流量.
服务治理的基石是动态服务发现, 阿里云服务治理的演进 大而全,这里只记录我的理解.
阶段 | 目标 | 手段 |
---|---|---|
孵化期 | 动态服务发现 | 客户端/服务端服务发现,负载均衡 |
成长期 | 提高开发和迭代效率 | 规范API、 统一配置、 版本管理 |
成熟期 | 部署边界、链路追踪,弹性伸缩 | 服务预热、优雅下线、监控追踪、限流,熔断, 回退 |
并不是微服务催生了 注册中心,而是微服务强化了注册中心.
早期DNS+nginx 就能完成单体的 流量调度,但是不管是DNS解析出ip, 还是nginx解析出upstream ,底层都有注册中心的影子.
这里面有一个addressability的概念,也即 服务可寻址性 , 服务必须有一个唯一的可寻址的名字,这个名字不依赖于部署环境,表征一组可以处理流量的实例资源.
对于资源,必定存在CRUD交互,这便是部署平台和服务发现,与此同时当实例出现故障时,注册中心必须能够指示服务现在在何处运行.
很多时候除了在部署层面,存在健康探测告知业务方目前的应用就绪情况; 实际在接流的时候,负载层还会有自己的主动健康检查探测.
提高开发迭代效率,统一使用一种method、body payload形式的API接口(规避错误格式的传参导致的撕逼)、不用上n台实例修改配置.
各个团队是松耦合的关系,上下游的变更并不会主动通知,故需要版本管理(低版本不能直接下线)、提供给开发团队的版本调试接口.
服务发现是服务治理的基石,三板斧: 注册、心跳、寻址.
存在两种模式: 客户端服务发现、服务器服务发现, 核心区别在于 : 客户端是否保存服务列表信息.
最近思考了一个问题,负载均衡不仅是拿到服务的可用实例列表,然后做流量均分; 其实负载均衡的存在也为我们无损切流提供了契机.
链路上部分服务的状态会影响整个链路(雪崩), 故需要保障微服务链路的高可用 => 服务的熔断、限流 。
熔断: 熔断掉对于下游的调用; 限流: 限制进入本应用的流量.
不管是客户端服务发现,还是服务器服务发现,都存在注册中心,也可以叫名字服务,是流量调度的基石,统一了流量调度的入口.
现代互联网结构,流量在打到应用之前,都会以对应的姿势接入某种负载层.
大多数时候,流量其实不care某个特定的应用实例,更在意的是服务的可用性; 。
服务端服务发现, 在客户端和接流应用之间形成了一个负载层,除了负载均衡外,还提供了故障转移和无损扩缩容、无损切流的契机 ,这些都涉及动态上下线实例, 不同负载层有不同的接流姿势.
我们着重聊一聊 基于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 {
listen 8088;
location / {
return 200 "8088";
}
}
server {
listen 8089;
location / {
return 200 "8089";
}
}
server {
listen 8090;
location / {
return 200 "8090" ;
}
}
server {
listen 8081;
location / {
dyups_interface;
}
}
}
--with-http_dyups_module
配置参数启用。
./configure --add-module=./modules/ngx_http_upstream_dyups_module // 配置成静态组件
make // 编译
make install // 安装
dyups_interface
指令激活[动态修改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`,轮询返回8088或者8089
更新upstream配置: curl -d "server 127.0.0.1:8090;" 127.0.0.1:8081/upstream/test_upstream 。
// 再次调用`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`,轮询返回8090
以上是对于流量调度这个大的topic的理解,限于篇幅,战术性动作没有展开,路漫漫其修远兮,文辞拙劣,如果错误或者不同见解,欢迎留言探讨.
最后此篇关于流量调度、微服务可寻址性和注册中心的文章就讲到这里了,如果你想了解更多关于流量调度、微服务可寻址性和注册中心的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
使用微 Controller 时,通常您必须对寄存器进行写入和读取,为了使代码更具可读性,您需要定义寄存器地址及其位。这有点好,但是当您的寄存器名称彼此非常相似时,它很快就会变得困惑,例如此处所示 #
微 Controller 背景下的“原子操作”是什么? 我正在研究 TI F28027 MCU。 The data sheet says that its operations are atomic
我正在用 PIC 微 Controller 做一个项目。我有一个 ADC 采样并将数据保存到 RAM 存储器,一旦 RAM 被填满,我需要使用 PIC 微 Controller 通过蓝牙发送它。 我的
如何确定微 Controller 中特定程序所需的堆栈内存? 例如,假设我有一个内部可能有许多子例程或线程的程序。在我开始执行程序之前,我想修复这个程序的堆栈大小。我如何标记堆栈的终点。 最佳答案 我
我知道 printf 和 sprintf 之间的基本功能差异。但是,我想知道它们之间一些与时间/延迟相关的差异。显然,我想在我的一个自定义构建 RTOS 的任务中使用它。你怎么看 ?我想知道更多它会如
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我有一个一般性的问题。我在微 Controller 上记录错误。但是微 Controller 的资源比 Windows 计算机更有限。在我的例子中,我将 64 个错误代码保存在一个队列中,由 Free
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
假设我有一个时钟速度为 20 Mhz 的 8 位定时器。计时器在多少时间内可以计数多远而不溢出。或者1秒内溢出多少次?我知道它可以数到 255 并且会溢出 最佳答案 时间和频率之间的关系是t = 1/
我正在开展一个全面的长期 C 编程项目,该项目需要模块化编程方法。作为设计的一部分,将创建库,因此我想确认头文件组织的正确/错误解释: 问题 假设您正在创建一个库。经过深思熟虑,您决定您希望构想的最终
1. #define timers ((dual_timers *)0x03FF6000) 这是 ARM 微 Controller 中使用的内存映射定义 结构定义在哪里 2. struct dua
我购买了 LinkSprite JPEG 彩色相机和 LPC1768 mbed 微 Controller 。通过“LinkSprite”相机,我可以拍摄 jpeg 格式的图像,根据他们提供的教程,我可
我有很多不同的时间来跟踪我的设计,但没有什么是 super 关键的。 10 毫秒 +/- 几毫秒根本不是什么大问题。但是可能有 10 个不同的定时器同时在不同的周期进行计数,显然我没有足够的专用定时器
是否可以通过串行端口与 PIC 单片机通信 Android 应用程序?我可以使用哪些低成本手机?对不起,我是哥伦比亚人。 最佳答案 不确定 PIC,但是 Arduino可能是一个很好的引用点,并且有一
今天我一直在思考以下问题: 在一台普通的 pc 中,当你分配一些内存时,你向操作系统请求它,它会跟踪哪些内存段被占用,哪些内存段没有被占用,并且不要让你弄乱其他程序的内存等。但是微 Controlle
我已经为微 Controller 的键盘开发了一个 c 驱动程序。我想改变它,例如,当我按下 1 时,它会显示 1,直到我按下另一个数字。截至目前,数字只有在我按下数字时才会改变,这意味着一旦我松开键
我有一个在线程之间共享的 volatile unsigned char array LedState[5] 变量。数组中的每个索引表示一个状态。根据每个状态,LED 将以不同的顺序闪烁。一个线程设置数
我有一个项目要对微 Controller PIC18F 进行编程,我必须将一个开关电路连接到微 Controller 板上,这个开关电路有一个电锁和一个蜂鸣器要连接到它。 锁最初是通电的。假设当我发送
我是一名优秀的程序员,十分优秀!