云原生时代第一大生产力dubbogo 3.0_豆包同学在路上的博客-CSDN博客


本站和网页 https://blog.csdn.net/weixin_43507410/article/details/121584060 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

云原生时代第一大生产力dubbogo 3.0_豆包同学在路上的博客-CSDN博客
云原生时代第一大生产力dubbogo 3.0
豆包同学在路上
于 2021-11-27 21:36:44 发布
125
收藏
文章标签:
运维
linux
云原生
kubernetes
版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43507410/article/details/121584060
版权
自从 2011 年 Dubbo 开源之后,被大量中小公司采用,一直是国内最受欢迎的 RPC 框架。2014 年,由于阿里内部组织架构调整,Dubbo 暂停维护了一段时间,之后随着 Spring Cloud 的面世,两个体系在融合中一起助推了微服务的火热。
不过这世界变化快,自从以 docker 为代表的的容器技术和以 K8s 为代表的容器编排技术登上舞台之后,云原生时代到来了。在云原生时代,不可变的基础设施给原有的中间件带来了不可变的中间件基础设施:gRPC 统一了底层通信层;protobuf 统一了序列化协议;以 envoy + istio 为代表的 service mesh 逐渐统一了服务的控制面与数据面。
dubbogo 的天然使命是:Bridging the gap between Java and Go。保持 Go 应用与 Java 应用互联互通的同时,借助 Go 语言(事实上的第一云原生语言)的优势拥抱云原生时代。dubbogo 社区 2020 年勠力打造三支箭: 已经发布的对齐 dubbo 2.7 的 dubbogo v1.5 版本; 近期将要发布的 sidecar 形态的 dubbo-go-proxy 项目; 以及处于进行时的 dubbogo 3.0。
用一句话概括 dubbogo 3.0 即是:新通信协议、新序列化协议、新应用注册模型以及新的服务治理能力!本文主要着重讨论 dubbogo 3.0 的新通信协议和应用级服务注册发现模型。
dubbogo 3.0 vs gRPC 知己知彼,方能进步。dubbogo 3.0 的通信层改进主要借鉴了 gRPC。
gRPC 协议,简单来说就是 http2 协议的基础之上,增加了特定的协议 header:“grpc-” 开头的 header 字段,采用特定的打解包工具(protobuf)对数据进行序列化,从而实现 RPC 调用。
众所周知,gRPC 几乎没有服务治理能力,而阿里云现有 dubbo 框架兼具 RPC 和服务治理能力,整体实力不逊于 gRPC。但在“大家都用 gRPC” 这样的背景之下,dubbogo 3.0 的新通信协议就必须完美兼容 gRPC,对开发者已部署的服务完全兼容,并在此基础之上延续已有 dubbo 协议和服务治理能力,进而推出一系列新策略:比如 mesh 支持、应用级服务注册等。
dubbogo 3.0 vs dubbogo 1.5 目前已有的 dubbo 2.7 协议已经尽可能实现了 gRPC 的支持。开发者可以通过 protoc-gen-dubbo 工具将 pb IDL 协议转换为框架支持的 stub,再借助底层 gRPC conn 的 RPC 过程,将已有的服务治理能力自上而下传递给 gRPC,因此实现了 gRPC 服务的支持。
dubbo-go v1.5.x 也支持 gRPC 的 Stream 调用。和 unary RPC 类似,通过产生框架支持的 stub,在底层 gRPC stream 调用的基础之上,将流式 RPC 的能力和并入框架。但由于 dubbo v2.7.x / dubbo-go v1.5.x 本身并不支持流式调用,所以没有对 gRPC stream 调用的进行上层服务治理支持。
开发者所面临的问题就是:我们在使用 dubbo-go2.7 进行 grpc 协议传输的时候,或多或少不是那么放心。
而即将推出的 dubbo-go 3.0 协议将从根源解决这个问题。
协议兼容的三种层次 笔者认为,一款服务框架对于第三方协议的支持可分为三个程度:应用层次、协议层次、传输层次。
一款框架如果在一个协议的 sdk 之上封装接口,可以认为它处于应用层次支持,这样的框架需要遵循下层 sdk 的接口,可扩展性较差。
处于协议层次的框架,从配置层到服务治理层均由本框架提供,而在此之下的协议层到网络传输层均使用某个固定的通信协议,这样的框架可以解决服务治理的问题,但框架本身无法与第三方协议完全适配,如果不适配就会出现对第三方协议支持的削弱,比如上面说到的 dubbo-go 1.5 对 stream rpc 支持的缺陷。
如果想进一步支持更多的第三方协议,需要从传输层下手,真正了解第三方协议的具体字段、所依赖的底层协议(比如 HTTP2)的帧模型和数据流,再开发出与第三方协议完全一致的数据交互模块,作为本框架的底层。这样做的好处是最大程度赋予了协议的可扩展性,可以在兼容已有协议的基础之上,可选地增加开发者需要的字段,从而实现已有协议无法实现的功能,就比如 dubbogo 3.0 将支持的反压策略。
基于 HTTP2 的通信流程 gRPC 一次基于 HTTP2 的 unary rpc 调用传输主要流程如下: client 发送 Magic 信息: PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n; server 收到并检查是否正确; client 和 server 互相发送 setting 帧,收到后发送 ACK 确认; client 发送 Header 帧,包含 gRPC 协议字段,以 End Headers 作为 Header 结束标志; client 紧接着发送 Data 帧,包含 RPC 调用的 request 信息,以 End Stream 作为 Data 结束标志; server 调用函数获得结果; server 发送 Header 帧,包含 gRPC 协议字段,以 End Headers 作为 Header 结束标志; server 紧接着发送 Data 帧,包含 RPC 调用回传的 response 信息; server 紧接着再次发送 Header 帧,包含 RPC 状态和 message 信息,以 End Stream 作为本次 RPC 调用结束标志。
其中包含 gRPC 调用信息的 HTTP2 Header 帧如下图:
另外,在 gRPC 的 stream 调用中,可在 server 端回传的过程中发送多次 Data,调用结束后再发送 Header 终止 RPC 过程,并汇报状态信息。
dubbogo 3.0 的通信层将在 HTTP2 通信协议之上采用同样的通信流程,以保证与 gRPC 的底层通信沟通能力。
dubbogo 3.0 预期通信架构 除了通信协议采用 HTTP2 外,dubbogo 3.0 将采用基于 google protobuf 的 triple 协议【下面称为 dubbo3 协议】作为 dubbogo 3.0 的序列化协议,为 dubbo 将来支持更多的编程语言打下通信协议层面的基础。
目前设计的 dubbogo 3.0 传输模型如下:
为保证同时支持 unary RPC 和 stream RPC,在 server 端和 client 端增加数据流结构,以异步调用的形式完成数据传递; 继续支持原有的 TCP 通信能力; 在 HTTP2 的通信协议之上支持 dubbo3 协议,decode 过程兼容 gRPC 使用的 protobuf,保证与 gRPC 服务打通。
应用级服务注册发现
应用级服务注册发现介绍 dubbogo 3.0 使用的新一代服务注册发现体系,将摒弃旧版的“接口级注册发现”,使用“应用级别注册发现”。
简单地说,接口级别注册发现,在注册中心中以 RPC 服务为 key,以实例列表作为 value 来组织数据的,而我们新引入的“应用粒度的服务发现”,它以应用名(Application)作为 key,以这个应用部署的一组实例(Instance)列表作为 value。这带来两点不同: 数据映射关系变了,从 RPC Service -> Instance 变为 Application -> Instance; 数据变少了,注册中心没有了 RPC Service 及其相关配置信息。
可以认为,基于应用粒度的模型所存储和推送的数据量是和应用、实例数成正比的,只有当我们的应用数增多或应用的实例数增长时,地址推送压力才会上涨。
而对于基于接口粒度的模型,数据量是和接口数量正相关的,鉴于一个应用通常发布多个接口的现状,其数量级一般是比应用粒度的数十倍。另外一个关键点在于,接口的定义更多的是业务侧的内部行为,接口粒度导致的集群规模评估的不透明,而实例、应用增长都通常是在运维侧的规划之中,可控性较好。
工商银行曾经对这两个模型进行生产测算:应用级服务注册模型可以让注册中心上的数据量变成原来的 1.68%,新模型可以让 zookeeper 轻松至成 10 万级别的服务量和 10 万级别的节点量。
元数据中心同步机制的引入 数据中心的数据量变少所造成的结果,是 RPC 服务相关的数据在注册中心消失了,只有 application - instance 这两个层级的数据。为了保证这部分缺少的 RPC 服务数据仍然能被 Consumer 端正确的感知,我们在 Consumer 和 Provider 间建立了一条单独的通信通道,目前针对元数据同步有两种具体的可选方案,分别是: 内建 MetadataService; 独立的元数据中心,通过中细化的元数据集群协调数据。 兼容旧版本 dubbo-go 为了使整个开发流程对老的 dubbo-go 用户更透明,同时避免指定 provider 对可扩展性带来的影响),我们设计了一套 RPC服务到应用名的映射关系,以尝试在 consumer 自动完成 RPC 服务到 provider 应用名的转换。
这套设计可以让 dubbogo 3.0 中同时保持对 dubbo v2.6.x、dubbo v2.7.x 和 dubbo v3.0.x 三个大版的互联互通。
统一路由的支持 路由在概念上可以理解为从已有的所有 IP 地址列表中,根据特定的路由规则,挑选出需要的 ip 地址子集。路由的过程需要根据配置好的路由规则进行筛选,最终取所有路由规则的交集获得结果。多个路由如同流水线一样,形成一条路由链,从所有的地址表中筛选出最终目的地址集合,再通过负载均衡策略选择访问的地址。
路由链
可以把路由链的逻辑简单理解为 target = rn(…r3(r2(r1(src))))。对于每一个 router 内部的逻辑,可以抽象为输入地址 addrs-in 与 router 中按全量地址 addrs-all 实现切分好的 n 个互不相交的地址池 addrs-pool-1 … addrs-pool-n 按实现定义好的规则取交集作为输出地址。以此类推,完成整个路由链的计算。
failover 在路由规则配置文件中可以配置 failover 字段。在寻找地址失败时可以 failover, 选择其他 subset,并且顺序执行下来,直到找到地址,否则最后报地址找不到异常。 兜底路由 在的路由规则配置中,可以配置一个没有任何条件的 match, 最终的结果是至少会有一个 subset 被选到,以达到地址空保护的作用。
作者简介 李志信 (GitHubID LaurenceLiZhixin),阿里云云原生中间件团队开发工程师,dubbogo 社区开发者,中山大学软件工程专业在校学生,擅长使用 Go 语言,专注于云原生和微服务等技术方向。
于雨(github @AlexStocks),dubbo-go 项目和社区负责人,一个有十多年服务端做着基础架构研发一线工作经验的程序员,陆续参与改进过 Muduo/Pika/Dubbo/Sentinel-go 等知名项目,目前在蚂蚁金服可信原生部从事容器编排和 service mesh 工作。
※部分文章来源于网络,如有侵权请联系删除;更多文章和资料|点击后方文字直达 ↓↓↓ 100GPython自学资料包 阿里云K8s实战手册 阿里云CDN排坑指南
ECS运维指南 DevOps实践手册 Hadoop大数据实战手册 Knative云原生应用开发指南 OSS 运维实战手册 云原生架构白皮书 Zabbix企业级分布式监控系统源码文档 10G大厂面试题戳领
豆包同学在路上
关注
关注
点赞
收藏
打赏
评论
云原生时代第一大生产力dubbogo 3.0
自从 2011 年 Dubbo 开源之后,被大量中小公司采用,一直是国内最受欢迎的 RPC 框架。2014 年,由于阿里内部组织架构调整,Dubbo 暂停维护了一段时间,之后随着 Spring Cloud 的面世,两个体系在融合中一起助推了微服务的火热。不过这世界变化快,自从以 docker 为代表的的容器技术和以 K8s 为代表的容器编排技术登上舞台之后,云原生时代到来了。在云原生时代,不可变的基础设施给原有的中间件带来了不可变的中间件基础设施:gRPC 统一了底层通信层;protobuf 统一了序列化
复制链接
扫一扫
Dubbo(一):Dubbo 3.0
Men-DD
08-05
959
在服务注册领域,市面上有两种模型,一种是应用级注册(),一种是接口级注册,在Spring Cloud中,一个应用是一个微服务,而在Dubbo2.7中,一个接口是一个微服务。Spring Cloud在进行服务注册时,是把应用名以及应用所在服务器的IP地址和应用所绑定的端口注册到注册中心,相当于key是应用名,value是ip+port,Dubbo2.7中,是把接口名以及对应应用的IP地址和所绑定的端口注册到注册中心,相当于key是接口名,value是ip+port。.........
参与评论
您还未登录,请先
登录
后发表或查看评论
Apache ShardingSphere 在分布式数据库生态里的云原生实践
ShardingSphere官微
09-23
153
2022 年 9 月 16 日,在『2022 OSCAR 开源产业大会』现场,SphereEx 云原生高级技术专家苗立尧分享了以《Apache ShardingSphere 分布式数据库生态的云原生实践》为主题的技术演讲,本文整理于此分享。时代浪潮来袭:上云的机遇与挑战共存近年来,以 Kubernetes 为代表的云原生浪潮解放了运维生产力,使得微服务上线发布和治理提升了一个新台阶,微服务与云计算...
Dubbo 3.0新特性记录
敲代码的小小酥的博客
07-19
760
dubbo3.0特性
dubbo3.0新特性总结
mask哥
03-23
2545
dubbo3.0的变化:
1.服务发现模型:
2.0采用基于接口粒度的服务发现机制,3.0基于应用粒度的服务发现机制,有利于提高系统资源利用率,降低 Dubbo 地址的单机内存消耗(50%),降低注册中心集群的存储与推送压力(90%), Dubbo 可支持集群规模步入百万实例层次;
打通与其他异构微服务体系的地址互发现障碍。新模型使得 Dubbo3 能实现与异构微服务体系如Spring Cloud、Kubernetes Service、gRPC 等,在...
Dubbo3.0入门-Java版
最新发布
一名Java语言狂热分子。
11-21
2542
Dubbo3.0入门
dubbogo 3.0:牵手 gRPC 走向云原生时代
阿里巴巴云原生的博客
12-16
506
作者 | 李志信 于雨
来源|阿里巴巴云原生公众号
自从 2011 年 Dubbo 开源之后,被大量中小公司采用,一直是国内最受欢迎的 RPC 框架。2014 年,由于阿里内部组织架构调整,Dubbo 暂停维护了一段时间,之后随着 Spring Cloud 的面世,两个体系在融合中一起助推了微服务的火热。
不过这世界变化快,自从以 docker 为代表的的容器技术和以 K8s 为代表的容器编排技术登上舞台之后,云原生时代到来了。在云原生时代,不可变的基础设施给原有的中间件带来了不可变的中间件基.
[Dubbo3.0.8源码解析系列]-18-Dubbo3元数据服务MetadataService的导出
宋小生-中间件
06-18
911
MetadataService
此服务用于公开Dubbo进程内的元数据信息。典型用途包括:1。使用者查询提供者的元数据信息,以列出接口和每个接口的配置2。控制台(dubbo admin)查询特定进程的元数据,或聚合所有进程的数据。在Dubbo2.x的时候,所有的服务数据都是以接口的形式注册在注册中心,Dubbo3将部分数据抽象为元数据的形式来将数据存放在元数据中心,然后元数据由服务提供者提供给消费者而不是再由注册中心进行推送,如下图所示:
//未完待续............................
Dubbo3 Triple 协议简介与选型思考
阿里巴巴云原生的博客
12-15
3145
Dubbo3 提供了 Triple(Dubbo3)、Dubbo2 协议,这是 Dubbo 框架的原生协议。除此之外,Dubbo3 也对众多第三方协议进行了集成,并将它们纳入 Dubbo 的编程与服务治理体系。
阿里集团业务驱动的升级 - 聊一聊 Dubbo 3.0 的演进思路
阿里云技术
07-27
116
三位一体
2020年底,阿里云提出了“三位一体”的理念,目标是希望将“自研技术”、“开源项目”、“商业产品”形成统一的技术体系,令技术的价值可以达到最大化。
阿里集团内部的 HSF 框架在经历了多年双十一流量洪峰的考验后,锻炼出了高性能和高可用的核心竞争力。而对于 Dubbo,作为国内外最受欢迎的服务治理框架之一,它的开源亲和性就不用再多说了。
Dubbo 3.0 作为三位一体架构的首推方案,在集团内被寄予厚望。它完美融合了内部 HSF 的特性,天然拥有高性能、高可用的核心能力,我们期望用它来解决
阿里 双11 同款,流量防卫兵 Sentinel go 源码解读
阿里巴巴云原生的博客
10-21
1656
作者 | 于雨 apache/dubbo-go 项目负责人
本文作者系 apache/dubbo-go 项目负责人,目前在 dubbogo 项目中已内置可用 sentinel-go,如果想单独使用可参考 在 dubbo-go 中使用 sentinel 一文,若有其他疑问可进 dubbogo社区【钉钉群 23331795】进行沟通。
导读:本文主要分析阿里巴巴集团开源的流量控制中间件 Sentinel,其原生支持了 Java/Go/C++ 等多种语言,本文仅仅分析其 Go 语言实现。下文如无特.
Dubbo3.0 简介
web15085181368的博客
04-01
88
大白话解析 Dubbo3.0
m0_68850571的博客
08-01
254
总结一下3.0关键几点借助SPI实现相关探针,使得生命周期可以被容器感知,即生命周期与容器对齐。接入KubernetesServiceAPI,使得注册中心相关功能下沉,而不用额外利用ZK等第三方注册中心。将接口级别的服务发现改成应用级别,解决了大规模微服务架构体系下,元数据膨胀的瓶颈,并对其市面常见的发现级别,便于异构的实现。升级通信协议为Triple,选择了HTTP2+ProtocolBuffer的形式,丰富了请求模型。httpshttpshttps。...
无责任畅想:云原生中间件的下一站
阿里巴巴云原生的博客
02-08
566
作者 | 于雨
来源|阿里巴巴云原生公众号
本文源自 2020 年 12 月 20 日作者在云原生社区 meetup 第二期北京站演讲 《Apache Dubbo-go 在云原生时代的实践与探索》的部分内容,如果对演讲完整内容感兴趣请访问:
https://www.bilibili.com/video/av245840877
自从以 2013 年开源的 docker 为代表的的容器技术和以 2014 年开源的 K8s 为代表的容器编排技术登上舞台之后,相关技术从业人员从认知和体感上.
Golang程序性能分析(三)用pprof分析gRPC服务的性能
kevin_tech的博客,微信搜「网管叨bi叨」
12-02
759
这是Golang程序性能分析系列文章的最后一篇,这次我们的主要内容是如何使用pprof工具对gRPC服务的程序性能进行分析。关于gRPC这个框架的文章之前已经写过不少文章了,如果你对它还...
go使用grpc实现异步_使用Go语言实现一个异步任务框架
weixin_39849254的博客
12-27
871
推荐阅读原文获得最佳体验:使用Go语言实现一个异步任务框架 - Jiajun的编程随想如何使用Go语言实现一个简单的异步任务框架呢?且听我一一道来。首先我们看一下常见的任务队列的架构:所以作为一个任务队列,主要有这么几个部分组成:Producer,负责把调用者的函数、参数等传入到broker里Consumer,负责从broker里取出消息,并且消费,如果有持久化运行结果的需求,还需要进行持久化选择...
dubbo-go v3 版本 go module 踩坑记
阿里云开发者
06-07
213
简介:该问题源于我们想对 dubbo-go 的 module path 做一次变更,使用 dubbo.apache.org/dubbo-go/v3 替换之前的 github.com/apache/dubbo-go。作者 | 董剑辉、盛傲飞来源 | 阿里巴巴云原生公众号​问题背景​该问题源于我们想对 dubbo-go 的 module path 做一次变更,使用 dubbo.apache.org/dubbo-go/v3 替换之前的 github.com/apache/dubbo-go。​首先,我们做了路径映射
Dubbo3.0系列(2)- Dubbo3.0核心概念与架构
qq_43437874的博客
09-07
1275
前言
本文整理内容来自官网:https://dubbo.apache.org/zh/docs/concepts/
服务发现
服务发现,即消费端自动发现服务地址列表的能力,是微服务框架需要具备的关键能力,借助于自动化的服务发现,微服务之间可以在无需感知对端部署位置与 IP 地址的情况下实现通信。
Dubbo中的服务发现
实现服务发现的方式有很多种,Dubbo 提供的是一种 Client-Based 的服务发现机制,通常还需要部署额外的第三方注册中心组件来协调服务发现过程,如常用的 Nacos、Consul、Z
Dubbo3.0系列(1)- RPC及Dubbo简介
qq_43437874的博客
09-07
791
RPC
概念
RPC是远程过程调用(Remote Procedure Call)的缩写形式。
国际互联网工程任务组(The Internet Engineering Task Force,简称 IETF)是一个公开性质的大型民间国际团体。IETF的主要任务是负责互联网相关技术标准的研发和制定,是国际互联网业界具有一定权威的网络相关技术研究团体。
RFC(Request For Comments) 是由互联网工程任务组(IETF)发布的文件集。文件集中每个文件都有自己唯一编号,例如:rfc1831。目前RFC
go使用grpc实现异步_使用Go实现Async/Await模式 | Gopher Daily (2020.11.29)
weixin_42303803的博客
11-30
496
每日一谚:Design simple interfaces.Go技术专栏“改善Go语⾔编程质量的50个有效实践”主要满足广大gopher关于Go语言进阶的需求,围绕如何写出地道且高质量Go代码给出50条有效实践建议,上线后收到一致好评! 欢迎大家订阅!Go技术新闻go module缺陷:无法导入main包 - https://appliedgo.net/testmain/使用Go实现Async/...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
豆包同学在路上
CSDN认证博客专家
CSDN认证企业博客
码龄4年
暂无认证
74
原创
18万+
周排名
5万+
总排名
7万+
访问
等级
1806
积分
69
粉丝
30
获赞
24
评论
208
收藏
私信
关注
热门文章
超全!常见自动化运维工具全解析(含ansible、Puppet、SaltStack教程)
5507
字节跳动年薪50W抢Go开发人才,你还在问该不该学?
3766
Golang 实现一个简单的 http 代理
2572
Go 开发者 Top 6 IDE:你知道几个,又用哪个?
1787
shell脚本保姆级教程,附赠100个shell脚本案例!
1779
分类专栏
IT
17篇
运维自动化
6篇
笔记
4篇
Python知识点
4篇
Linux学习
16篇
最新评论
阿里内部资料!117页DevOps实践手册,附网盘链接
hero_shaoshuai:
所以解压密码是什么
Python 中 4 个高效的技巧
普通网友:
博主的文章都是干货呀,很实用,可以加您微信随时交流吗?感谢
Linux常用命令大全!无需死记硬背!建议收藏!
睿思达DBA_WGX:
非常好,感谢。
Linux防火墙入门级教程——iptables、firewalld配置详解
睿思达DBA_WGX:
防火墙简单配置一下即可。
不看后悔!阿里内部技术参考图册算法篇!(附网盘链接)
豆包同学在路上:
文明?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Istio 1.14 发布
一种灵活注入 Istio Sidecar 的方案探索
运维,放过监控-也放过自己吧
2022年8篇
2021年82篇
2020年12篇
2018年1篇
目录
目录
分类专栏
IT
17篇
运维自动化
6篇
笔记
4篇
Python知识点
4篇
Linux学习
16篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
豆包同学在路上
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值