冰河开始对Dubbo下手了!
写在前面
对冰河有一定了解的读者都知道,冰河经历了一个高并发电商系统用户从零到上亿的整个研发过程,后期也由此衍生出电商系统(商城+秒杀)和基于海量数据的实时精准商品推荐平台。部分核心知识已总结到我出版的两本书籍——《海量数据处理与大数据技术实战》和《MySQL技术大全:开发、优化与运维实战》中。随着电商系统业务的不断发展,我们需要对系统不断的迭代升级,这期间,Dubbo功不可没。
在微服务领域有两个比较出名的技术栈:SpringCloud / SpringCloud Alibaba(目前SpringCloud Alibaba有超过SpringCloud的势头)和Dubbo。而Dubbo作为一个服务治理的RPC框架,在大厂面试的过程中,几乎是一个必问的技术。所以,我打算写一个深度解析Dubbo的系列专题,揭开Dubbo的神秘面纱,让更多的小伙伴彻底掌握Dubbo。
这篇就作为Dubbo源码系列的开篇吧!!
注:写完Dubbo再写SpringCloud Alibaba系列。
文章已收录到:
https://github.com/sunshinelyz/technology-binghe
https://gitee.com/binghe001/technology-binghe
Dubbo的核心能力
总体来说,Apache Dubbo是一款高性能,轻量级的开源RPC框架,提供了六大核心能力:
- 面向接口代理的高性能RPC调用。
- 智能容错和负载均衡。
- 服务自动注册和发现。
- 高度可扩展能力。
- 运行期流量调度。
- 可视化的服务治理与运维。
具体细节小伙伴们可以参见Dubbo官方文档。
为何学Dubbo
为何要深度学习Dubbo,那肯定是要解决某种业务场景啊。接下来,我们就聊一聊为何学习Dubbo。不过在介绍为何学习Dubbo前,我们先来看看随着业务的不断发展,我们的系统在架构上会有哪些变化。
单体应用架构
在企业发展的初期,一般公司的网站流量都比较小,只需要一个应用,将所有的功能代码打包成一个服务,部署到服务器上就能支撑公司的业务。这样也能够减少开发、部署和维护的成本。
比如,大家都很熟悉的电商系统,里面涉及的业务主要有:用户管理、商品管理、订单管理、支付管理、库存管理、物流管理等等模块,初期我们会将所有模块写到一个Web项目中,然后统一部署到一个Web服务器中。

这种架构特点有其优点:
- 架构简单,项目开发和维护成本低。
- 所有项目模块部署到一起,对于小型项目来说,维护方便。
但是,其缺点也是比较明显的:
- 所有模块耦合在一起,虽然对于小型项目来说,维护方便。但是,对于大型项目来说,却是不易开发和维护的。
- 项目的各模块之前过于耦合,如果一旦有一个模块出现问题,则整个项目将不可用。
- 无法针对某个具体模块来提升性能。
- 无法对项目进行水平扩展。
正是由于单体应用架构存在着诸多的缺点,才逐渐演变为垂直应用架构。接下来,我们就来看看垂直应用架构。
垂直应用架构
随着企业业务的不断发展,发现单节点的单体应用不足以支撑业务的发展,于是企业会将单体应用部署多份,分别放在不同的服务器上。但是,此时会发现不是所有的模块都会有比较大的访问量。如果想针对项目中的某些模块进行优化和性能提升,此时对于单体应用来说,是做不到的。于是乎,垂直应用架构诞生了。
垂直应用架构,就是将原来一个项目应用进行拆分,将其拆分为互不想干的几个应用,以此来提升系统的整体性能。
这里,我们同样以电商系统为例,在垂直应用架构下,我们可以将整个电商项目拆分为:电商交易系统、后台管理系统、CMS管理系统等。

我们将单体应用架构拆分为垂直应用架构之后,一旦访问量变大,我们只需要针对访问量大的业务增加服务器节点即可,无需针对整个项目增加服务器节点了。
这种架构的优点:
- 系统进行了拆分,可根据不同系统的访问情况,有针对性的进行优化。
- 能够实现应用的水平扩展。
- 各系统能够分担整体访问的流量,解决了并发问题。
- 一个系统发生了故障,不应用其他系统的运行情况,提高了整体的容错率。
这种架构的缺点:
- 拆分后的各系统之间相对比较独立,无法进行互相调用。
- 各系统难免存在重叠的业务,会存在重复开发的业务,后期维护比较困难。
分布式架构
我们将系统演变为垂直应用架构之后,当垂直应用越来越多,重复编写的业务代码就会越来越多。此时,我们需要将重复的代码抽象出来,形成统一的服务供其他系统或者业务模块来进行调用。此时,系统就会演变为分布式架构。
在分布式架构中,我们会将系统整体拆分为服务层和表现层。服务层封装了具体的业务逻辑供表现层调用,表现层则负责处理与页面的交互操作。

