Dubbo-gok8s注册中心设计方案与实现

Dubbo-go k8s注册中心设计方案与实现
随着云原生的推广,越来越多的公司或组织将服务容器化,并将容器化后的服务部署在k8s集群中。

今天这篇文章将会介绍dubbo-go将k8s作为服务注册中心的方案设计,以及具体实现。到目前为止该方案的实现已经被合并到dubbo-go的master分支。具体实现为关于Kubernetes的PullRequest。

k8s管理资源的哲学
k8s作为容器集群化管理方案可以将管理资源的维度可主观的分为服务实例管理和服务接入管理。

服务实例管理,主要体现方式为Pod设计模式加控制器模式。控制器保证具有特定标签(Label)的Pod保持在恒定的数量(多删,少补)。
服务接入管理,主要为Service,该Service默认为具有特定标签(Label)的一批Pod提供一个VIP(ClusterIP)作为服务的接入点,默认会按照round-robin的负载均衡策略将请求转发到真正提供服务的Pod。并且CoreDNS为该Service提供集群内唯一的域名。
k8s服务发现模型
为了明确k8s在服务接入管理提供的解决方案,我们以kube-apiserver 提供的API(HTTPS)服务为例。k8s集群为该服务分配了一个集群内有效的ClusterIP,并通过CoreDNS为其分配了唯一的域名 kubernetes 。如果集群内的Pod需要访问该服务时直接通过https://kubernetes:443即可完成。

lADPD2eDMWswXhPNBEXNBEs_1099_1093_jpg_720x720q90g

具体流程如上图所示(红色为客户端,绿色为kube-apiserver):

首先客户端通过CoreDNS解析域名为kubernetes的服务获得对应的ClusterIP为10.96.0.1。
客户端向10.96.0.1发起HTTPS请求。
HTTPS之下的TCP连接被kube-proxy创建的iptables的PREROUTING链拦截并DNAT 为 10.0.2.16或10.0.2.15。
Client与最终提供服务的Pod建立连接并交互。
由此可见,k8s提供的服务发现为域名解析级别。

Dubbo服务发现模型
同样为了明确Dubbo服务发现的模型,以一个简单的Dubbo-Consumer发现并访问Provider的具体流程为例。

lALPD4Bhp_yd3sTNAarNA_A_992_426_png_720x720q90g

具体流程如上图所示:

Provider将本进程的元数据注册到Registry中,包括IP,Port,以及服务名称等。
Consumer通过Registry获取Provider的接入信息,直接发起请求
由此可见,Dubbo当前的服务发现模型是针对Endpoint级别的,并且注册的信息不只IP和端口还包括其他的一些元数据。

K8s service vs dubbo-go 服务
通过上述两个小节,答案基本已经比较清晰了。总结一下,无法直接使用k8s的服务发现模型的原因主要为以下几点:

k8s的Service标准的资源对象具有的服务描述字段 中并未提供完整的Dubbo进程元数据字段因此,无法直接使用该标准对象进行服务注册与发现。
dubbo-do的服务注册是基于每个进程的,每个Dubbo进程均需进行独立的注册。
k8s的Service默认为服务创建VIP,提供round-robin的负载策略也与Dubbo-go自有的Cluster模块的负载策略形成了冲突。
Dubbo-go 当前的方案
服务注册
K8s基于Service对象实现服务注册/发现。可是dubbo现有方案为每个dubbo-go进程独立注册,因此dubbo-go选择将该进程具有的独有的元数据写入运行该dubbo-go进程的Pod在k8s中的Pod资源对象的描述信息中。每个运行dubbo进程的Pod将本进程的元数据写入Pod的Annotations字段。为了避免与其他使用Annotations字段的Operator或者其他类型的控制器(istio)的字段冲突。dubbo-go使用Key为 dubbo.io/annotation value为具体存储的K/V对的数组的json编码后的base64编码。

样例为:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    dubbo.io/annotation: W3siayI6Ii9kdWJibyIsInYiOiIifSx7ImsiOiIvZHViYm8vY29tLmlrdXJlbnRvLnVzZXIuVXNlclByb3ZpZGVyIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvY29uc3VtZXJzIiwidiI6IiJ9LHsiayI6Ii9kdWJibyIsInYiOiIifSx7ImsiOiIvZHViYm8vY29tLmlrdXJlbnRvLnVzZXIuVXNlclByb3ZpZGVyIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvcHJvdmlkZXJzIiwidiI6IiJ9LHsiayI6Ii9kdWJiby9jb20uaWt1cmVudG8udXNlci5Vc2VyUHJvdmlkZXIvY29uc3VtZXJzL2NvbnN1bWVyJTNBJTJGJTJGMTcyLjE3LjAuOCUyRlVzZXJQcm92aWRlciUzRmNhdGVnb3J5JTNEY29uc3VtZXJzJTI2ZHViYm8lM0RkdWJib2dvLWNvbnN1bWVyLTIuNi4wJTI2cHJvdG9jb2wlM0RkdWJibyIsInYiOiIifV0=
由于每个dubbo-go的Pod均只负责注册本进程的元数据,因此Annotations字段长度也不会因为运行dubbo-go进程的Pod数量增加而增加。

