Apache Dubbo的使用

一.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项目中可以看出,支持各种服务注册组件:
Apache Dubbo的使用
文章图片

打开dubbo项目的注册模块,可以看到支持eureka,zookeeper,nacos,consul等注册中心服务组件。
3.运行期流量调度:内置条件,脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能
4,智能负载均衡:内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。
5.支持多种配置中心
Apache Dubbo的使用
文章图片

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查看
Apache Dubbo的使用
文章图片

我用的 阿里云主机,已经安装了open-jdk 1.8,所以可以直接安装zookeeper了
由于github上的dubbo项目(https://github.com/apache/dubbo),下载下来看到使用的zookeeper是3.4.13,所以我准备在阿里云上也安装3.4.13版本zookeeper
Apache Dubbo的使用
文章图片

可以去官网下载tar包上传到服务器:
Apache Dubbo的使用
文章图片
但是官网上最新稳定版是3.6.1,而且只提供了三个最新版本的下载链接,官网提供的各个镜像网站也只提供这三个版本的下载,没有3.4.13版本
Apache Dubbo的使用
文章图片

Apache Dubbo的使用
文章图片

算了,那下载3.4.14版本算了
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
Apache Dubbo的使用
文章图片

然后解压
tar -zxvf zookeeper-3.4.14.tar.gz
然后进入zookeeper解压后的目录下的conf目录下,复制zoo_sample.cfg 为zoo.cfg
Apache Dubbo的使用
文章图片

vim 命令打开zoo.cfg文件
Apache Dubbo的使用
文章图片
修改一下
dataDir =/usr/data/zookeeper
dataLogDir=/usr/data/zookeeper/log
切换到usr目录下创建data/zookeeper/log多级目录
cd /usr
mkdir -p data/zookeeper/log
Apache Dubbo的使用
文章图片

配置环境变量:
vim /etc/profile
在最后面添加:(我打开文件,发现里面的环境变量已经配置好了,如下,包括jdk的环境变量也配好了)
ZOOKEEPER_HOME=/usr/software/zookeeper-3.4.14
PATH=$PATH:$ZOOKEEPER_HOME/bin
export PATH ZOOKEEPER_HOME PATH
Apache Dubbo的使用
文章图片

重新加载:
source /etc/profile
然后到阿里云控制台开放zookeeper的2181端口
Apache Dubbo的使用
文章图片

启动zookeeper
zkServer.sh start
查看状态:
zkServer.sh status
Apache Dubbo的使用
文章图片

重启:
zkServer.sh restart
关闭:
zkServer.sh stop
准备环境已经就绪,接下来可以上手一个dubbo的简单项目了
2.2 Dubbo的官方demo
Apache Dubbo的使用
文章图片

在dubbo-demo模块下还有四个子模块,annotation(注解方式开发),xml(xml方式配置开发)
主要看一下xml配置方式的开发(由于dubbo基于接口代理)所以,会需要先创建一个interface模块
相关依赖:受限是dubbo-demo的pom文件

4.0.0org.apache.dubbo dubbo-parent ${revision} ../pom.xml dubbo-demopom ${project.artifactId} The demo module of dubbo projecttrue dubbo-demo-interface dubbo-demo-xml dubbo-demo-annotation dubbo-demo-api org.apache.dubbo dubbo-bom ${project.parent.version} pom import

然后是dubbo-demo-interface下的pom
4.0.0org.apache.dubbo dubbo-demo ${revision} ../pom.xml dubbo-demo-interfacejar ${project.artifactId} The demo module of dubbo projecttrue

打包方式是jar的方式,因为一会儿服务提供方即provider需要引入这个dubbo-demo-interface依赖
官方dubbo-demo-interface模块,给了两个接口,这是其中一个Demoservice
Apache Dubbo的使用
文章图片

当然接口内容也可以自己自定义方法
package org.apache.dubbo.demo; import java.util.concurrent.CompletableFuture; public interface DemoService {String sayHello(String name); default CompletableFuture sayHelloAsync(String name) { return CompletableFuture.completedFuture(sayHello(name)); }}

接下来看服务提供类
在另外一个模块中dubbo-demo-xml中(以xml配置方式开发),可以看到有两个子模块,一个是服务提供,一个是服务消费
Apache Dubbo的使用
文章图片

dubbo-demo-xml项目下的pom
org.apache.dubbo dubbo-demo ${revision} ../pom.xml 4.0.0pomdubbo-demo-xmltrue 2.1.4.RELEASE dubbo-demo-xml-provider dubbo-demo-xml-consumer org.apache.dubbo dubbo-metadata-report-zookeeper ${project.parent.version} org.springframework.boot spring-boot-maven-plugin ${spring-boot-maven-plugin.version} repackage

先看服务提供dubbo-demo-xml-provider的pom文件
4.0.0org.apache.dubbo dubbo-demo-xml ${revision} ../pom.xml dubbo-demo-xml-providerjar ${project.artifactId} The demo provider module of dubbo projecttrue 1.7.25 org.apache.dubbo dubbo-demo-interface ${project.parent.version} org.apache.dubbo dubbo-registry-multicast org.apache.dubbo dubbo-registry-nacos com.alibaba.nacos nacos-client org.apache.dubbo dubbo-registry-zookeeper org.apache.dubbo dubbo-configcenter-zookeeper org.apache.dubbo dubbo-configcenter-nacos org.apache.dubbo dubbo-metadata-report-nacos org.apache.dubbo dubbo-metadata-report-zookeeper org.apache.dubbo dubbo-rpc-dubbo org.apache.dubbo dubbo-config-spring org.apache.dubbo dubbo-remoting-netty4 org.apache.dubbo dubbo-serialization-hessian2 org.apache.dubbo dubbo-qos org.slf4j slf4j-api org.slf4j slf4j-log4j12 ${slf4j-log4j12.version} log4j log4j

可以看到provider中引入了之前的demo-interface

Apache Dubbo的使用
文章图片

官方也已经引入了zookeeper依赖
provider中对接口进行了简单的实现
Apache Dubbo的使用
文章图片

接下来比较重要的部分来了,就是配置文件在resources目录下:
Apache Dubbo的使用
文章图片

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

配置好了之后,需要服务提供方的启动类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模块下)
Apache Dubbo的使用
文章图片

