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网关的背景、难点、选型、设计、演进以及踩坑经历,其中我花了大篇幅介绍了「与线程池所做的斗争」,在Java中,线程是很宝贵的,但Dubbo网关如果是同步调用,必须一个请求占用一个线程,这就导致并发上不去,而且线程池打满后,会影响其他请求。
所以解决方案要么是隔离线程池,要么改成异步调用。隔离线程池只解决了请求不相互影响,但并发还是上不去,改成异步调用可以完美解决,但是编码实在是太复杂。
而Go的协程可以刚好解决这个问题,Go的协程很轻量,调度效率也更高,所以我们可以用简单的代码写出非常高效率的网关。
举个例子可以直观感受一下,Nginx的性能大家有目共睹,但如果用Java来实现,不知道得堆多少机器才能达到Nginx的性能,但百度在反向代理上使用了Go写的BFE来代替Nginx,可见其性能有多夸张。
小结
所以在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 之间的桥梁。至于为什么要「架起这座桥梁」,参考下图:
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
Dubbo为什么用Go重写?相关推荐
- 都2022年了,还在争论编程语言?
2021年最后一天,我在公众号发表了文章<Dubbo为什么用Go重写>,在各个平台的阅读量和打开率都挺高,也有各位大佬纷纷转载,在这里也顺便感谢各位大佬. 虽然自己公众号没有开通留言,但我 ...
- 大厂偏爱的Agent技术究竟是个啥
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. hello大家好,我是小楼,今天给大家分享一个关于Agent技术的话题,也是后端启 ...
- 重写RuoYi-Cloud所有功能 整合 SpringCloudAlibaba Dubbo Mybatis-Plus MQ OSS ES Xxl-Job Docker 全方位升级 定期同步
平台简介 RuoYi-Cloud-Plus 微服务通用权限管理系统 重写 RuoYi-Cloud 全方位升级(不兼容原框架) 系统演示: 传送门 分布式集群版本(功能一致) 功能介绍 使用技术 文档地 ...
- 如何参与贡献Dubbo社区
如何参与贡献Dubbo社区 文字版首发于dubbo.io官网:http://dubbo.apache.org/zh-cn/blog/how-to-involve-dubbo-community.htm ...
- kafka实现异步发送_Kafka 异步消息也会阻塞?记一次 Dubbo 频繁超时排查过程
线上某服务 A 调用服务 B 接口完成一次交易,一次晚上的生产变更之后,系统监控发现服务 B 接口频繁超时,后续甚至返回线程池耗尽错误 Thread pool is EXHAUSTED.因为服务 B ...
- JDK/Dubbo/Spring 三种 SPI 机制,谁更好?
点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6950266942875779108 SPI 全称为 Service Provider Interface,是一种服务发现机 ...
- Dubbo基础专题——第四章(Dubbo整合Nacos分析细节点)
应广大的读者要求,也是公司目前需要一些支持,我就自己亲身搭建一个Springboot+nacos+dubbo的框架和项目,并演示dubbo面对一些系统的 业务场合,应该怎么去做支持,文章中我会先贴出代 ...
- 【Dubbo源码阅读系列】之远程服务调用(上)
今天打算来讲一讲 Dubbo 服务远程调用.笔者在开始看 Dubbo 远程服务相关源码的时候,看的有点迷糊.后来慢慢明白 Dubbo 远程服务的调用的本质就是动态代理模式的一种实现.本地消费者无须知道 ...
- Dubbo作者亲述:那些辉煌、沉寂与重生的故事
摘要: Dubbo 这个名字,最后会变成一个 Apache 的商标,会成为一个在 GitHub 上有 2 万多人关注.一百多人参与贡献的超级项目. 梁飞在 2011 年开源 Dubbo 这个项目的时候 ...
最新文章
- Photoshop自由变换图形大小
- 【视频课】深度学习必备基础,如何使用好数据?
- 8个直播底层支撑的创业机会,你都抓住了吗?
- js 数组/对象/日期的浅克隆
- Linux下怎么确定Nginx安装目录
- ssh key加密解密原理
- 【EASYDOM系列教程】之创建页面元素
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明) AC(带悔贪心)
- leetcode 746. 使用最小花费爬楼梯(dp)
- 修改Tomcat端口号
- php 发帖代码,我的论坛源代码(四)_php
- APPSCAN学习目录
- Python图像库PIL的类Image及其方法介绍
- 对于Java接口的独到理解
- 我的Java学习之路(三)-- 自动饮料售卖机控制台程序
- Web标准概念--摘抄《CSS布局实录》
- android 仿qq发动态,Android opengl 实现动态贴纸(仿QQ的拍摄)
- iframe去除边框
- 减肥平台期突破宝典,你必须拥有!
- 最新最完整的全国省市级json数据
热门文章
- Java基础入门笔记-单根继承
- 专业课程设计之客户与服务器程序的同步与通信机制的设计(二)TCP通信
- android日志打印机制,Android4_使用Log打印
- php关闭gd库,详解php开启gd库的两种方法
- 面试题 gety() getTop() TranslationY关系
- Acticity 启动 AMS
- C语言查看文件fp指针位置
- u盘启动pxe安装linux,U盘启动安装centos5.5+centos6.3+PXE网络安装CentOS
- java传输文件暂停_java – 在文件下载中实现暂停/恢复
- 【算法刷题1】二叉树的前序遍历