Dubbo为什么要用Go重写?
先说两句
我常常在散步时思考很多技术上的「为什么问题」,有时一个问题会想很久,直到问题的每一个点都能说服自己时,才算完结。于是想把这些思考记录下来,形成文章,可以当做一个新的系列。这些文章中你可能看不到代码,但能窥探到一些容易被忽视的问题,以及问题更深层次的「为什么」。
今天带来第1
篇,Dubbo为什么要用Go重写?
诞生于阿里巴巴,2011年开源的Dubbo已经走过了10个年头。在2019年,它被用Go重写并开源,如今两年过去,已经从当初的V1.0.0
版本发展到了V3.0.0
,截止目前star数3.8K。
有一次同事问我,为什么Dubbo这么"老"的项目还要用Go重写,有什么现实意义吗?
今天就来谈谈我的一些看法。
连接过去和未来
我觉得要回答好这个问题,得从Dubbo-go的初衷谈起,github主页上它是这样介绍自己的:
官方给出的中文翻译是
Apache Dubbo Go 语言实现,架起 Java 和 Golang 之间的桥梁,与 gRPC/Dubbo 生态互联互通,带领 Java 生态享受云原生时代的技术红利。
我再通俗地翻译一下:一个公司或部门内有人用Java版Dubbo,有人用Go,这两者需要通信,于是就有了Dubbo-Go,用来解决通信问题。
所以第一个问题来了,为什么一个公司用了Java,又用了Go?
编程语言的抉择
对于编程语言的选择,在商业公司里,我觉得最最主要考虑的点就是效率,至于其他的点都是次要。因为商业公司的主要目的就是盈利,不管什么语言,只要能用最低的成本拿到相等的收益就是好语言。
效率又包含了好几个方面:
- 开发效率。开发效率高,项目能早日上线,占领市场,也能节约人力成本
- 运行效率。运行效率高,能省下服务器成本
纵观国内很多商业公司的选择都是如此考虑,比如阿里。
阿里早期是PHP,选择PHP的考量点主要是开发效率,但随着业务的发展,PHP的性能无法支撑,必须得换一个运行效率高的语言。
运行效率高自然想到C/C++,但这两个语言的开发效率低,得在开发效率和运行效率中找到一个平衡点,于是阿里选择了Java。
阿里官方在知乎上回答为什么选择Java时,主要有以下几点考虑:
性能、简单易学、生态丰富、社区活跃
把性能放第一位,简单易学、生态丰富、社区活跃其实也都是说的开发效率,正是有了这些优点,开发效率才高。
当阿里巴巴选择Java后,自研了大量的Java中间件,培养了大量的Java人才,所以其他公司在技术选型时,也参考了阿里巴巴,导致越来越多的公司选择了Java。
而选择Go也是如此,一些年轻的公司早期可能是PHP、Python等脚本语言,等发展壮大后,不得不面临和阿里一样的问题:性能问题。
在2012年Go发布了,大家又多了一个选择,Go既有很高的性能,又非常地简单易上手,像字节跳动这类新公司就以Go为主。
所以综合来看,选择Java或者Go都是合理的,存在即合理。
为什么有公司选择了Java,又想用Go呢?
- Go语言相比Java有启动快,编译速度快、占用内存小、擅长高并发(协程)的特性,所以在已经有Java的公司,也会考虑Go,只不过目前这类公司占比不多。
- 某些公司没有强制的技术栈,所以新部门新业务可以摆脱束缚,选择新语言Go来进行开发。
小结
综上看来,选择Java或选择Go都合理,一个公司内两者都选择,也有合理之处,虽然占比不多,但还是有Java和Go通信的需求。
Dubbo在RPC框架中的胜出
公司早期通常是单体服务,在规模达到一定程度,单体应用无法支撑业务发展时,会选择微服务架构,这时就需要一个好用的RPC框架。
能适配Java语言的RPC框架中,Dubbo是国内最早开源,于2011年开源。
而和他类似的竞品如Spring Cloud在2014年开源,微博的Motan在2017年开源,跨语言的gRPC在2015年开源,Thrift 2007年开源。
只有Thrift 比它早,但Thrift只是个RPC框架,Dubbo可是包含了开箱即用的服务治理能力,如服务注册与发现、负载均衡、容错、动态配置等等。
可以说早期Java的RPC框架没得选。
就算到了RPC框架百花齐放的时代,这么多公司的使用加上阿里的背书,Dubbo也有它的一席之地。
小结
当一个公司选择了Java编程语言和Dubbo框架(这种选择还是挺多的),后来又想尝试Go,或者一些新业务、新部门想尝试Go时,他们就面临了一个难题,Go如何跟Java的Dubbo通信。
由于Dubbo协议是私有协议,用Go重新实现一遍的代价还是挺大。于是Dubbo-Go应运而生,从这个角度看,Dubbo-Go在连接Java和Go的通信这条路上还是具有相当大的价值的。
终结与线程池的斗争
如果使用了Dubbo框架,很多时候需要一个Dubbo网关,关于Dubbo网关可以参考我这篇文章:《微服务网关演进之路》。
在这篇文章中,详细介绍了一款Dubbo网关的背景、难点、选型、设计、演进以及踩坑经历,其中我花了大篇幅介绍了「与线程池所做的斗争」,在Java中,线程是很宝贵的,但Dubbo网关如果是同步调用,必须一个请求占用一个线程,这就导致并发上不去,而且线程池打满后,会影响其他请求。
所以解决方案要么是隔离线程池,要么改成异步调用。隔离线程池只解决了请求不相互影响,但并发还是上不去,改成异步调用可以完美解决,但是编码实在是太复杂。
而Go的协程可以刚好解决这个问题,Go的协程很轻量,调度效率也更高,所以我们可以用简单的代码写出非常高效率的网关。
举个例子可以直观感受一下,Nginx的性能大家有目共睹,但如果用Java来实现,不知道得堆多少机器才能达到Nginx的性能,但百度在反向代理上使用了Go写的BFE来代替Nginx,可见其性能有多夸张。
关于协程的介绍和原理,可以参考我这篇文章:《写了一年golang,来聊聊进程、线程与协程》。
小结
所以在Dubbo网关上,Dubbo-Go也提供了一种新的解法,已经有用于线上的Dubbo-Go网关,开源项目参考Dubbo-go-pixiu
。
为Dubbo Mesh铺路
Service Mesh也渐渐成为了下一代微服务架构,Go在Mesh上也绝对是一个闪亮的明星语言,无论是K8S、Docker等云原生基础设施都采用Go编写,还是Go的开发速度以及协程的高并发能力,都使它成为了Mesh的首选语言。
基于此,Dubbo的Mesh化,Dubbo-Go也为其铺平了道路,但目前Dubbo Mesh还处于小面积阶段,完整落地的方案并没有开源,从这点上来说,如果某公司想走Dubbo Mesh化之路,Dubbo-Go可能也是他们要着重考虑的点之一。
总结
说了这么多,该正面回答Dubbo为什么要用Go重写,这个问题的答案还是官方给出的那句话:架起 Java 和 Golang 之间的桥梁。至于为什么要「架起这座桥梁」,有如下几个关键点:
- 搜索关注微信公众号"捉虫大师",回复关键字「Nacos」送你一本《Nacos架构与原理》电子书,Dubbo资料也在准备中,不想错过可以点个关注。
Dubbo为什么要用Go重写?的更多相关文章
- duboo服务使用thrift协议 + MQ
写一篇博客来记录从 Python 转型到 Java 的学习成果.整体架构: rpc: dubbo + thrift idl: thrift registeration: zookeeper MQ: k ...
- Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题
现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...
- dubbo连接zookeeper注册中心因为断网导致线程无限等待问题【转】
最近维护的系统切换了网络环境,由联通换成了电信网络,因为某些过滤规则导致系统连不上zookeeper服务器(应用系统机器在深圳,网络为电信线路,zookeeper服务器在北京,网络为联通线路),因为我 ...
- dubbo/dubbox 增加原生thrift及avro支持
(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...
- dubbo properties
DUBBO配置项的优先级: java -D优先于 Spring配置,Spring配置优先于 properties文件的配置,这也符合一般项目的规则. 覆盖策略: JVM启动-D参数优先,这样可以使用户 ...
- 为什么dubbo使用ZkClient作为zookeeper的客户端
本文内容并非原创,使用资料均来自互联网. dubbo使用了zkClient而不是使用zookeeper本身的客户端与zookeeper进行交互,为什么呢? 先看看zookeeper本身自带的客户端的问 ...
- RPC实现原理(HSF、dubbo) 从头开始(一)
前言 阔别了很久博客园,虽然看了以前写的很多东西感觉好幼稚,但是还是觉得应该把一些自己觉得有用的东西和大家分享.废话不多说,现在开始进入正题. 之前的六年工作经验,呆过了一些大公司,每个在大公司呆过的 ...
- dubbo 运行过程
Overview Architecture Provider: 暴露服务的服务提供方. Consumer: 调用远程服务的服务消费方. Registry: 服务注册与发现的注册中心. Monitor: ...
- Dubbo的使用简介
Dubbo是什么 官方定义 DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000, ...
随机推荐
- Learning Spark中文版--第五章--加载保存数据(2)
SequenceFiles(序列文件) SequenceFile是Hadoop的一种由键值对小文件组成的流行的格式.SequenceFIle有同步标记,Spark可以寻找标记点,然后与记录边界重新 ...
- Spark的shuffle和MapReduce的shuffle对比
目录 MapperReduce的shuffle Spark的shuffle 总结 MapperReduce的shuffle shuffle阶段划分 Map阶段和Reduce阶段 任务 MapTask和 ...
- vue2 安装打包部署
vue2项目搭建记录 mkdir -p /opt/wks/online_pre/1006cd /opt/wks/online_pre/1006mkdir hongyun-ui /opt/code/vu ...
- Java Bean 与Spring Bean 的区别
什么是JavaBean: JavaBean是一种JAVA语言写的可重用组件.JavaBean符合一定规范写的Java类,是一种规范.它的方法命名,构造以及行为必须符合特定的要求: 1.所有属性 ...
- logstash 正则表达式
正则表达式 3. 使用给定好的符号去表示某个含义 4. 例如.代表任意字符 5. 正则符号当普通符号使用需要加反斜杠 正则的发展 6. 普通正则表达式 7. 扩展正则表达式 普通正则表达式 . 任意一 ...
- 微服务下前后端分离的统一认证授权服务,基于Spring Security OAuth2 + Spring Cloud Gateway实现单点登录
1. 整体架构 在这种结构中,网关就是一个资源服务器,它负责统一授权(鉴权).路由转发.保护下游微服务. 后端微服务应用完全不用考虑权限问题,也不需要引入spring security依赖,就正常的 ...
- Typora软件使用教程
Typora软件的使用教程 Typora软件简介 Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.当然重点是免费. Typora编 ...
- Windows查看端口被占用的程序!
"到底是谁占用了80端口,该怎么查,怎么终止它?",这里就简单讲解一下,在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下的 ...
- ciscn_2019_c_1 1
步骤: 先checksec,看一下开启了什么保护 可以看到开启了nx保护,然后把程序放入ida里面,观察程序代码 先shift+f12观察是否有system和binsh函数 发现没有system和bi ...
- 一道栈溢出babystack
我太天真了,师傅说让我做做这个平台的题,我就注册了个号,信心满满的打开了change,找到了pwn,一看第一道题是babystack,我想着,嗯,十分钟搞定他!直到我下载了题目,题目给了libc,然后 ...