Dubbo系列(一)dubbo介绍和入门
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><artifactId>service-provider-impl</artifactId><properties><dubbo.version>2.6.4</dubbo.version></properties><dependencies><!--dubbo--><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo-registry-zookeeper</artifactId><version>${dubbo.version}</version></dependency><!-- api --><dependency><groupId>com.xcxcxcxcx</groupId><artifactId>service-provider-api</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
- 定义实现类,实现TestService接口
package com.xcxcxcxc.dubbo.provider.impl;import com.xcxcxcxc.dubbo.provider.TestService;/*** @author XCXCXCXCX* @since 1.0*/public class TestServiceImpl implements TestService{@Overridepublic String say(String what) {return "someone say that : \"" + what + "\"";}}
- 为了简单,编写简单的引导类来暴露服务
public class ServiceExposer {public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/service-provider.xml");context.start();System.in.read(); // 按任意键退出,为了避免主线程结束而导致服务取消暴露}}
- 当然别忘了配置所需要暴露服务的信息
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><context:property-placeholder location="classpath:properties/appliaction.properties"/><!-- provider's application name, used for tracing dependency relationship --><dubbo:application name="${application.name}" owner="${dubbo.application.owner}"/><!-- use multicast registry center to export service --><dubbo:registry protocol="zookeeper" address="${dubbo.zk.servers}"group="${dubbo.zk.group}" file="${dubbo.cache.dir}/service-provider.cache"/><!-- use dubbo protocol to export service on port 20880 --><dubbo:protocol name="dubbo" port="${dubbo.service.provider.port}"accesslog="${dubbo.protocol.accesslog}"/><!-- service implementation, as same as regular local bean --><bean id="testSerivce" class="com.xcxcxcxc.dubbo.provider.impl.TestServiceImpl"/><!-- declare the service interface to be exported --><dubbo:service interface="com.xcxcxcxc.dubbo.provider.TestService"ref="testSerivce" timeout="3000"/></beans>
properties
application.name=service-providerdubbo.service.provider.port=20000dubbo.service.provider.threads=200dubbo.cache.dir=/logs/cachedubbo.zk.servers=192.168.179.130:2181dubbo.zk.group=dubbo-learning-devdubbo.application.owner=xcxcxcxcxdubbo.protocol.accesslog=/logs/dubbo-user.log
三、构建服务消费者项目
- 依赖于dubbo来发现服务,依然需要引入dubbo依赖(别忘了引入api包)
<?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>dubbo-learning</artifactId><groupId>com.xcxcxcxcx</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>service-consumer</artifactId><properties><dubbo.version>2.6.4</dubbo.version></properties><dependencies><!-- dubbo及相关依赖包 --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo-registry-zookeeper</artifactId><version>${dubbo.version}</version></dependency><!-- api --><dependency><groupId>com.xcxcxcxcx</groupId><artifactId>service-provider-api</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
- 配置服务发现的相关信息
<?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://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><dubbo:application name="service-provider" owner="xcxcxcxcx"/><!--这里是使用zk作为注册中心,指定协议和zk地址 --><dubbo:registry protocol="zookeeper" group="dubbo-learning-dev"address="192.168.179.130:2181"/><!-- api包中提供的引用xml --><import resource="classpath*:client/test-reference.xml"/></beans>
- 编写简单的引导主类,用于测试服务调用情况
package com.xcxcxcxcx.dubbo.consumer;import com.xcxcxcxc.dubbo.provider.TestService;import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @author XCXCXCXCX* @since 1.0*/public class ServiceConsumer {public static void main(String[] args) {ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/service-consumer.xml");context.start();TestService testService = (TestService)context.getBean("testService"); // 获取远程服务代理long start = System.currentTimeMillis();String returnVal = testService.say("hello world!"); // 执行远程方法long end = System.currentTimeMillis();System.out.println(returnVal); // 显示调用结果System.out.println("cost " + (end - start) + " ms"); // 显示调用耗时//第二次调用TestService testService2 = (TestService)context.getBean("testService"); // 获取远程服务代理long start2 = System.currentTimeMillis();String returnVal2 = testService2.say("hello world2!"); // 执行远程方法long end2 = System.currentTimeMillis();System.out.println(returnVal2); // 显示调用结果System.out.println("cost " + (end2 - start2) + " ms"); // 显示调用耗时}}
准备好后,开始准备测试远程服务
四、远程服务调用测试
- 开始测试之前别忘了启动zk注册中心
确保zk启动成功,确保端口已暴露,确保能远程连接上zk
- 启动服务提供者的引导主类
这里没有提供暴露是否成功的信息,没有报错就好
在zk上可以查看到节点信息:
- 启动服务消费者的引导主类
控制台信息:
someone say that : “hello world!”
cost 106 ms
someone say that : “hello world2!”
cost 3 ms
可见第一次由于需要与服务建立连接,通信开销,耗时较长,第二次调用耗时仅需3ms。
ps. 本次搭建环境均是内网,另外,如果出现qos报错的情况可以忽略,一般是端口冲突问题,用于运维的通信端口。
小结
本文从官网和个人的理解出发,对dubbo进行了简单介绍和分析,以及介绍了如何搭建简单dubbo项目,随着使用时间的增加,以后将会面向dubbo源码剖析其底层原理。
Dubbo系列(一)dubbo介绍和入门相关推荐
- Dubbo系列之Dubbo原理简介
文章目录 一.分布式基本知识 1.1) 架构演变 1.2).分布式基本概念 二.RPC简介 2.1) RPC概念 2.2) RPC核心模块 三.Dubbo原理简介 3.1) Dubbo简介 3.2) ...
- 【dubbo系列】dubbo协议与http协议对比
前言 什么是协议?协议可以认为是一种语言,是一种交互的标准.比如A和B互相发手机短信.A和B必须互相知道对方手机号(IP地址),知道手机号后,全部使用汉语(协议)即可互相通信. http即超文 ...
- Apache Dubbo系列:泛化调用
上一章,我们讲到了Dubbo的线程池策略,本章我们一起探讨,Dubbo如何实现泛化调用的.主要内容包括: 1.什么是泛化调用 2.泛化调用的三种方式 3.如何使用 4.源码分析 推荐阅读: Apach ...
- php dubbo 接口测试工具,dubbo服务自动化测试搭建
java实现dubbo的消费者服务编写:ruby实现消费者服务的接口测试:通过消费者间接测试dubbo服务接口的逻辑 内容包括:dubbo服务本地调用环境搭建,dubbo服务启动,消费者部署,脚本编写 ...
- 深度学习Dubbo系列(入门开篇)
2019独角兽企业重金招聘Python工程师标准>>> 此文档为系列学习文档 这系列文档详细讲解了dubbo的使用,基本涵盖dubbo的所有功能特性.在接下来的文章里会详细介绍. 如 ...
- Dubbo源码分析:小白入门篇
关注公众号"java后端技术全栈" 回复"000"获取优质面试资料 大家好,我是老田 答应了小伙伴的Dubbo源码分析系列,今天终于来了,希望不是很晚. 主要也 ...
- Dubbo系列(二)源码分析之SPI机制
Dubbo系列(二)源码分析之SPI机制 在阅读Dubbo源码时,常常看到 ExtensionLoader.getExtensionLoader(*.class).getAdaptiveExtensi ...
- Dubbo实战(一)快速入门
Dubbo是什么? Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封 ...
- Java - Dubbo实战(一)快速入门 小白教程
Dubbo是什么? Dubbo[]是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封 ...
最新文章
- C - Group HDU - 4638[离线+树状数组]
- P2949 [USACO09OPEN]Work Scheduling (后悔法,贪心)难度⭐⭐⭐
- poj 3920(简单dp)
- Java 面向对象 之 接口 火车票实例
- SpringBoot中静态资源和首页定制
- 收集了一些容易出错的题,可能大家也不会注意到的基础知识(js)
- 怎样将生成的pdf文件转为eps文件
- PT100铂电阻温度传感器详解
- 直播改革:关闭10家平台监管3万主播
- 电磁兼容测试技术简介
- 浅谈中国电信出口网络的链路情况(什么是 ChinaNet,CN2,GT,GIA)
- S9013驱动直流电机原理图
- python软件设计数据分析统计服_学习笔记(一)-python制作数据分析工具
- c语言输入f1到f11,我来告诉你:电脑键盘的F1至F12正确用处
- pygame之pygame模块
- Python大道至简(第七部分)
- 计算机专业简历的自我评价,计算机网络专业简历的自我评价
- 1027 : 判断水仙花数(C语言)
- C语言实现字符串转十六进制
- miniui自定义messageBox框