我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Dubbo 为什么用 Go 重写?

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Dubbo 为什么用 Go 重写?

[[443126]]

先说两句

我常常在散步时思考很多技术上的「为什么问题」,有时一个问题会想很久,直到问题的每一个点都能说服自己时,才算完结。于是想把这些思考记录下来,形成文章,可以当做一个新的系列。这些文章中你可能看不到代码,但能窥探到一些容易被忽视的问题,以及问题更深层次的「为什么」。

今天带来第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年开源,Thrift2007年开源。

只有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铺路

ServiceMesh也渐渐成为了下一代微服务架构,Go在Mesh上也绝对是一个闪亮的明星语言,无论是K8S、Docker等云原生基础设施都采用Go编写,还是Go的开发速度以及协程的高并发能力,都使它成为了Mesh的首选语言。

基于此,Dubbo的Mesh化,Dubbo-Go也为其铺平了道路,但目前DubboMesh还处于小面积阶段,完整落地的方案并没有开源,从这点上来说,如果某公司想走DubboMesh化之路,Dubbo-Go可能也是他们要着重考虑的点之一。

总结

说了这么多,该正面回答Dubbo为什么要用Go重写,这个问题的答案还是官方给出的那句话:架起 Java 和 Golang之间的桥梁。至于为什么要「架起这座桥梁」,参考下图:

以上就是Dubbo 为什么用 Go 重写?的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Dubbo 为什么用 Go 重写?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

为什么要重写Flex组件

这篇文章主要为大家展示了“为什么要重写Flex组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“为什么要重写Flex组件”这篇文章吧。重写Flex组件一、为什么要重写Flex组件1、在Flex已
2023-06-17

Java中为什么重写equals()也需要重写hashCode方法

这篇文章主要介绍了Java中为什么重写equals()也需要重写hashCode(),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-17

用 go 重写文件最快的方法是什么

问题内容我有一个大文件(无法完全放入内存),其中包含各种大小的字符串。我想将这些字符串重写到另一个文件中,但每个字符串都大写。在 go 中实现这一目标的最快方法是什么?这是我能想到的最有效的方法。关于如何使其更快的任何想法?packa
用 go 重写文件最快的方法是什么
2024-02-06

macos用什么写go语言

这篇文章主要介绍macos用什么写go语言,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!macos可以编写go语言代码的IDE:1、LiteIDE,一个为Golang设计的IDE;2、VSCode,通过安装Go扩展即
2023-06-06

为什么 Go 中读写文件比 Perl 慢很多?

为什么 Go 中读写文件比 Perl 慢很多?这是很多开发者在使用这两种编程语言时经常遇到的问题。在这篇文章中,php小编草莓将为您解答这个问题。在比较 Go 和 Perl 读写文件的速度时,我们需要考虑到两个关键因素:语言特性和底层实现。
为什么 Go 中读写文件比 Perl 慢很多?
2024-02-09

go语言为什么叫go

go语言叫go的原因:想表达这门语言的运行速度、开发速度、学习速度(develop)都像gopher一样快。gopher是一种生活在加拿大的小动物,go的吉祥物就是这个小动物,它的中文名叫做囊地鼠,它们最大的特点就是挖洞速度特别快,当然可能不止是挖洞啦。
2022-11-28

为什么Go语言被命名为Go?

Go语言,也称为Golang,是由谷歌公司开发的一种编程语言。它的设计目标是兼顾高效性、可读性和简洁性。Go语言在云计算、大数据处理、网络编程等领域得到了广泛的应用。然而,对于许多人来说,Go语言的一个疑问是:为什么选择将这门语言命名为“G
为什么Go语言被命名为Go?
2024-03-07

java中重写是什么

当子类需要父类的功能,而子类有新的内容,可以重写父类中的方法。在实际开发过程中,随着代码量的逐渐增加,维护成了一个很大的问题,如果需要对某个方法进行修改,其本身代码以及其子类代码都会受到影响,而重写则很好的解决了这个问题。方法重写又称为方法覆盖、方法复写。
java中重写是什么
2018-10-06

springmvc使用dubbo的方法是什么

SpringMVC使用Dubbo的方法主要包括以下步骤:配置Dubbo的服务提供者和消费者:在Dubbo的配置文件中配置服务提供者和消费者的相关信息,包括服务接口、服务实现类、注册中心地址等。在SpringMVC中引入Dubbo依赖:在Sp
springmvc使用dubbo的方法是什么
2024-04-03

一般用什么软件写go语言

写go语言的软件有:1、LitelDE,是一个简单的开源IDE;2、VS Code,是微软开发的广受欢迎的开源IDE;3、Atom,是“Atom DE”改进的语言集成和更智能的编辑器;4、Vim,有许多插件可以帮助开发人员更轻松地编辑他们的
2023-07-17

dubbo之@Reference注解有什么作用

这篇文章主要介绍“dubbo之@Reference注解有什么作用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“dubbo之@Reference注解有什么作用”文章能帮助大家解决问题。目的看看dubb
2023-07-05

dubbo的spi机制有什么用途

Dubbo的SPI(Service Provider Interface)机制可以实现插件化的扩展和灵活的配置,让用户可以在不修改源码的情况下改变框架的行为。具体用途包括:实现扩展点:在Dubbo中,通过SPI机制,用户可以自定义实现某个接
dubbo的spi机制有什么用途
2024-04-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录