这种架构的优点:
- 将重复的业务代码抽象出来,形成公共的访问服务,提高了代码的复用性。
- 可以有针对性的对系统和服务进行性能优化,以提升整体的访问性能。
这种架构的缺点:
系统之间的耦合度变高,调用关系变得复杂,难以维护。
SOA架构
在分布式架构下,当部署的服务越来越多,重复的代码就会越来越多,对于容量的评估,小服务资源的浪费等问题比较严重。此时,我们就需要增加一个统一的调度中心来对集群进行实时管理。此时,系统就会演变为SOA(面向服务)的架构。

这种架构的优点:
使用注册中心解决了各个服务之间的服务依赖和调用关系的自动注册与发现。
这种架构的缺点:
- 各服务之间存在依赖关系,如果某个服务出现故障可能会造成服务的雪崩(关于穿透、击穿和雪崩的问题,小伙伴们可以参见我之前写的《【高并发】面试官:讲讲什么是缓存穿透?击穿?雪崩?如何解决?》一文)。
- 服务之间的依赖与调用关系复杂,测试部署的困难比较大。
微服务架构
随着业务的发展,我们在SOA架构的基础上进一步扩展,将其彻底拆分为微服务架构。在微服务架构下,我们将一个大的项目拆分为一个个小的可以独立部署的微服务,每个微服务都有自己的数据库。

