一.Dubbo的发展历史以及特性简介

目录

一.Dubbo的发展历史以及特性简介

1.1 Dubbo的发展历史

1.2 Dubbo的特性

二、Dubbo的简单应用

2.1使用前的准备工作

2.2 Dubbo的官方demo


1.1 Dubbo的发展历史

2011年,阿里巴巴宣布开源SOA服务化治理框架——Dubbo2.0.7,在当时引起很大关注,并且被众多公司使用,同时在Dubbo的基础上,也有一些公司研发出自己公司的服务化框架,如2014年,当当网的Dubbox,支持http rest协议。当年10月,阿里发布了2.3.11版本后,突然停止维护该项目,2017年突然又宣布重启Dubbo项目,2018年,阿里将该项目捐献给了Apache基金会,进入Apache孵化器,同年更名为Apache Dubbo。

本来在之前的公司用的一直是spring cloud那一套微服务解决方案,没怎么接触dubbo,但是现在由于换工作,其他公司也有不少在使用dubbo,所以还是有必要熟悉一下dubbo这个也算比较流行的RPC框架。

1.2 Dubbo的特性

1.面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节;

2.服务自动注册与发现:支持多种注册中心服务,服务实例上下线实时感知。

这一点从github上的dubbo项目中可以看出,支持各种服务注册组件:

打开dubbo项目的注册模块,可以看到支持eureka,zookeeper,nacos,consul等注册中心服务组件。

3.运行期流量调度:内置条件,脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能

4,智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

5.支持多种配置中心

dubbo项目的configcenter模块,可以看到,支持zookeeper,nacos,Apollo,consul等作为配置中心

6.高度可拓展能力:遵循微内核+插件的设计思想,所有核心能力和protocol、transport、serialization被设计为扩展点,平等对待内置实现和第三方实现

7.可视化的实例服务治理与运维:提供丰富的服务治理,运维工具;随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数

二、Dubbo的简单应用

2.1使用前的准备工作

虽然dubbo有默认的注册中心,但是dubbo推荐使用zookeeper作为注册中心。所以需要先安装zookeeper。

在linux服务器上安装zookeeper,需要确保已安装jdk

查看linux服务器上是否已安装jdk,可以使用java -version查看

我用的 阿里云主机,已经安装了open-jdk 1.8,所以可以直接安装zookeeper了

