Dubbo入门
Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。
1、分布式基础理论回顾
1.1、为什么需要分布式?
现如今的大型互联网应用为什么要采用分布式架构??
首选需要明确的是:只有当单个阶段的处理能力无法满足日益增长的计算、存储任务的时候并且硬件的提升(增加内存、加磁盘、使用更好的CPU)都没得到更好的优化,我们才考虑采用分布式架构。因为分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式架构有多节点、通过网络通信的拓扑结构会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议、带来更多意料的问题等
那么什么是分布式架构,简单理解就是 为了分散应用的压力,将不同模块部署在不同的服务器上,各模块直接采用轻量级的通信机制互相调用与协作,来减轻应用系统的处理压力。
因此随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行。如下图(网站演进过程)
1、 1~10
单一应用架构
当网站流量很小时,只需要一个应用,将所有的功能都部署在一起,以减少部署的节点和成本,此时简化增删改查工作量的数据访问框架(ORM)是关键。这种架构适用于小型网站、小型管理系统、简单易用。
缺点:
- 性能扩展比较难
- 协同开发问题(不利于协同开发)
- 不利于维护(例如功能调整上线时需要重新打包、停应用等)
2、 10~1000
垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的优化速度越来越小,将应用拆分成互不相干的几个应用,以提升处理效率。此时用于加速前端页面开发的Web框架(MVC)是关键。
优点:通过切分业务来实现各个模块的独立部署,降低了维护和部署的难度,团队各司其职更容易管理,性能扩展也更方便,更有针对性。
缺点:公共模块无法重复利用
3、 1000~10000
分布式服务架构
垂直应用系统架构的改进,当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快的响应多变的市场需求。此时,用于提高业务复用及整合与管理各服务互相协作的分布式服务框架(RPC)是关键。
4、 10000+
流动计算架构
当服务越来越多,服务资源得不到合理的利用逐渐呈现出来(例如有的服务调用频率特别大,有的服务调用频率又特别小,此时应该协调出调用频率小的服务器资源给调用频率高的服务),此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
SOA(Service Oriented Architecture)
用于提供机器利用率的资源调度和治理中心,成为流动计算架构的关键性技术。
1.2、RPC
1、什么是RPC?
RPC(Remote Procedure Call): 远程过程调用。是一种进程间通信方式,它是一种技术思想不是规范或约定。它允许程序调用另外一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用开发者实现这个远程调用的细节。即开发者无论是调用本地的还是远程的函数,本质上编写的调用代码基本上都是相同的。
也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
2、为什么要用RPC呢?
就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数。
基本原理示意图:
小结:
client stub
和 server stub
可以视为协调调用远程函数的"助手",主要完成如下几个工作:
client stub
:
1、客户端调用
2、序列化
3、发送消息
9、将调用结果反序列化
10、返回调用结果
server stub
:
4、反序列化
5、调用本地服务
6、返回处理结果
7、将调用结果序列化
8、响应消息
因此不难看出影响 RPC
调用效率的因素主要有两个:
1、通讯(轻量级的通讯尤为重要)
2、序列化与反序列化(采用XML还是JSON或是二进制流进行数据的传输)
基于这种 RPC
的思想市面上也衍生出了很多 RPC
框架,例如: bubbo、gRPC、Thrift、HSF(High Speed Service Framework)
2、Dubbo
2.1、dubbo的角色划分
更多 Dubbo
的介绍就不重复啰嗦了, 官方文档 已经说的很明白了。
节点角色说明
节点 | 角色说明 |
| 暴露服务的服务提供方 |
| 调用远程服务的服务消费方 |
| 服务注册与发现的注册中心 |
| 统计服务的调用次数和调用时间的监控中心 |
| 服务运行容器 |
了解个节点的含义后我们再来看 Dubbo
的工作流程:
start
register
subscribe
notify
invoke
count
2.2、Dubbo环境搭建
1、首先是注册中心
Dubbo
都可以适配主流的注册中心,例如 Zookeeper、Nacos、Mulicast、Redis
等,这里我们采用 Zookeeper
做为 Dubbo
的注册中心, Zookeeper
是一个树形的目录服务,支持变更推送,适合作为 Dubbo
服务的注册中心,这也是官方推荐使用的注册中心。
Docker
构建zookeeper服务端
# 拉取最新zookeeper镜像
docker pull zookeeper
# 启动zookeeper
docker run -d -p 2181:2181 --name zookeeper --restart always [imageId]
# 进入容器查看Zookeeper运行状态
root@c1a413096894:/apache-zookeeper-3.7.0-bin/bin# pwd
/apache-zookeeper-3.7.0-bin/bin
root@c1a413096894:/apache-zookeeper-3.7.0-bin/bin# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone
2、到这里 Dubbo
的基本环境也就搭建完了,接下来就是项目集成 Dubbo
即可。需要注意的是 Dubbo
本身并不是一个服务软件!它其实就是一个 jar
包,能够帮助我们的 Java
程序连接到 Zookeeper
,并利用 Zookeeper
消费或提供服务。
3、需要自己创建两个项目,一个是 provider
服务提供者,另外一个是 consumer
服务消费者,我们需要借助这两个项目完成 Dubbo
各种测试。
2.3、hello world实现
假设现有用户服务( provider
)和订单服务( consumer
),两个服务分别部署在不同的服务器上,创建订单的时候,需要获取到用户信息包括电话号码,收获地址等,此时就需要订单服务可以远程调用用户服务提供的接口或方法。
1、将服务提供者注册到 Zookeeper
注册中心 (如何暴露服务)
1.给服务提供者项目添加 Dubbo
依赖(服务提供者我们使用 SpringBoot
,服务消费者我们使用原生 Spring
,两种集成方式可做参考)
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
2.由于 Dubbo
使用 Curator
作为与 Zookeeper Server 交互的编程客户端。注册中心 Zookeeper
还需要引入操作 Zookeeper
的客户端 Curator
, dubbo-dependencies-zookeeper
将自动为应用增加 Zookeeper 相关客户端的依赖(也就是 curator
相关的依赖)。
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-dependencies-zookeeper -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.8</version>
<type>pom</type>
</dependency>
注意:官方明确指出 Dubbo
和 dubbo-dependencies-zookeeper
有版本兼容性问题,如使用中遇到版本兼容问题,也可以不使用 dubbo-dependencies-zookeepe
r,而是自行添加 Curator、Zookeeper Client
等依赖,例如:
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
版本兼容性说明
3.编写配置文件(暴露服务配置)
2、让服务消费者去注册中心订阅服务提供者的服务地址