服务发现
依赖kube-apiserver 提供了WATCH的功能。可以观察特定namespace内各Pod对象的变化。dubbo-go为了避免dubbo-go进程WATCH到与dubbo-go进程无关的Pod的变化,dubbo-go将WATCH的条件限制在当前Pod所在的namespace,以及仅WATCH具有Key为 dubbo.io/label Value为 dubbo.io-value 的Pod。在WATCH到对应Pod的变化后实时更新本地Cache,并通过Registry提供的Subscribe接口通知建立在注册中心之上的服务集群管理其他模块。

总体设计图
lALPD4d8pTZEENfNA1PNBQA_1280_851_png_720x720q90g

具体流程如上图所示:

启动dubbo-go的Deployment或其他类型控制器使用k8s Downward-Api将本Pod所在namespace通过环境变量的形式注入dubbo-go进程。
Consumer/Provider进程所在的Pod启动后通过环境变量获得当前的namespace以及该Pod名称, 调用kube-apiserver PATCH 功能为本Pod添加Key为dubbo.io/label Value为 dubbo.io-value 的label。
Consumer/Provider进程所在的Pod启动后调用kube-apiserver将本进程的元数据通过PATCH接口写入当前Pod的Annotations字段。
Consumer进程通过kube-apiserver LIST 当前namespace下其他具有同样标签的Pod,并解码对应的Annotations字段获取Provider的信息。
Consumer进程通过kube-apiserver WATCH 当前namespace下其他具有同样label的Pod的Annotations的字段变化,动态更新本地Cache。
总结
k8s已经为其承载的服务提供了一套服务发现,服务注册,以及服务集群管理机制。而dubbo-go的同时也拥有自成体系的服务集群管理。这两个功能点形成了冲突,在无法调谐两者的情况,dubbo-go团队决定保持dubbo自有的服务集群管理系,而选择性的放弃了Service功能,将元数据直接写入到Pod对象的Annotations中。

当然这只是dubbo-go在将k8s作为服务注册中心的方案之一,后续社区会以更加“云原生”的形式对接k8s,让我们拭目以待吧。

dubbo-go 社区钉钉群 :23331795 ,欢迎你的加入。

作者信息:王翔,GithubID: sxllwx,就职于成都达闼科技有限公司,golang开发工程师。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

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

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

相关文章

软件设计师 - 数据流图

文章目录解题思路物理数据流图逻辑数据流图数据流图设计原则结构化语言解题思路 1.审题,圈出名词。 2.根据数据流图的平衡原则,判断数据流正确或补充数据流图; 物理数据流图 关注系统物理实体,及文档、输入输出硬拷贝。是系统构…

vue pdfjs 在线预览

下载pdfjs 官网&#xff1a;http://mozilla.github.io/pdf.js/getting_started/#download 放入项目中 将下载下来的文件解压缩后&#xff0c;重命名为pdf&#xff0c;将里面的pdf文件夹拷贝到项目中的public文件夹中 页面中使用 <template><div class"container…

年终福利 | “社区之星”(社区核心贡献者)成长故事征集

活动简介那些积极探索技术边界并持续对社区做出贡献的开发者是真正的技术英雄&#xff0c;是开发者的学习榜样&#xff0c;也是各个技术社区发展的生命力&#xff01;2020年即将结束&#xff0c;CSDN 为所有技术社区特别准备了一份年终福利&#xff01;CSDN 向所有技术社区&…

阿里云峰会|数据库也能自动驾驶?DAS全天候给你保驾护航!

阿里云峰会直播地址 2020年6月9日&#xff0c;“全速重构”2020阿里云线上峰会即将隆重召开。 在此次峰会上&#xff0c;阿里云数据库重磅发布云原生分布式数据库 PolarDB-X 、云原生数据仓库AnalyticDB、数据库自治服务DAS、云数据库专属集群、图数据库GDB、云数据库Cassandr…

阿里云峰会|阿里云数据中台重磅升级后拟扶持100万家企业数智化

6月9日&#xff0c;在2020阿里云线上峰会上&#xff0c;阿里巴巴集团副总裁、数据技术及产品部负责人朋新宇推出Quick Audience、Quick A两款全新产品&#xff0c;并升级Dataphin和Quick BI两款现有产品。同时&#xff0c;阿里云零售、金融、政务及互联网企业等四大行业数据中台…

软件设计师 - 函数依赖 和 范式

文章目录1.函数依赖&#xff1a;1.0.前提范例&#xff1a;1.1.函数依赖定义&#xff1a;1.2. 部分依赖1.3. 完全依赖2.范式2.1. 码、候选码、主码2.2.主属性和非主属性2.3.第一范式&#xff08;1NF&#xff09;2.4.第二范式&#xff08;2NF&#xff09;2.5.第三范式&#xff08…

SpringBoot 自定义线程池

