首页 文章 精选 留言 我的

精选列表

搜索[谷歌I/O],共10000篇文章
优秀的个人博客,低调大师

Kubernetes v1.34:风与意志(O' WaW)

Kubernetes v1.34 现已发布,包含 58 项改进,其中 23 项升级为稳定版,22 项进入测试版,13 项进入 Alpha;也包含一些废弃和移除内容。 发布主题与 Logo 重点更新 Kubernetes v1.34 带来了丰富的新特性和改进。 稳定版:DRA 核心功能正式发布 动态资源分配(DRA)支持更灵活地选择、分配、共享和配置 GPU、TPU、NIC 等设备。 自 v1.30 起,DRA 基于结构化参数声明设备,借鉴了存储卷动态配置的思路。DRA 依赖 resource.k8s.io 下的 ResourceClaim、DeviceClass、ResourceClaimTemplate 和 ResourceSlice API,并在 Pod 的.spec 中新增 resourceClaims 字段。resource.k8s.io/v1 接口已升级为稳定版,默认可用。 测试版:kubelet 支持投影 ServiceAccount 令牌用于镜像凭证 kubelet 镜像凭证提供者传统上依赖节点或集群中存储的长期 Secret,存在安全风险和管理开销。现在,kubelet 可请求短期、绑定受众的 ServiceAccount 令牌,用于容器镜像拉取认证。这样镜像拉取基于 Pod 自身身份授权,而非节点凭证。 主要优势是大幅提升安全性,消除长期 Secret 需求,降低攻击面,简化凭证管理。 Alpha 版:支持 KYAML——Kubernetes 专用 YAML 方言 KYAML 是一个更安全、更明确的 YAML 子集,专为 Kubernetes 设计。自 v1.34 起,kubectl 支持将 KYAML 作为输出格式。 KYAML 解决了 YAML 空白符敏感和字符串引用可选带来的类型转换问题,同时克服 JSON 无注释和严格逗号需求的缺点。 所有 KYAML 文件也是有效的 YAML,可以作为 kubectl 输入。kubectl v1.34 可通过设置环境变量 KUBECTL_KYAML=true 来请求 KYAML 格式输出。仍可选择 JSON 或 YAML 输出。 升级为稳定版的功能精选 Job 替换 Pod 延迟创建 默认情况下,Job 控制器在 Pod 终止时立即创建替换 Pod,导致旧 Pod 和新 Pod 同时运行,可能引发资源竞争和不必要的自动扩缩。某些机器学习框架(如 TensorFlow、JAX)要求同一索引只有一个 Pod 同时运行。 新增加.spec.podReplacementPolicy,支持只在 Pod 完全终止(.status.phase 为 Failed)后再创建替换 Pod。设置.spec.podReplacementPolicy: Failed 即可启用。 该特性自 v1.28 alpha,已于 v1.34 稳定发布。 卷扩容失败后可恢复 允许用户取消存储提供商不支持的卷扩容,改用较小值重试,提升卷扩容成功率。该特性自 v1.23 alpha,已于 v1.34 稳定发布。 VolumeAttributesClass 支持卷参数修改 VolumeAttributesClass 现已稳定,提供 Kubernetes 原生 API 修改卷参数(如 IO 性能),支持在线垂直扩展卷,前提供应商支持。该 API 通过 CSI 接口实现,需对应 CSI 驱动支持 ModifyVolume 接口。 结构化认证配置 v1.29 引入了 AuthenticationConfiguration 配置文件格式,替代过去大量命令行选项,支持多 JWT 认证器、CEL 表达式校验和动态重载。 此配置显著提升认证管理和审计能力,v1.34 升级为稳定版。 基于选择器的细粒度授权 授权器(包括 Webhook 和内置节点授权器)现支持基于请求中的字段选择器和标签选择器做决策。例如,可以限制某策略只允许列出绑定到特定.spec.nodeName 的 Pod,客户端必须传入对应的字段选择器,否则拒绝访问。 该功能提升了多租户和节点隔离场景下的权限细化管理。 精细控制匿名请求 不再简单启用或禁用匿名访问,而是允许配置允许匿名访问的特定端点列表,如/healthz、/readyz、/livez 等。此举防止因 RBAC 配置错误导致匿名用户权限过大,同时无需修改外部探针或启动工具。 插件回调实现更高效重排队 kube-scheduler 支持插件注册回调函数,判断集群事件是否可能使之前无法调度的 Pod 变得可调度。减少无效重试,提高调度吞吐,特别适合动态资源分配场景。某些插件还可跳过回退延迟,加快调度。 有序命名空间删除 随机删除资源顺序可能导致安全风险或异常行为,比如 Pod 在网络策略删除后仍存在。引入结构化删除流程,确保按逻辑和安全依赖顺序删除资源,Pod 优先被移除。 此特性 v1.33 引入,v1.34 稳定,解决了 CVE-2024-7598 等安全问题。 流式列表响应 处理大规模列表响应时,API Server 此前需将全部对象序列化到大内存缓冲区,导致内存压力和性能下降。 新增流式编码机制,自动启用 JSON 和 Protobuf 格式,避免大内存占用,提升集群稳定性和性能,适合高并发大规模资源查询。 更稳定的 watch 缓存初始化 watch 缓存负责维护 etcd 中集群状态的最终一致缓存,之前启动或重初始化时可能失败。改进初始化流程,提高容错性,增强控制平面稳定性,保证控制器和客户端可靠建立 watch。 v1.31 测试版,v1.34 稳定发布。 放宽 DNS 搜索路径校验 以前 Pod 的 DNS 搜索路径严格验证,给复杂或遗留网络环境带来集成难题,需绕过配置。放宽 DNS 验证,v1.32 alpha,v1.34 稳定。 使用.spec.dnsConfig 的 searches 列表以单点“.”开头,可避免系统解析器为外部域名添加集群内搜索域,减少无效 DNS 请求,提高效率。 Windows kube-proxy 支持 Direct Service Return (DSR) DSR 通过绕过负载均衡器直接响应客户端,减少负载,降低延迟。v1.14 引入,v1.34 稳定发布。 容器生命周期钩子支持 Sleep 动作 为 PreStop 和 PostStart 钩子新增 Sleep 动作,方便管理优雅关闭和生命周期流程。 Sleep 动作可让容器暂停指定时间,负数或 0 秒则立即返回。v1.29 引入,v1.32 支持 0 秒,v1.34 稳定。 Linux 节点支持交换空间(swap) 过去 Kubernetes 不支持 swap,导致内存紧张时强制终止进程,影响大内存但访问不频繁的应用。v1.22 开始支持节点可配置 swap,经过 alpha 和 beta,v1.34 稳定发布。 主要模式 LimitedSwap 允许 Pod 在内存限制内使用 swap,默认 kubelet 为 NoSwap 模式,不使用 swap。提升工作负载稳定性和资源利用效率,适合资源受限环境,需注意性能影响。 允许环境变量名中使用特殊字符 放宽环境变量名称校验,允许除“=”以外的几乎所有可打印 ASCII 字符。支持直接定义和通过 envFrom 注入的 ConfigMap、Secret。 满足如.NET Core 等框架使用“:”分隔嵌套配置键的需求。 污点管理与节点生命周期解耦 过去 TaintManager 与节点生命周期控制器紧耦合,难以维护和测试,限制了基于污点的驱逐机制灵活性。该 KEP 将 TaintManager 拆分为独立控制器,提升代码模块化和可维护性。 此改动为内部架构优化,对用户使用污点无直接影响。 Beta 新功能 以下是 v1.34 版本后进入 Beta 的部分改进。 Pod 级别的资源请求和限制 以前多容器 Pod 只能对每个容器单独设置资源请求和限制,导致开发者要么资源配置过度,要么复杂分配,难以高效利用资源。现在支持在 Pod 级别指定资源请求和限制,开发者可为整个 Pod 设定资源预算,容器共享这些资源。此功能在 v1.32 为 Alpha,v1.34 升级到 Beta,HPA 现在支持 Pod 级资源规格。 主要优势是更直观管理多容器 Pod 资源,确保所有容器资源总和不超过 Pod 限额,有助于更合理调度和集群资源利用。 kubectl 用户偏好配置文件 .kuberc .kuberc 文件允许定义 kubectl 的默认选项和命令别名,不包含集群信息和凭据。v1.33 作为 Alpha 引入,需设置环境变量 KUBECTL_KUBERC 启用,v1.34 升级为 Beta 并默认启用。 外部 ServiceAccount Token 签名 传统 Kubernetes 使用静态磁盘密钥签发 ServiceAccount Token。新功能引入 ExternalJWTSigner gRPC 服务,实现进程外签名,支持集成外部密钥管理(如 HSM、云 KMS)替代静态密钥。 v1.32 Alpha,v1.34 Beta 默认启用。 DRA 功能 Beta 安全资源监控的管理员访问 通过 ResourceClaims 的 adminAccess 字段,集群管理员可访问已被其他用户使用的设备作监控诊断。仅限在标记为resource.k8s.io/admin-access: "true"的命名空间内有权限创建相关对象的用户。v1.34 升级到 Beta。 ResourceClaims 中的优先替代方案 通过 DRAPrioritizedList 功能,ResourceClaims 支持 firstAvailable 字段,定义按顺序满足请求的备选方案,调度器按顺序尝试,确保分配最佳可用设备。 kubelet 报告 DRA 分配资源 kubelet API 更新,可报告 Pod 通过 DRA 分配的资源,方便节点监控和新功能开发。v1.34 默认启用。 kube-scheduler 非阻塞 API 调用 调度器调用 API 造成阻塞,新功能通过优先队列和请求去重实现异步 API 处理,减少调度时延,避免线程饥饿,支持快速重试。兼容旧接口并新增监控指标。 变更准入策略(Mutating Admission Policies) 基于 CEL 和 Server Side Apply 合并算法,提供声明式、内嵌的变更准入替代方案,简化准入控制规则定义。v1.32 Alpha,v1.34 升级为 Beta。 快照式 API Server 缓存 解决历史版本 List 请求直接访问 etcd 性能和稳定问题,启用 ListFromCacheSnapshot 功能后,API Server 优先从快照缓存返回数据,提升性能并降低内存压力。默认开启。 由 SIG API Machinery 负责,KEP #4988。 Kubernetes 原生类型的声明式校验工具 提供基于 CEL 的声明式校验,简化 API 校验规则开发和维护,提升错误信息准确性。v1.33 Beta,v1.34 继续。 List 请求的流式 informer List 请求通过 watch 缓存流式返回数据,降低内存峰值和延迟。v1.34 版本 kube-apiserver 和 kube-controller-manager 默认使用该机制,提升稳定性和性能。 Windows 节点的优雅关机支持 Windows 节点的 kubelet 能识别系统关机事件,执行优雅终止 Pod,支持生命周期钩子和宽限期,提升维护和重启期间的可靠性。Beta 默认启用。 Pod 就地调整资源改进 v1.33 升级至 Beta 并默认启用,v1.34 增加支持内存缩减和 Pod 级资源集成。 Alpha 新功能 以下是 v1.34 版本后进入 Alpha 的部分新特性。 Pod 证书用于 mTLS 认证 新增通过 PodCertificateRequests 机制,kubelet 可为 Pod 申请管理 X.509 证书,支持 mTLS 认证,提升 Pod 身份验证强度,方便与证书认证的外部系统集成。 “Restricted” Pod 安全标准禁止远程探针 禁止在探针和生命周期处理器中使用除 podIP 之外的 host 字段,防止绕过安全限制的攻击。只有符合此要求的 Pod 才符合 Restricted 标准。可通过 Pod 安全准入或第三方方案强制执行。 用 .status.nominatedNodeName 表示 Pod 调度意图 解决调度延迟导致自动扩缩不准确的问题。开启 NominatedNodeNameForExpectation 功能后,调度器用该字段表示 Pod 预定绑定的节点,帮助外部组件做出更合理决策。 DRA Alpha 功能 资源健康状态 通过 Pod 状态暴露设备健康信息,方便诊断 Pod 崩溃问题。需开启 ResourceHealthStatus 功能且驱动实现相应 gRPC 服务。 扩展资源映射 以更简单方式将 DRA 管理的资源作为扩展资源暴露,兼容现有 .spec.resources 语法,方便应用无改动使用 DRA。 DRA 可用容量 支持驱动按需共享设备部分资源给多个 ResourceClaims,扩展调度器分配能力,支持更细粒度资源共享,提升多租户和带宽感知场景。 设备绑定条件 调度延迟绑定 Pod,直到所需外部设备准备就绪,提高调度可靠性。 容器重启规则 支持为 Pod 内不同容器指定不同的重启策略,且可基于退出码覆写,满足复杂场景需求,提升资源利用效率。 从运行时生成的文件加载环境变量 支持容器运行时动态生成环境变量文件,后续容器可加载,消除对入口脚本包装需求,增强容器编排灵活性。对 AI/ML 训练等场景尤为有用。 v1.34 版本的毕业、废弃与移除 功能毕业至稳定版 以下列出所有从测试阶段毕业到稳定(GA)版本的功能。欲了解包括新功能和从 alpha 到 beta 毕业的完整更新列表,可参考发布说明。 本次发布共计 23 项增强功能升至稳定版: 环境变量支持几乎所有可打印 ASCII 字符 允许作业控制器在 Pod 完全终止后重新创建 Pod PreStop Hook 的 Sleep Action 允许零值 API Server 追踪功能 支持 AppArmor 支持基于 Field 和 Label 选择器的授权 缓存中的一致性读取 使 TaintManager 独立于 NodeLifecycleController 从 CRI 发现 cgroup 驱动 DRA:结构化参数 新增 PreStop Hook 的 Sleep Action Kubelet OpenTelemetry 追踪 Kubernetes VolumeAttributesClass 修改卷功能 节点内存交换支持 仅允许匿名认证访问配置的端点 有序的命名空间删除 kube-scheduler 为每个插件提供回调函数以准确重排队列 放宽 DNS 搜索字符串校验 Watchcache 初始化增强鲁棒性 LIST 响应支持流式编码 结构化认证配置 Windows kube-proxy 支持直接服务返回(DSR)及覆盖网络 支持卷扩容失败的恢复 废弃与移除 随着 Kubernetes 持续发展成熟,一些功能会被废弃、移除或替换,以提升整体项目健康度。详情请参见 Kubernetes废弃与移除政策。v1.34 版本包含若干废弃项。 手动配置 cgroup 驱动已废弃 过去,正确配置 cgroup 驱动是 Kubernetes 集群用户的痛点。v1.28 版本支持 kubelet 查询 CRI 实现自动检测 cgroup 驱动,v1.34 该自动检测已晋升为稳定推荐方案。若你的 CRI 容器运行时不支持报告所需的 cgroup 驱动,建议升级或更换容器运行时。kubelet 配置文件中的 cgroupDriver 配置项已废弃。对应的命令行参数 --cgroup-driver 之前也已废弃,推荐使用配置文件。两者将在未来版本(不早于 v1.36)中移除。 Kubernetes 将在 v1.36 终止对 containerd 1.x 的支持 v1.34 仍支持 containerd 1.7 及其他 LTS 版本,但由于自动检测 cgroup 驱动,SIG Node 社区已确定 containerd 1.x 的最终支持时间线。最后支持版本为 v1.35(对应 containerd 1.7 的 EOL)。如果你仍使用 containerd 1.x,建议尽快升级至 2.0 及以上。可通过监控 kubelet_cri_losing_support 指标,了解集群中节点使用的 containerd 版本是否即将过时。 PreferClose 流量分配已废弃 Kubernetes Service 中的 spec.trafficDistribution 字段允许用户指定流量路由偏好。 KEP-3015 废弃了 PreferClose,新增两个值:PreferSameZone 和 PreferSameNode。PreferSameZone 是 PreferClose 的别名,用于语义更明确。PreferSameNode 优先分配本地端点,无法时回退远程端点。 该功能在 v1.33 以 PreferSameTrafficDistribution 功能门引入,v1.34 升级为 Beta 并默认启用。 更多详情可查看官方公告。

优秀的个人博客,低调大师

内部人员风险管理:归哪个“O”管?

俗话说,家和万事兴。与之相对的,家不睦则必自败。同理,如果缺乏明确的领导,内部人员风险管理项目或内部人威胁项目 (ITP) 也将走向失败。而公司企业往往未能出于 “团队合作” 的心态,或遵从当前管理领域来指定主管。其结果,就是 “三个和尚没水吃”,每个人都管就是一个人都不管。 这并不意味着要设立全权掌控的内部人威胁管理 “沙皇”,不代表要专设一人对所有与内部人风险管理相关事务行使一票否决权。真正需要的,是有人最终负责培育跨职能协作,推进安全功能,并评估进展和向领导层报告。政府将这一角色称为负责管理内部人威胁的 “高级官员”。在美国企业中,此类职位的头衔可能是首席风险官 (CRO)、首席安全官 (CSO)、首席信息安全官 (CISO) 或首席行政官 (CAO)。 首席风险官 (CRO) CRO 可能是领导 ITP 的最佳人选。但这很大程度上取决于 CRO 本身的职能和职权范围。有些 CRO 只关注公司的战略性风险。他们设立组织性风险容忍度,发展捕获和衡量风险态势的方法。这种模式下,运营性风险仍然完全落在运营主管的头上(CSO、CISO、业务部门等等)。此类 CRO 就不太适合领导 ITP 了,因为他们缺乏 ITP 所需的可见性和运营粒度。 其他 CRO 则关注公司的战略性和运营性两种风险。他们不仅仅设立组织性风险容忍度,也参与评估、管理和改善公司的运营性风险态势。此类 CRO 很适合领导 ITP。他们往往具备必要的高层授权(向 CEO、审计委员会等报告),而且出于职权范围考虑,他们还具有公司其他职能部门的必要关系(业务部门、法务、人力资源、CSO、CISO 等)。尽管风险本身的 “所有权” 依然落在运营性主管的身上,此类 CRO 往往也有共同责任和报告需求。因此,让他们成为既定的实权主管,顺畅领导 ITP 这样的跨部门项目。 首席安全官 (CSO) CSO 是领导 ITP 的合理选择。他们往往拥有现成的跨部门合作关系,与法律、人力资源、风险和网络部门都保有良好关系。这些关系赋予了他们培育良好协作,提升内部人威胁应对能力的必备视角和影响力。但有些 CSO 缺乏对内部人威胁管理技术层面上的恰当理解,可能会感觉无力领导 ITP。 举个例子,内部人威胁工具往往为 CISO 所有,由他们负责测试、实现和维护每个工具。这就会对人力资本和财务资源产生沉重负担。因此,CISO 常需重度参与 ITP。尽管如此,CSO 仍可成为有效 ITP 领导者,可在包括 CISO 在内的各职能部门间创建紧密合作关系和工作流,充分运用全部团队的专业技能。 首席信息安全官 (CISO) 领导 ITP 的传统选择就是 CISO。内部人威胁向来被看做网络安全的子集。因此,CISO 顺理成章被选为公司威胁管理工作主管,无论是内部威胁还是外部威胁。但这一观点正在发生改变,因为内部人威胁非常独特,涉及安全、人力资源、网络和法律等一系列职能。而 CISO 某种程度上也是相当专一的一个职位,专注于 “数字” 安全或以数据为中心的安全。内部人威胁从根本上讲是人的问题,而不是数据问题。因此,CISO 可能会因其职能范围而过度限制了 ITP 的作用域。 而且,CISO 向 CIO 报告的操作很常见,存在天然的利益冲突。CIO 的任务是确保信息的机密性、完整性和可用性,例如保障员工能执行自身工作等。这一职能跟内部人威胁相关安全需求不总是完全一致,会造成用于内部人威胁管理的资金因 CIO 其他关注重点而被延迟或受限。 首席行政官 (CAO)/法律总顾问/人力资源 尽管不是惯有的 ITP 领导,这一类别中的高管可能因公司组织架构方式,而成为实际上的 ITP 领导。有些公司里,首席行政官可能兼任法律总顾问或人力资源主管。这种情况下,一些安全职能可能也向 CAO 报告。因此,很多 ITP 职责或许会遵从 CAO 的指示。其他高管常会听取 CAO 的意见,也就令 CAO 成了潜在的 ITP 驱动力。如果 CAO 得到多名高级安全主管的支持,这种管理结构很可能行之有效。若缺乏强大的高层和中层经理支持,该模式就会缺乏恰当开发、实现和维持 ITP 所需的指导和知识专长。 内部威胁总监职位的兴起 为赋予履行管理内部人威胁项目职责的权限,推动该项目向前发展,公司企业开始设立新的总监和副总裁职位。采用的头衔包括内部人信任总监、内部人风险总监、员工信任副总裁等,但目标一直都是为 ITP 提供指导。随着公司企业持续扩大和深化自身内部人风险管理能力,此类角色职能的重要性也将逐渐增加。 虽然该角色最终应向 CEO 直接报告,但仍需一段时间才能发展到那一步。内部人威胁总监的职位可能会遵循 CISO 的发展历程,在接下来的几年里获得自身合法地位。同时,该职位应在上述首席级高管的领导下继续成长,成为 ITP 的运营主管。 【本文是51CTO专栏作者“李少鹏”的原创文章,转载请通过安全牛(微信公众号id:gooann-sectv)获取授权】 戳这里,看该作者更多好文

优秀的个人博客,低调大师

LLVM/wwwtlruy01com人人都需要懂一点I8669I44445的酷炫编译器

一款人人都需要懂一点的酷炫编译器——LLVM LLVM简介 LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。 发展历史 2000年LLVM开始开发。 2005年Apple雇了Chris Lattner,LLVM也相当于成了Apple的官方支持的编译器。 2011年12月 LLVM3.0发布,LLVM包括了一系列子项目,并且同步发布了新版本,如C/C++/Objective-C前端Clang 3.0改进了C++程序编译支持;改进C++ 2011标准支持;实现支持即将发布的C1x标准的某些特性;更快的生成代码,更快的编译,等等。 LLVM荣获2012年ACM软件系统奖。 LLVM与众不同的原因◾LLVM的“中间表示”(IR)是一项大创新。LLVM的程序表示方法真的“可读”。虽然看上去这没什么要紧,但要知道,其他编译器的中间表示大多是种内存中的复杂数据结构,以至于很难写出来,这让其他编译器既难懂又难以实现。◾LLVM架构远比其他编译器要模块化得多。◾LLVM给狂热的学术黑客提供了一种研究工具的选择,它还是一款有大公司做后台的工业级编译器。这意味着你不需要去在“强大的编译器”和“可玩的编译器”之间做妥协——不像你在Java世界中必须在HotSpot和Jikes之间权衡那样。 LLVM在不同语言中使用 使用 LLVM 的典型方式是通过你所熟悉的语言来编写代码 两种常见的可选语言是 C 和 C++:◾LLVM 本身是用 C++ 编写的◾LLVM 的 API 以 C 和 C++ 版本提供◾大量的语言开发往往会以 C/C++ 作为一个基础 不过,这两种语言并不是唯一的选择。许多语言都可以原生调用 C 语言库,所以理论上可以用任何这样的语言进行 LLVM 开发。但需要有一个实际的语言库可以很好地封装 LLVM API。 需要注意的是,一些与 LLVM 的语言绑定可能不完整,例如 Python ,有多种绑定选择,但每个选项的完整性和实用性各不相同:◾LLVM 项目维护着自己的一套到 LLVM 的 C API 的绑定,但是目前他们没有继续维护。 ◾llvmpy 在 2015 年后就没有进行维护了 —— 这对软件项目都是不利的,因为每个版本的 LLVM 都有一些变化,所以在使用 LLVM 时便是如此。◾由创建 Numba 的团队开发的 llvmlite 已经成为当前在 Python 中的 LLVM 的竞争者。它只实现了 LLVM 功能的一个子集,正如 Numba 项目的需求所规定的那样。但是这个子集满足了绝大多数 LLVM 用户所需。◾llvmcpy 旨在为 C 库带来最新的 Python 绑定,以自动化的方式保持更新,并使用 Python 的习惯用法来访问它们。 LLVM 的创建者撰写的使用 C++ 或 OCAML 语言的教程能够一步步指导你创建一种简单的名为 Kaleidoscope 的语言:◾Haskell:参考原始教程的直接移植。◾Python:在此网站的教程和原始版本非常相近,而另一个版本则是用交互式命令行进行更为雄心勃勃的重写。这两种版本都使用 llvmlite 作为到 LLVM 的绑定。◾Rust 和 Swift:不可避免地,我们不得不将该教程移植到这两种语言之上,它们都是由 LLVM 自身帮助使其诞生的。 最后,这个教程也有其他国家语言版本的。这里有中文版,分别是使用原始的 C++ 和 Python 版本。

优秀的个人博客,低调大师

Java版Spring Cloud B2B2C o2o社交电商-客户端负载均衡策略

一、负载均衡介绍 负载均衡(Load Balance):建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。 1、服务端负载均衡:客户端请求到负载均衡服务器,负载均衡服务器根据自身的算法将该请求转给某台真正提供业务的服务器,该服务器将响应数据给负载均衡服务器,负载均衡服务器最后将数据返回给客服端。(nginx) 2、客服端负载均衡:基于客户端的负载均衡,简单的说就是在客户端程序里面,自己设定一个调度算法,在向服务器发起请求的时候,先执行调度算法计算出向哪台服务器发起请求,然后再发起请求给服务器。 二、负载均衡策略介绍 (1) AbstractLoadBalancerRule AbstractLoadBalancerRule是一个抽象类,里边主要定义了一个ILoadBalancer,定义它的目的主要是辅助负责均衡策略选取合适的服务端实例。 (2) RandomRule该负载均衡策略就是随机选择一个服务实例,看源码我们知道,在RandomRule的无参构造方法中初始化了一个Random对象,然后在它重写的choose方法又调用了choose(ILoadBalancer lb, Object key)这个重载的choose方法,在这个重载的choose方法中,每次利用random对象生成一个不大于服务实例总数的随机数,并将该数作为下标所以获取一个服务实例。 (3) RoundRobinRule RoundRobinRule这种负载均衡策略叫做线性负载均衡策略,也就是我们在上文所说的BaseLoadBalancer负载均衡器中默认采用的负载均衡策略。这个类的choose(ILoadBalancer lb, Object key)函数整体逻辑是这样的:开启一个计数器count,在while循环中遍历服务清单,获取清单之前先通过incrementAndGetModulo方法获取一个下标,这个下标是一个不断自增长的数先加1然后和服务清单总数取模之后获取到的(所以这个下标从来不会越界),拿着下标再去服务清单列表中取服务,每次循环计数器都会加1,如果连续10次都没有取到服务,则会报一个警告No available alive servers after 10 tries from load balancer: XXXX。 (4) RetryRule 看名字就知道这种负载均衡策略带有重试功能。首先RetryRule中又定义了一个subRule,它的实现类是RoundRobinRule,然后在RetryRule的choose(ILoadBalancer lb, Object key)方法中,每次还是采用RoundRobinRule中的choose规则来选择一个服务实例,如果选到的实例正常就返回,如果选择的服务实例为null或者已经失效,则在失效时间deadline之前不断的进行重试(重试时获取服务的策略还是RoundRobinRule中定义的策略),如果超过了deadline还是没取到则会返回一个null。 (5) WeightedResponseTimeRule WeightedResponseTimeRule是RoundRobinRule的一个子类,在WeightedResponseTimeRule中对RoundRobinRule的功能进行了扩展,WeightedResponseTimeRule中会根据每一个实例的运行情况来给计算出该实例的一个权重,然后在挑选实例的时候则根据权重进行挑选,这样能够实现更优的实例调用。WeightedResponseTimeRule中有一个名叫DynamicServerWeightTask的定时任务,默认情况下每隔30秒会计算一次各个服务实例的权重,权重的计算规则也很简单,如果一个服务的平均响应时间越短则权重越大,那么该服务实例被选中执行任务的概率也就越大。 (6) ClientConfigEnabledRoundRobinRule ClientConfigEnabledRoundRobinRule选择策略的实现很简单,内部定义了RoundRobinRule,choose方法还是采用了RoundRobinRule的choose方法,所以它的选择策略和RoundRobinRule的选择策略一致,不赘述。 (7) BestAvailableRule BestAvailableRule继承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基础上主要增加了根据loadBalancerStats中保存的服务实例的状态信息来过滤掉失效的服务实例的功能,然后顺便找出并发请求最小的服务实例来使用。然而loadBalancerStats有可能为null,如果loadBalancerStats为null,则BestAvailableRule将采用它的父类即ClientConfigEnabledRoundRobinRule的服务选取策略(线性轮询)。 (8) PredicateBasedRule PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一个子类,它先通过内部定义的一个过滤器过滤出一部分服务实例清单,然后再采用线性轮询的方式从过滤出来的结果中选取一个服务实例。 (9) ZoneAvoidanceRule ZoneAvoidanceRule是PredicateBasedRule的一个实现类,只不过这里多一个过滤条件,ZoneAvoidanceRule中的过滤条件是以ZoneAvoidancePredicate为主过滤条件和以AvailabilityPredicate为次过滤条件组成的一个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询的方式从过滤结果中选择一个出来。使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册