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项目中可以看出,支持各种服务注册组件:

打开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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值