dubbo配置和使用

一、Dubbo是什么?

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求;这容易和负载均衡弄混,负载均衡是对外提供一个公共地址,请求过来时通过轮询、随机等,路由到不同server。目的分摊压力。dubbo在淘宝也是解决他们实际问题的,不一定适合其他。

原理就是:A系统调用B系统接口服务, 后面就是怎么把这个流程,动态化(zookeeper通知)、权限化、配置化、低耦合化、自动化。

其核心部分包含:

  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

二. Dubbo能做什么?

1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。
2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

三.dubbo出现的背景

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,需一个治理系统确保架构有条不紊的演进。
目前市场一些基本的架构:

单一应用架构

当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。
此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。

垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
此时,用于加速前端页面开发的 Web框架(MVC) 是关键。

分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。

流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。
此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。
在大规模服务化之前,一般只是简单的暴露和引用远程服务,通过配置url进行调用,用f5或者nginx等进行负载均衡;

四、Dubbo架构

官网架构图:
在这里插入图片描述

节点角色说明:

Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。

调用关系说明:

0.服务容器负责启动,加载,运行服务提供者。
1 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

连通性:

注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小
监控中心负责统计各服务调用次数,调用时间等,统计先在内存汇总后每分钟一次发送到监控中心服务器,并以报表展示
服务提供者向注册中心注册其提供的服务,并汇报调用时间到监控中心,此时间不包含网络开销
服务消费者向注册中心获取服务提供者地址列表,并根据负载算法直接调用提供者,同时汇报调用时间到监控中心,此时间包含网络开销
注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
注册中心和监控中心都是可选的,服务消费者可以直连服务提供者

健状性:

监控中心宕掉不影响使用,只是丢失部分采样数据
数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
注册中心对等集群,任意一台宕掉后,将自动切换到另一台
注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
服务提供者无状态,任意一台宕掉后,不影响使用
服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性:

注册中心为对等集群,可动态增加机器部署实例,所有客户端将自动发现新的注册中心
服务提供者无状态,可动态增加机器部署实例,注册中心将推送新的服务提供者信息给消费者

升级性:

当服务集群规模进一步扩大,带动IT治理结构进一步升级,需要实现动态部署,进行流动计算,现有分布式服务架构不会带来阻力:

dubbo支持的注册中心

Dubbo提供的注册中心有如下几种类型可供选择:

Multicast注册中心
Zookeeper注册中心
Redis注册中心
Simple注册中心
ZooKeeper是一个开源的分布式服务框架,它是Apache Hadoop项目的一个子项目,主要用来解决分布式应用场景中存在的一些问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置管理等,它支持Standalone模式和分布式模式,在分布式模式下,能够为分布式应用提供高性能和可靠地协调服务,而且使用ZooKeeper可以大大简化分布式协调服务的实现,为开发分布式应用极大地降低了成本。

四、Dubbo使用

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。
1、启动zookeeper
参考上一篇博客:https://mp.csdn.net/mdeditor/97176024#
2. 建立项目
2.1首先创建一个maven父项目
创建过程参考:https://blog.csdn.net/u014429653/article/details/97181403
创建完成后可删除src文件夹,父项目用不到这个文件夹;
2.2接着创建DubboDemoApi、DubboDemoProvider、DubboDemoConsumer
在这里插入图片描述
一共分三个模块,每个模块都有独立的pom文件。
稍微说明一下三个模块的作用。DubboDemoApi内为公用接口,DubboDemoProvider提供远程服务,DubboDemoConsumer调用远程服务。
在这里插入图片描述
2.3 在DubboDemoApi内添加接口
写一个sayHello的方法

public interface DemoService {
    String sayHello(String name);
}

在这里插入图片描述
然后打成一个jar包
在这里插入图片描述
然后找到jar包对应的信息,利于下一步进行
在这里插入图片描述
2.4在DubboDemoProvider的pom.xml中添加依赖

    <dependencies>
        <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.9</version>
        </dependency>
        <dependency>
            <groupId>com.ali.dubbo</groupId>
            <artifactId>DubboDemoApi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.0.RELEASE</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.37.Final</version>
        </dependency>
    </dependencies>
    

在DubboDemoConsumer的pom.xml中添加依赖

            <dependencies>
        <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.3</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.9</version>
        </dependency>

        <dependency>
            <groupId>com.ali.dubbo</groupId>
            <artifactId>DubboDemoApi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.1.0.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

