- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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呢?
综上看来,选择Java或选择Go都合理,一个公司内两者都选择,也有合理之处,虽然占比不多,但还是有Java和Go通信的需求.
公司早期通常是单体服务,在规模达到一定程度,单体应用无法支撑业务发展时,会选择微服务架构,这时就需要一个好用的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.
Service Mesh也渐渐成为了下一代微服务架构,Go在Mesh上也绝对是一个闪亮的明星语言,无论是K8S、Docker等云原生基础设施都采用Go编写,还是Go的开发速度以及协程的高并发能力,都使它成为了Mesh的首选语言.
基于此,Dubbo的Mesh化,Dubbo-Go也为其铺平了道路,但目前Dubbo Mesh还处于小面积阶段,完整落地的方案并没有开源,从这点上来说,如果某公司想走Dubbo Mesh化之路,Dubbo-Go可能也是他们要着重考虑的点之一.
说了这么多,该正面回答Dubbo为什么要用Go重写,这个问题的答案还是官方给出的那句话:架起 Java 和 Golang 之间的桥梁。至于为什么要「架起这座桥梁」,参考下图:
原文链接:https://mp.weixin.qq.com/s/7pS9KfJsj3u9Ufg4gZ1VhA 。
最后此篇关于Dubbo 为什么用 Go 重写?的文章就讲到这里了,如果你想了解更多关于Dubbo 为什么用 Go 重写?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
异常拦截器ExceptionMapper 在JAX-RS(Java API for RESTful Web Services)中,ExceptionMapper接口用于将Java异常映射到HTTP响
1、RPC原理 一次完整的RPC调用流程如下: 1)服务消费方(client)调用以本地调用方式调用服务; 2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体; 3
Dubbo 什么是Dubbo dubbo:是一个基于soa思想的rpc框架 soa思想:面向服务的架构 给每一个模块暴露对应的ip和端口,当做一个服务进行运行 重点在于服务的管理(负载均衡,容灾模式,
分布式框架-Dubbo Dubbo与spring整合!! 导入坐标 org.apache.dubbo dubbo 3.0.6 org.apache.cu
分布式基础理论 1. 什么是分布式系统? 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个系统 2. 应用架构演变 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起
一、基础知识 1. 为什么要用 Dubbo? 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服
前言 在Dubbo中有Filter使用,对于Filter来说我们会遇到这样的问题,Filter自身有很多的实现,我们希望某种条件下使用A实现,另外情况下使用B实现,这个时候
前言 Dubbo源码阅读分享系列文章,欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制
dubbo logback输出日志 两者皆为国内使用比较广的两个开源框架:一个是服务治理框架,另一个则是日志框架。这个问题的解决方案一部分就在dubbo官网上: dubbo的日志适配 缺省自动
关于dubbo的配置使用已经配置好了简单的示例,下面先记录下dubbo管理控制台的安装和使用(用的zookeeper的注册中心),在网上找了些按照示例 dubbo管理控制台开源部分主要包含: 提供
Dubbo 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动式计算架构势在必行,急需一个治理系统确保架构有条不紊的演进。 单一应用架构 当网站流量很小时,
在dubbo-admin-0.0.1-SNAPSHOT.jar的路径下启动dubbo,java -jar dubbo-admin-0.0.1-SNAPSHOT.jar dubbo-admin-
1、下载tomcat 镜像 1
javax.validation和jakarta.validation都是用于Java中进行数据验证(validation)的相关API,它们提供了一套标准的验证框架,用于验证Java对象的属性是否符
一般情况我们使用dubbo)通过rpc调用dubbo提供方的服务,首先要在消费者的项目中引入接口提供者的jar包(provider端暴露的接口和方法),然后使用jar包里面的类和方法,两端才能正常
Zipkin是一个分布式跟踪系统。它有助于收集解决服务体系结构中的延迟问题所需的计时数据。功能包括此数据的收集和查找。 如果日志文件中有跟踪 ID,则可以直接跳转到该 ID。否则,您可以根据服务、操
先说两句 我常常在散步时思考很多技术上的「为什么问题」,有时一个问题会想很久,直到问题的每一个点都能说服自己时,才算完结。于是想把这些思考记录下来,形成文章,可以当做一个新的系列。这些
大家可以自行百度下阿里分布式事务,在这里我就不啰嗦了。下面是阿里分布式事务开源框架的一些资料,本文是springboot+dubbo+fescar的集成。 快速开始 https://github
昨天发布了注解方式,有人给我发了邮件希望能出一版本xml格式的,本来12点前能搞定的但是电脑稍微出了问题,导致idea 疯狂奔溃,搞了很久废话不多说了,有错误之处望大家指出发我邮箱. 用dubbo
公司后端服务使用 java 重构后,很多接口采用了阿里的 dubbo 协议。而 python 是无法直接调用 dubbo 接口的,但可以通过 telnet 调用,具体可以通过 telnetlib
我是一名优秀的程序员,十分优秀!