由于github上的dubbo项目(https://github.com/apache/dubbo),下载下来看到使用的zookeeper是3.4.13,所以我准备在阿里云上也安装3.4.13版本zookeeper

可以去官网下载tar包上传到服务器:

 但是官网上最新稳定版是3.6.1,而且只提供了三个最新版本的下载链接,官网提供的各个镜像网站也只提供这三个版本的下载,没有3.4.13版本

算了,那下载3.4.14版本算了

wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

然后解压

tar -zxvf zookeeper-3.4.14.tar.gz

然后进入zookeeper解压后的目录下的conf目录下,复制zoo_sample.cfg 为zoo.cfg

vim 命令打开zoo.cfg文件

 修改一下

dataDir =/usr/data/zookeeper

dataLogDir=/usr/data/zookeeper/log

切换到usr目录下创建data/zookeeper/log多级目录

cd /usr

mkdir -p data/zookeeper/log

配置环境变量:
vim /etc/profile

在最后面添加:(我打开文件,发现里面的环境变量已经配置好了,如下,包括jdk的环境变量也配好了)

ZOOKEEPER_HOME=/usr/software/zookeeper-3.4.14
PATH=$PATH:$ZOOKEEPER_HOME/bin
export PATH ZOOKEEPER_HOME PATH

重新加载:
source /etc/profile

然后到阿里云控制台开放zookeeper的2181端口

启动zookeeper

zkServer.sh start

查看状态:
zkServer.sh status

重启:
zkServer.sh restart

关闭:
zkServer.sh stop

准备环境已经就绪,接下来可以上手一个dubbo的简单项目了

2.2 Dubbo的官方demo

在dubbo-demo模块下还有四个子模块,annotation(注解方式开发),xml(xml方式配置开发)

主要看一下xml配置方式的开发(由于dubbo基于接口代理)所以,会需要先创建一个interface模块

相关依赖:受限是dubbo-demo的pom文件

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.apache.dubbo</groupId><artifactId>dubbo-parent</artifactId><version>${revision}</version><relativePath>../pom.xml</relativePath></parent><artifactId>dubbo-demo</artifactId><packaging>pom</packaging><name>${project.artifactId}</name><description>The demo module of dubbo project</description><properties><skip_maven_deploy>true</skip_maven_deploy></properties><modules><module>dubbo-demo-interface</module><module>dubbo-demo-xml</module><module>dubbo-demo-annotation</module><module>dubbo-demo-api</module></modules><dependencyManagement><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-bom</artifactId><version>${project.parent.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement></project>

然后是dubbo-demo-interface下的pom

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.apache.dubbo</groupId><artifactId>dubbo-demo</artifactId><version>${revision}</version><relativePath>../pom.xml</relativePath></parent><artifactId>dubbo-demo-interface</artifactId><packaging>jar</packaging><name>${project.artifactId}</name><description>The demo module of dubbo project</description><properties><skip_maven_deploy>true</skip_maven_deploy></properties>
</project>

打包方式是jar的方式,因为一会儿服务提供方即provider需要引入这个dubbo-demo-interface依赖

官方dubbo-demo-interface模块,给了两个接口,这是其中一个Demoservice

当然接口内容也可以自己自定义方法

package org.apache.dubbo.demo;import java.util.concurrent.CompletableFuture;public interface DemoService {String sayHello(String name);default CompletableFuture<String> sayHelloAsync(String name) {return CompletableFuture.completedFuture(sayHello(name));}}

接下来看服务提供类

在另外一个模块中dubbo-demo-xml中(以xml配置方式开发),可以看到有两个子模块,一个是服务提供,一个是服务消费

dubbo-demo-xml项目下的pom

<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><groupId>org.apache.dubbo</groupId><artifactId>dubbo-demo</artifactId><version>${revision}</version><relativePath>../pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><artifactId>dubbo-demo-xml</artifactId><properties><skip_maven_deploy>true</skip_maven_deploy><spring-boot-maven-plugin.version>2.1.4.RELEASE</spring-boot-maven-plugin.version></properties><modules><module>dubbo-demo-xml-provider</module><module>dubbo-demo-xml-consumer</module></modules><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-metadata-report-zookeeper</artifactId><version>${project.parent.version}</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot-maven-plugin.version}</version><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

先看服务提供dubbo-demo-xml-provider的pom文件

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.apache.dubbo</groupId><artifactId>dubbo-demo-xml</artifactId><version>${revision}</version><relativePath>../pom.xml</relativePath></parent><artifactId>dubbo-demo-xml-provider</artifactId><packaging>jar</packaging><name>${project.artifactId}</name><description>The demo provider module of dubbo project</description><properties><skip_maven_deploy>true</skip_maven_deploy><slf4j-log4j12.version>1.7.25</slf4j-log4j12.version></properties><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-demo-interface</artifactId><version>${project.parent.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-multicast</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-zookeeper</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-configcenter-zookeeper</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-configcenter-nacos</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-metadata-report-nacos</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-metadata-report-zookeeper</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-rpc-dubbo</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-config-spring</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-remoting-netty4</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-serialization-hessian2</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-qos</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j-log4j12.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId></dependency></dependencies>
</project>
可以看到provider中引入了之前的demo-interface

官方也已经引入了zookeeper依赖

provider中对接口进行了简单的实现

接下来比较重要的部分来了,就是配置文件在resources目录下:

接下来对配置文件加上注释:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!--服务提供方应用名称,方便用于依赖追踪--><dubbo:application metadata-type="remote" name="demo-provider"/><dubbo:metadata-report address="zookeeper://47.106.23.219:2181"/>
<!--默认使用本地zookeeper作为配置中心,由于我的在阿里云部署的,所以这里的ip需要修改--><dubbo:registry address="zookeeper://47.106.23.219:2181"/>
<!--协议使用dubbo协议,可以添加监控端口20880--><dubbo:protocol name="dubbo" port="20880"/>
<!--通过xml方式将接口的实现类用bean容器托管和实例化--><bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
<!--声明要暴露的接口,ref指向实现类--><dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/></beans>

配置好了之后,需要服务提供方的启动类Application启动应用

package org.apache.dubbo.demo.provider;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Application {public static void main(String[] args) throws Exception {ClassPathXmlApplicationContext context = new
// 指定服务暴露配置文件
ClassPathXmlApplicationContext("spring/dubbo-provider.xml");
//启动spring容器并暴露服务context.start();System.in.read();}
}

启动后,控制台报错了,提示找不到某个模块中的包(这个UserService类在dubbo-config-api模块下)

然后点开support包,发现这个support包又为了另一个模块下(dubbo-rpc-rest)

那么既然找不到这个包,应该是maven仓库没有这个项目jar包,接下来,通过maven命令install

结果build failure

查看错误提示:

Failure to find org.apache.dubbo:dubbo-build-tools:jar:1.0.0 in http://maven.aliyun.com/nexus/content/groups/public was cached in the local repository, resolution will not be reattempted until the update interval of nexus-aliyun has elapsed or updates are forced -> [Help 1]

大致是说一个插件org.apache.dubbo:dubbo-build-tools:jar在阿里云私服上找不到(maven是setting.xml配置的仓库),网上有个教程说让该setting.xml,但是感觉为了这一个jar包去改配置有点麻烦

https://blog.csdn.net/Hello_Ray/article/details/87937506

又看了一下项目模块,有个这个模块

那么再install一下这个模块,build success

好了,这下应该可以install dubbo-rpc-rest这个模块了,但是发现又报了新的错误

模块中有一个类不能编译

maven install命令,控制台有乱码,需要解决一下

参考下边这个里边的第二种方案,在项目模块的pom文件中添加配置,试了无效,再试第一种配置

https://blog.csdn.net/qq_39999478/article/details/80045624

两种都没用,最后找到了解决方案:解决maven控制台出现乱码情况(而且编码必须是GBK,设置UTF-8都没用)

改了这个配置之后,竟然maven install 显示build success了,神奇!!

接下来重新启动服务提供方provider模块Application这个类(之前是报找不到包和类的错误)

发现可以打印类信息以及启动信息了,但是还是启动失败(java.lang.IllegalStateException:zookeeper not connected)

提示zookeeper未连接

在linux服务器上关闭防火墙再试一下

systemctl stop firewalld.service

还是提示zookeeper未连接,再看上边的提示,有一个sessionTimeout=60000,但是dubbo项目中默认配置的超时时间是3000L

具体源码追溯可以参考这个博客,按照这个博客(dubbo集成zipkin问题二【Caused by: java.lang.IllegalStateException: zookeeper not connected】),改了超时时间,成功连接,并启动provider模块

然后启动成功了

接下来看服务消费方:pom文件

<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/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.apache.dubbo</groupId><artifactId>dubbo-demo-xml</artifactId><version>${revision}</version><relativePath>../pom.xml</relativePath></parent><artifactId>dubbo-demo-xml-consumer</artifactId><packaging>jar</packaging><name>${project.artifactId}</name><description>The demo consumer module of dubbo project</description><properties><skip_maven_deploy>true</skip_maven_deploy></properties><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-metadata-report-zookeeper</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-demo-interface</artifactId><version>${project.parent.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-multicast</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-nacos</artifactId></dependency><dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-zookeeper</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-configcenter-zookeeper</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-configcenter-nacos</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-metadata-report-nacos</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-config-spring</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-rpc-dubbo</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-remoting-netty4</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-serialization-hessian2</artifactId></dependency></dependencies>
</project>

服务消费方要调用provider模块的服务

着重看配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!--服务消费方的应用名,方便用于依赖跟踪--><dubbo:application name="demo-consumer"/>
<!--指定zookeeper作为注册中心--><dubbo:registry address="zookeeper://47.106.23.219:2181" timeout="70000"/>
<!--指定要消费的服务 id对应服务提供方的接口实现类id--><dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/></beans>

然后启动消费方

ok,演示完毕,也算是踩了很多坑。当然还可以基于注解开发,基于注解的时候,会使用configureation类并配合@Configuration注解进行配置,不再xml文件中配置了,但是流程是类似的! 使用xml方式配置时,其他更多配置参数以及参数说明可以参考官网:http://dubbo.apache.org/zh-cn/docs/user/configuration/xml.html

Apache Dubbo的使用相关推荐

  1. Apache Dubbo 高危漏洞通告

    前沿技术早知道,弯道超车有希望 积累超车资本,从关注DD开始 作者:360CERT, 图文编辑:xj 来源:https://www.oschina.net/news/178522 报告编号:B6-20 ...

  2. Apache Dubbo 2.7.7 发布!升级 fastjson 等依赖!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | oschina.net/news/115796 ...

  3. 10月15日云栖精选夜读 | 阿里巴巴 Apache Dubbo 布道师谈 Service Mesh

    "Service Mesh要解决分布式架构下如何集成的问题,同时它又是云原生的核心,Dubbo Mesh正在做这方面的实践.--- 阿里巴巴Apache Dubbo布道师 吕仁琦 " ...

  4. rmi 反序列化漏洞_提醒:Apache Dubbo存在反序列化漏洞

    背景: 近日监测到Apache Dubbo存在反序列化漏洞(CVE-2019-17564),此漏洞可导致远程代码执行.Apache Dubbo是一款应用广泛的高性能轻量级的Java RPC分布式服务框 ...

  5. 参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!

    头图来源:https://opensource.guide/ 来源 | 阿里巴巴云原生公众号 ​ 只有贡献代码才算是参与开源项目社区贡献吗? 一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献, ...

  6. 都已经十岁的 Apache Dubbo,还能再乘风破浪吗?

    纵观中国开源历史,你真的没法找到第二个像 Dubbo 一样自带争议和讨论热度的开源项目. 一方面,2011 年,它的开源填补了当时生产环境使用的 RPC 框架的空白,一发布就被广泛采用:另一方面,它经 ...

  7. 架构师成长系列 | 从 2019 到 2020,Apache Dubbo 年度回顾与总结

    作者 | 刘军(陆龟)Apache Dubbo PMC 本文整理自架构师成长系列 2 月 18 日直播课程. 关注"阿里巴巴云原生"公众号,回复 "218",即 ...

  8. apache dubbo 自定义全局统一的异常处理器

    项目使用过的是apache dubbo 2.7.1, 封装了自定义全局统一的异常处理器. 统一异常处理器 需要实现javax.ws.rs.ext.ExceptionMapper接口. import o ...

  9. Apache Dubbo 3.0.0 正式发布 - 全面拥抱云原生

    简介:一个新的里程碑! 一.背景 自从 Apache Dubbo 在 2011 年开源以来,在一众大规模互联网.IT公司的实践中积累了大量经验后,Dubbo 凭借对 Java 用户友好.功能丰富.治理 ...

  10. 参与Apache顶级开源项目的N种方式,Apache Dubbo Samples SIG 成立!

    简介:一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献,总觉得我的代码被社区合并了,我才算一个贡献者,这是一个常见的错误认知.其实,在一个开源社区中有非常多的角色是 non-code cont ...

最新文章

  1. WebForm中使用MVC
  2. python选择排序从大到小_经典排序算法和Python详解之(一)选择排序和二元选择排序...
  3. 提醒ASP.NET的初学者们注意加深以下方面的技术了解
  4. 任务调度之Quartz2
  5. 基于事件驱动架构构建微服务第11部分:持续集成
  6. 未转变者服务器未正常运行,未转变者Battleye服务不能正常运行 | 手游网游页游攻略大全...
  7. C++PrimerP104
  8. onlinephototool免费在线图片处理器
  9. stata15中文乱码_如何解决Stata14的中文乱码问题
  10. 使用特征函数计算随机变量的数学期望和方差
  11. 不同币种间的清账 应付账款是USD记账 预付账款账款是人民币记账 如何清账
  12. ​KeePassXC:社区驱动的开源密码管理器​
  13. 【三】多线程 —— 设计模式
  14. 艾永亮:苹果缺乏创新能力?打造超级产品是未来增长的关键
  15. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子
  16. labelme画出的标注json转换成二值标签图,并解决label全黑问题
  17. 【机器学习】7 支持向量机
  18. Tomcat重启单个服务
  19. 有一个网页地址, 比如百度主页: https://www.baidu.com/ 如何得到它的内容?
  20. 【论文阅读】Multi-hop Question Answering via Reasoning Chains

热门文章

  1. 如何在.NET控制台应用程序中获取应用程序的路径?
  2. php的toast,Windows通知服务:401尝试在PHP中创建Toast通知时无效令牌
  3. java 8 kafka 0.82,运行kafka-console-producer.sh的异常(0.8.1.1)
  4. STM32:UART中的硬件流控RTS与CTS
  5. 普林斯顿大学计算机科学研究生条件,普林斯顿大学之计算机科学系
  6. java 读取 文件 short_Java RandomAccessFile readShort()方法
  7. jupyter 导入文件路径_更改jupyter notebook默认存储路径
  8. 【Spring第六篇】注解:Annotation
  9. JavaWeb的JSP原理,详细解析(建议收藏)
  10. 快速生成CSS样式语法(HTML、CSS)