然后点开support包,发现这个support包又为了另一个模块下(dubbo-rpc-rest)
Apache Dubbo的使用
文章图片

那么既然找不到这个包,应该是maven仓库没有这个项目jar包,接下来,通过maven命令install
Apache Dubbo的使用
文章图片

结果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
又看了一下项目模块,有个这个模块
Apache Dubbo的使用
文章图片

那么再install一下这个模块,build success
好了,这下应该可以install dubbo-rpc-rest这个模块了,但是发现又报了新的错误
Apache Dubbo的使用
文章图片

模块中有一个类不能编译
Apache Dubbo的使用
文章图片

maven install命令,控制台有乱码,需要解决一下
参考下边这个里边的第二种方案,在项目模块的pom文件中添加配置,试了无效,再试第一种配置
https://blog.csdn.net/qq_39999478/article/details/80045624
Apache Dubbo的使用
文章图片

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

改了这个配置之后,竟然maven install 显示build success了,神奇!!
Apache Dubbo的使用
文章图片

接下来重新启动服务提供方provider模块Application这个类(之前是报找不到包和类的错误)
发现可以打印类信息以及启动信息了,但是还是启动失败(java.lang.IllegalStateException:zookeeper not connected)
Apache Dubbo的使用
文章图片

提示zookeeper未连接
在linux服务器上关闭防火墙再试一下
systemctl stop firewalld.service

还是提示zookeeper未连接,再看上边的提示,有一个sessionTimeout=60000,但是dubbo项目中默认配置的超时时间是3000L
具体源码追溯可以参考这个博客,按照这个博客(dubbo集成zipkin问题二【Caused by: java.lang.IllegalStateException: zookeeper not connected】),改了超时时间,成功连接,并启动provider模块
Apache Dubbo的使用
文章图片

然后启动成功了
Apache Dubbo的使用
文章图片

接下来看服务消费方:pom文件
4.0.0org.apache.dubbo dubbo-demo-xml ${revision} ../pom.xml dubbo-demo-xml-consumerjar ${project.artifactId} The demo consumer module of dubbo projecttrue org.apache.dubbo dubbo-metadata-report-zookeeper org.apache.dubbo dubbo-demo-interface ${project.parent.version} org.apache.dubbo dubbo-registry-multicast org.apache.dubbo dubbo-registry-nacos com.alibaba.nacos nacos-client org.apache.dubbo dubbo-registry-zookeeper org.apache.dubbo dubbo-configcenter-zookeeper org.apache.dubbo dubbo-configcenter-nacos org.apache.dubbo dubbo-metadata-report-nacos org.apache.dubbo dubbo-config-spring org.apache.dubbo dubbo-rpc-dubbo org.apache.dubbo dubbo-remoting-netty4 org.apache.dubbo dubbo-serialization-hessian2

服务消费方要调用provider模块的服务
Apache Dubbo的使用
文章图片

着重看配置文件:

然后启动消费方
Apache Dubbo的使用
文章图片

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

    推荐阅读