Dubbo入门

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

1、分布式基础理论回顾

1.1、为什么需要分布式?

现如今的大型互联网应用为什么要采用分布式架构??

首选需要明确的是:只有当单个阶段的处理能力无法满足日益增长的计算、存储任务的时候并且硬件的提升(增加内存、加磁盘、使用更好的CPU)都没得到更好的优化,我们才考虑采用分布式架构。因为分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式架构有多节点、通过网络通信的拓扑结构会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机制、协议、带来更多意料的问题等

那么什么是分布式架构,简单理解就是 为了分散应用的压力,将不同模块部署在不同的服务器上,各模块直接采用轻量级的通信机制互相调用与协作,来减轻应用系统的处理压力。

因此随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行。如下图(网站演进过程)

Java duckdb 集成_zookeeper

1、 1~10 单一应用架构

当网站流量很小时,只需要一个应用,将所有的功能都部署在一起,以减少部署的节点和成本,此时简化增删改查工作量的数据访问框架(ORM)是关键。这种架构适用于小型网站、小型管理系统、简单易用。

缺点:

  1. 性能扩展比较难
  2. 协同开发问题(不利于协同开发)
  3. 不利于维护(例如功能调整上线时需要重新打包、停应用等)

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就是要像调用本地的函数一样去调远程函数。

基本原理示意图:

Java duckdb 集成_dubbo_02

小结:

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 的介绍就不重复啰嗦了, 官方文档 已经说的很明白了。

Java duckdb 集成_Java duckdb 集成_03

节点角色说明

节点

角色说明

Provider

暴露服务的服务提供方

Consumer

调用远程服务的服务消费方

Registry

服务注册与发现的注册中心

Monitor

统计服务的调用次数和调用时间的监控中心

Container

服务运行容器

了解个节点的含义后我们再来看 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>

版本兼容性说明

Java duckdb 集成_zookeeper_04

3.编写配置文件(暴露服务配置)

2、让服务消费者去注册中心订阅服务提供者的服务地址