2.5 在DubboDemoProvider中实现接口

public class DemoServiceImpl implements DemoService {
    public String sayHello(String name) {
        System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());
        return "Hello " + name + ", response form provider: " + RpcContext.getContext().getLocalAddress();
    }
}

在这里插入图片描述
注意:此处@Service、@Override注解可不加,不影响;
引入import org.springframework.stereotype.Service;spring提供服务
或者import com.alibaba.dubbo.config.annotation.Service; 暴露远程服务,不影响;
2.6 在DubboDemoProvider中resources文件夹下添加配置文件provider.xml
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后在provider.xml中添加以下内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/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-2.5.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- provider's application name, used for tracing dependency relationship -->
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="demo-provider"/>
    
    <!-- 这里使用的注册中心是zookeeper -->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    
   <!-- use multicast registry center to discover service-->
   <!-- 也可以使用multicast广播注册中心 -->
    <!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <!-- use dubbo protocol to export service on port 20880 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 将具体的实现类加入到Spring容器中 -->
    <!-- service implementation, as same as regular local bean -->
    <bean id="demoService" class="com.alibaba.dubbo.demo.DemoServiceImpl"/>

    <!-- 将该接口暴露到dubbo中 -->
    <!-- declare the service interface to be exported -->
    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService"/>
</beans>

2.7创建Provider.java,然后启动,启动前先启动zookeeper

public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"provider"});
        context.start();
        System.out.println("----------------服务已启动,按任意键结束···········--------------------");
        System.in.read(); // press any key to exit
    }
}

DubboDemoProvider结构如下:在这里插入图片描述
2.8 在DubboDemoConsumer中resources文件夹下添加配置文件consumer.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/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-2.5.xsd
       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- consumer's application name, used for tracing dependency relationship (not a matching criterion),
    don't set it same as provider -->
    <dubbo:application name="demo-consumer"/>
    
    <!-- 这里使用的注册中心是zookeeper -->
    <dubbo:registry address="zookeeper://localhost:2181"/>
    
   <!-- use multicast registry center to discover service-->
   <!-- 也可以使用multicast广播注册中心 -->
    <!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->

    <!-- generate proxy for the remote service, then demoService can be used in the same way as the
    local regular interface -->
    <dubbo:reference id="demoService" check="false" interface="com.alibaba.dubbo.demo.DemoService"/>

</beans>

2.9 在DubboDemoConsumer中创建Consumer.java,然后启动,启动之前必须先启动Provider

public class Consumer {
    public static void main(String[] args){
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-consumer.xml"});
        context.start();
        DemoService demoService = (DemoService) context.getBean("demoService"); // get remote service proxy
        String hello = demoService.sayHello("world"); // call remote method
        System.out.println(hello);
    }
}

3.运行项目
先启动zookeeper,启动成功后启动provider,最后启动consumer
在这里插入图片描述
再运行Provider.java
在这里插入图片描述
再运行Consumer.java,成功调用
在这里插入图片描述

五、Dubbo-admin管理中心搭建

dubbo-admin有两种方法运行

1、使用war包运行

下载dubbo-admin

dubbo-admi再github上下载地址https://github.com/apache/dubbo/tree/2.5.x
注意:在github上的branch上选择2.5.x上有的,master分支上没有dubbuo-admin
在这里插入图片描述

打包war包

进入dubbo-admin这个文件目录 运行命令:

mvn package -Dmaven.skip.test=true

在这里插入图片描述
看到如下结果,说明打包成功了:
在这里插入图片描述
打包成功之后,就会发现dubbo-admin下多了个target文件夹,打开target文件夹,发现里面有个war包:
在这里插入图片描述

部署war包

我们得到dubbo-admin-2.5.10.war,下面我们将这个war包部署到tomcat上。

把dubbo-admin-2.5.10.war放到tomcat的webapps目录下;
启动tomcat,让tomcat把war解压了
在这里插入图片描述
在这里插入图片描述
划重点:如果一直提示unable to open the service ‘tomcat’,那么重新安装一个tomcat(注意一定要使用tomcat安装包,重新安装,不是解压可用那种),以上是在笔记本win7上测试通过;
另外在台式机win10上也可以用解压版tomcat,测试通过
*
在这里插入图片描述
tomcat的webapps里面就会多了这个文件夹:
在这里插入图片描述