文章目录一、自定义线程池1. yml配置2. 线程池配置属性类3. 开启异步线程支持4. 创建自定义线程池配置类5. service逻辑层6. controller控制层7. 效果图二、配置默认线程池2.1. yml2.2.线程池配置属性类2.3. 开启异步线程支持2.4. 装配线程池2.5. service逻辑层2.6. controller…

可用性SLA还不懂?看完这个故事就懂了

大家好&#xff0c;我是小编云BliBli&#xff0c; 这些天 领导问了我一个暴击我灵魂的问题&#xff1a; 什么是SLA&#xff1f;那么多9到底是什么意思&#xff1f; &#xff08;瓦特&#xff1f;&#xff1f;我怎么知道&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#…

如何通过 Serverless 轻松识别验证码?

来源 | Serverless责编 | 晋兆雨头图 | 付费下载于视觉中国前言Serverless 概念自被提出就倍受关注&#xff0c;尤其是近些年来 Serverless 焕发出了前所未有的活力&#xff0c;各领域的工程师都在试图将 Serverless 架构与自身工作相结合&#xff0c;以获取到 Serverless 架构…

软件设计师 - 计算机组成体系结构 -

主存和cahe地址映射 直接相联映射 cache块地址j &#xff0c;主存地址i &#xff0c; cache 的块数 n j i mod n 主存的每块都可以映射到cache的特定块上&#xff0c;冲突率高&#xff1b; 2.全相联映射 主存的任意块可以映射到cache的任意块上&#xff0c;冲突率低&#xf…

怀里橘猫柴犬,掌上代码江湖——对话阿里云MVP郭旭东

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 跟郭旭东聊过之后&#xff0c;我对程序员的敬佩又多一分。这个92年的开发者&#xff0c;难能可贵地兼备朝气…

防止重复提交 最佳实践

文章目录一、方案评估1. 前端2. 后端方案二、代码实战2.1. 依赖2.2. yml配置2.2. 相关配置类2.3. 实体类2.4. 相关工具类2.5. 操作消息提醒2.6. 过滤器2.2. 拦截器2.7.重复提交测试2.8. 效果图一、方案评估 1. 前端 提交后屏蔽提交按钮 2. 后端方案 实现原理 1.自定义重复提…

java实现 - 树的层序遍历

树&#xff1a; 树实体结构&#xff1a; Data public class Tree {//树的data值private String dataStr;//树的第一个孩子节点private Tree firstChild;//树的下一个孩子节点private Tree nextBrother; }代码实现&#xff1a; public class TreeTraversal {//队列&#xff…

金山云发布全新Serverless产品 云原生基础设施再升级

随着企业数字化转型的深入&#xff0c;云计算正全面步入2.0时代&#xff0c;即为云而生的阶段。以云原生为代表的理念&#xff0c;已经成为进一步释放云计算价值的核心推动力。 1月6日&#xff0c;金山云举行了云原生媒体沟通会&#xff0c;金山云副总裁、合伙人钱一峰在会上正…

如何提升微服务的幸福感

前言 随着微服务的流行&#xff0c;越来越多公司使用了微服务框架&#xff0c;微服务以其的高内聚、低耦合等特性&#xff0c;提供了更好的容错性&#xff0c;也更适应业务的快速迭代&#xff0c;为开发人员带来了很多的便利性。但是随着业务的发展&#xff0c;微服务拆分越来…

nacos未授权访问漏洞【原理扫描】

解决方案 vim /nacos/conf/application.properties添加 #开启认证配置 nacos.core.auth.enabledtrue

求AOE图的 拓扑排序 及关键路径长度(java实现)

文章目录1.AOE图&#xff1a;2.AOE图邻接链表存储结构&#xff1a;3.代码实现3.1.实体及参数初始化3.2.代码实现3.3.输出1.AOE图&#xff1a; 2.AOE图邻接链表存储结构&#xff1a; 3.代码实现 3.1.实体及参数初始化 //邻接表的链表节点 Data public class LinkedNode {//邻接…

陈旸:清华博士的模型信仰

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 陈旸是典型的天才学霸。10岁开始编程&#xff0c;亚洲奖、国奖拿到手软&#xff1b;创业做新媒体&#xff…

创业公司用 Serverless,到底香不香?

来源 | Serverless责编 | 晋兆雨头图 | 付费下载于视觉中国在过去的 5 年里&#xff0c;使用云厂商处理应用后台的流行程度大幅飙升。其一&#xff0c;初创企业主采用 Serverless 方式&#xff0c;以节省基础设施成本&#xff0c;并随用随付。随着公司规模的扩大&#xff0c;依…

Too many files with unapproved license: 2 See RAT report

解决方案 mvn -Prelease-nacos -Dmaven.test.skiptrue -Dpmd.skiptrue -Dcheckstyle.skiptrue -Drat.numUnapprovedLicenses100 clean install -U或者 mvn -Prelease-nacos -Dmaven.test.skiptrue -Drat.numUnapprovedLicenses100 clean install -U