Dubbo系列(一)dubbo介绍和入门
学习Dubbo 之前,先了解一下这几个问题:
- Dubbo是什么?
- 互联网发展的背景
- Dubbo介绍
- Dubbo的优势在哪里?
了解了dubbo之后,让我们从零搭建一个简单的dubbo项目。
Dubbo是什么
官网介绍
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
可以了解到:
- Dubbo是一款RPC框架,核心功能是远程方法调用、服务的注册和发现
- Dubbo是由java语言开发
- Dubbo提供了智能容错、负载均衡实现
互联网发展的背景
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
- 单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
- 垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
- 分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
- 流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
Dubbo介绍
随着互联网架构的演进,为了满足大型业务量的项目,分布式架构已然成为主流,dubbo这样的RPC框架因此诞生,对于我们而言,有前人栽好的大树就该学会好好利用,并逐渐改善来满足个体需求。
dubbo架构
有了dubbo,我们可以很方便的对业务服务进行垂直拆分、横向拆分,并很好的协调起来,令所有服务节点像一个单独应用正常工作。
Registry:负责服务的注册和发现、订阅
Monitor:负责监控服务信息
Dubbo的优势在哪里
首先从官网上可以看到一些官方推荐的特性:
-
面向接口代理的高性能RPC调用
提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。 -
智能负载均衡
内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。 -
服务自动注册与发现
支持多种注册中心服务,服务实例上下线实时感知。 -
高度可扩展能力
遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。 -
运行期流量调度
内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。 -
可视化的服务治理与运维
提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
简单的梳理一下:
- RPC调用性能高
- 提供负载均衡实现
- 服务注册与发现
- 可扩展能力强
- 有监控系统,可流控
- 方便运维控制
这样看还不够直观,作为一个rpc框架,没有对比就没有伤害,这里列举一些其他的rpc框架:
- RMI(java原生实现),性能差,以上特性都不具备
- Spring Cloud(REST),只支持http,性能受限
- grpc(由google开发),只支持http,且只支持ProtoBuf序列化协议,性能较强
- …还有例如motan等就不作比较了
可以看出dubbo在使用上和扩展性方面都是比较好的,方便用户改造以及灵活的切换不同的通信协议、序列化协议等。
从零搭建简单的Dubbo项目
一、环境准备
jdk(笔者使用的版本是1.8)
maven(笔者使用的版本是3.3.9)
zookeeper(笔者使用的版本是3.4.13)
ps.笔者使用的dubbo版本是2.6.4,dubbo版本不同可能有所影响
二、构建服务提供者项目
由于暴露的仅仅是api,所以构建api和impl两个子模块
api模块
- 定义一个接口,并提供需要被远程调用的方法
public interface TestService {
String say(String what);
}
- 为了方便消费端调用,提供引用xml,以免消费端需要先查看api后根据api来编写引用xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"
xmlns:context="http://www.springframework.org/schema/c">
<dubbo:reference id="testService"
interface="com.xcxcxcxc.dubbo.provider.TestService"/>
</beans>
impl模块
- 由于需要dubbo来暴露服务,首先引入maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>service-provider</artifactId>
<groupId>com.xcxcxcxcx</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>