运行war包

运行tomcat之前必须先运行zookeeper,zookeeper启动默认端口是8080,但是tomcat服务是8080在用,会冲突,启动前需要修改zookeeper端口为9091
去zoo.cfg文件中修改端口号,输入admin.serverPort=9091
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在浏览器输入:http://localhost:8088/dubbo-admin-2.5.10/

查找dubbo-admin的用户名和密码,去dubbo-admin下面查找dubbo.properties
用户名:root 密码:root
用户名:guest 密码:guest
在这里插入图片描述

2、使用jar包运行

在dubbo加入apache后,github地址也变了。dubbo-admin需要从https://github.com/apache/incubator-dubbo-ops下载。,必须切换到master分支
在这里插入图片描述
将项目克隆到本地后,可以看到dubbo-admin模块。
在这里插入图片描述
值得注意的是,最新的dubbo-admin集成了springboot,可以打包为jar运行。
进入dubboadmin项目 修改application.properties文件
dubbo-admin\src\main\resources\application.properties;zookeeper改为自己电脑安装的
在这里插入图片描述

cmd到在dubbo-admin下,执行mvn package -DskipTests=true,将dubbo-admin打成jar包。
在这里插入图片描述
打包完成后,我们会在dubbo-admin/target下看到dubbo-admin的jar包 。
在这里插入图片描述
在这里插入图片描述
注意:dubbo-admin的端口默认是7001,dubbo注册中心的地址是本机的2181端口
PS:注意必须先运行本机的zookeeper
运行jar包
在这里插入图片描述
启动后,浏览器输入http://localhost:7001即可访问,默认的用户名密码输入root,即进入首页。
在这里插入图片描述

3 查看服务提供者和消费者

主页
在这里插入图片描述
中英文切换
在这里插入图片描述

点击服务治理——服务
在这里插入图片描述
查看服务提供者
在这里插入图片描述
查看服务消费者
在这里插入图片描述

六、Dubbo-monitor监控中心搭建

监控平台与管理平台一样,不是必须品,仅仅作为统计服务的调用次调和调用时间的监控中心
下载地址:https://github.com/apache/incubator-dubbo-ops/tree/master
在这里插入图片描述
进入dubbo-monitor-package这个文件目录 (在pom.xml目录直接执行命令)运行命令:

mvn clean package -Dmaven.skip.test=true

在这里插入图片描述
在这里插入图片描述
执行完成后,会生成target文件夹,内有一个压缩文件dubbo-monitor-simple-2.0.0-assembly.tar.gz
解压该文件后如下:
在这里插入图片描述
conf目录下有dubbo.properties配置文件
在这里插入图片描述
dubbo.registry.address=zookeeper://127.0.0.1:2181(添加注册中心)

dubbo.protocol.port=7070:服务消费者和提供者通过该端口发送统计信息到monitor(监控平台)

dubbo.jetty.directory:7010:监控平台的端口,这里使用的是jetty容器,作用同tomcat

启动服务:

进入assembly.bin目录,执行start.bat即可
在这里插入图片描述
访问7010端口服务:http://localhost:7010/
在这里插入图片描述
这就是我们监控中心,如果想监控到我们的消费者和服务者使用情况,需要在消费者和服务提供者工程中进行相关的配置:

修改dubbo的消费者和提供者的配置文件,追加

<!-- 所有服务配置连接监控中心,进行监控统计 -->
<!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
 <!--方式1: 从注册中心自动获取 -->
<dubbo:monitor protocol="registry"></dubbo:monitor>
<!--方式2: 消费者直连监控中心 -->
<!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> -->

http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-monitor.html
在这里插入图片描述
重新启动消费者和服务提供者:

可以看到Services点进去有我们服务提供者发布的服务列表:
在这里插入图片描述
点击 Providers(1),可以看到提供者的详细信息,即提供者的URL
在这里插入图片描述
点击Consumers(1),可以看到消费者的详细信息,即消费者的URL
在这里插入图片描述
点击Statistics,成功的次数,失败的次数,平均花费的时间,最大花费的时间,并发的次数。
在这里插入图片描述
点击Charts,可以看到请求和响应的图表。
在这里插入图片描述

发布了23 篇原创文章 · 获赞 2 · 访问量 7040

猜你喜欢

转载自blog.csdn.net/u014429653/article/details/97179507