这种架构的优点:
- 服务彻底拆分,各服务独立打包、独立部署和独立升级。
- 每个微服务负责的业务比较清晰,利于后期扩展和维护。
- 微服务之间可以采用REST和RPC协议进行通信。
这种架构的缺点:
- 开发的成本比较高。
- 涉及到各服务的容错性问题。
- 涉及到数据的一致性问题。
- 涉及到分布式事务问题(小伙伴们可以参见我后续会持续更新的【分布式事务】专题)。
为何学习Dubbo?
(1)系统升级过程中需要使用dubbo解决问题。
在系统架构升级和微服务落地的过程中,我们需要解决很多的问题,比如:
- 将一个项目拆分为多个服务之后,服务于服务之间如何高效的通信?
- 服务的调用如何做到负载均衡和高可用?
- 服务的调用如何做到限流?又如何快速的感知到依赖服务宕机?
- 服务的边界如何定义?
- 当系统中存在的服务越来越多时,如何进行服务治理等等。
这些问题,我们都可以使用Dubbo来解决。
(2)互联网大厂需要掌握Dubbo技术。
很明确,很多互联网大厂都需要深度掌握Dubbo这项技术。这里说的深度掌握,并不只是停留在简单的使用层面,而是对Dubbo的核心原理和源码有一定的理解。换句话说:就是你要对Dubbo的核心原理和源码很熟,在高并发、大流量场景下要能够结合Dubbo的原理和源码分析出问题所在,并能够进行相应的性能调优。
所以说,如果你想进互联网大厂,最好是掌握Dubbo的核心原理和源码。
Dubbo的使用场景
在分布式架构、SOA架构和微服务架构下,Dubbo有其充分的用武之地。有些小伙伴可能会说:我们系统中使用的是SpringCloud技术栈,不需要使用Dubbo呀!其实,使用SpringCloud和Dubbo是不冲突的,甚至二者也可以结合使用。例如,我所经历的项目,有些独立的模块使用了Dubbo作为RPC框架,有些模块则使用了SpringCloud,二者并不是冲突的,可以做到互相促进的作用。
总体来说,Dubbo的使用场景如下:
RPC分布式服务
当网站变大后,不可避免的需要拆分应用进行服务化,以提高开发效率,调优性能,节省关键竞争资源等。
比如:为了适用不断变化的市场需求,以及多个垂直应用之间数据交互方便,我们把公共的业务抽取出来作为独立的模块,为其他的应用提供服务,系统逐渐依赖于抽象和rpc远程服务调用。
配置管理
当服务越来越多时,服务的URL地址信息就会爆炸式增长,配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
服务依赖
当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
服务扩容
接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?等等……
Dubbo总结
总之,用官方的话说:Apache Dubbo 是一款高性能、轻量级的开源 Java 服务框架,提供了六大核心能力:面向接口代理的高性能RPC调用,智能容错和负载均衡,服务自动注册和发现,高度可扩展能力,运行期流量调度,可视化的服务治理与运维。
Dubbo的六大核心能力能够为我们在快速迭代微服务项目时,更好的提供RPC和服务治理能力。如果你想进大厂,就最好掌握Dubbo。
好了,今天就到这儿吧,我是冰河,大家有啥问题可以在下方留言,也可以加我微信:sun_shine_lyz,一起交流技术,一起进阶,一起牛逼~~
冰河开始对Dubbo下手了!的更多相关文章
- 俯瞰Dubbo全局,阅读源码前必须掌握这些!!
写在前面 在上一篇<冰河开始对Dubbo下手了!>一文中,我们重点介绍了为何要学习Dubbo,而且还是要深入理解Dubbo的原理和核心源码.既然是要写深度解析Dubbo源码的系列专题,我们 ...
- 我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?
写在前面 上周,在[Dubbo系列专题]中更新了两篇文章<冰河开始对Dubbo下手了!>和<俯瞰Dubbo全局,阅读源码前必须掌握这些!!>,收到了很多小伙伴的微信私聊消息,大 ...
- Dubbo中的统一契约是如何实现的?
写在前面 之前,很多小伙伴私信我:如何才能快速的掌握Dubbo的核心原理和源码.所以,我写了一篇<我是如何在短期内快速掌握Dubbo的原理和源码的(纯干货)?>.对于Dubbo的源码解析系 ...
- 《深入理解高并发编程:JDK核心技术》-冰河新书上市
大家好,我是冰河~~ 废话说多了没用,并发编程技术一直是初级程序员进阶高级工程师的前提条件,也是成为大厂程序员的必备技能,更是突破自身技术瓶颈的必经之路. 2022年6月我出版了"冰河技术丛 ...
- Dubbo源码-Dubbo是如何随心所欲自定义XML标签的
叨叨 今天考虑了很久要不要写这篇文章. 距离<Dubbo源码>系列的开篇到现在已经快两个月时间了.当时是想着工作上的RPC框架使用存在一些让人头疼的问题,就来看看Dubbo给出了一套什么样 ...
- 【转】Dubbo和JDK的SPI究竟有何区别?
前言 上一篇简单的介绍了spi的基本一些概念,但是其实Dubbo对jdk的spi进行了一些改进,具体改进了什么,来看看文档的描述 JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初 ...
- dubbo源码解析-spi(二)
前言 上一篇简单的介绍了spi的基本一些概念,在末尾也提到了,dubbo对jdk的spi进行了一些改进,具体改进了什么,来看看文档的描述 JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩 ...
- 一文讲透Dubbo负载均衡之最小活跃数算法
本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版本. 为什么没有用截止目前的最新的版本号2.7.4.1呢?因为2.6.0这个版本里面有两 ...
- 冰河开源了全网首个完全开源的分布式全局有序序列号(分布式ID)框架!!
写在前面 mykit-serial框架的设计参考了李艳鹏大佬开源的vesta框架,并彻底重构了vesta框架,借鉴了雪花算法(SnowFlake)的思想,并在此基础上进行了全面升级和优化.支持嵌入式( ...
- 用dubbo时遇到的一个序列化的坑
首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...
随机推荐
- 焊接LQFP48 和 LQFP64 封装的芯片的记录
记录一下焊接LQFP48 和 LQFP64 封装的芯片的过程 动机 想测一下STC8系列的芯片, 因为同型号的管脚功能基本是相同的, 大封装的可以cover小封装, 而DIP40封装的现在基本买不到, ...
- NodeJs web项目框架Express笔记
安装 以下都使用Yarn进行. 环境前提: 已经安装NodeJS(及自带的npm), 已经安装Yarn # 全局安装 yarn global add express-generator@4 #查看版本 ...
- java.lang.System快速指南
1.介绍 在本教程中,我们将快速了解java.lang.System类及其特性和核心功能. 2.IO 系统类是java.lang的一部分,它的一个主要特性是让我们能够访问标准的I/O流. 简单地说,它 ...
- SpringBoot+Shiro+LayUI权限管理系统项目-1.项目介绍
1.项目介绍 本项目旨在打造一个基于RBAC架构模式的通用的.并不复杂但易用的权限管理系统.通过本项目可以较好的理解权限系统的常见业务同时学习掌握Springboot和Shiro等诸多技术点.需要的朋 ...
- Execl常用快捷操作
常用的操作 Ctrl+A 全选 Ctrl+Z 撤销 Ctrl+X 剪切 Ctrl+C 复制 Ctrl+V 粘贴 Ctrl+B 加粗 Ctrl+S 保存 Ctrl+F 查找 Ctrl+H 替换 Alt+ ...
- 4-request对象
前端提交数据 必备知识点 前端form表单中action属性,不写默认是当前路由地址 前端form表单中的method属性,不写默认是GET请求 前端页面 templates\register.htm ...
- 【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
问题描述 在Java项目中,使用Redisson作为连接Redis的客户端,间歇性的出现了DNS Monitor throwable 错误. DNSMonitor throwable="ja ...
- 使用rpa打开浏览器并执行js抓取页面元素详情步骤
这里我们专门开一个文章来写如何在rpa中执行js获取页面元素. 个人觉得,复杂点的需求用js会方便很多,所以后续的文章我都会重点使用js去获取页面元素. 好,正文开始,我们先看一下rpa为我们提供的自 ...
- Java //手动输入3个数,并从小到大排序
1 //手动输入3个数,并从小到大排序 2 //import java.util.Sanner; 3 4 System.out.println("请输入第一个数:"); 5 Sca ...
- 【容斥、插值】P3270 [JLOI2016]成绩比较
[容斥.插值]P3270 [JLOI2016]成绩比较 题目简述 有 \(n+1\) 个人,进行 \(m\) 场考试,第 \(i\) 场考试的可能得分是 \([0,U_i]\) 之间的整数. 假设你是 ...