一.Dubbo的发展历史以及特性简介
目录
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.xsd
http://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.xsd
http://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