文档章节

十分钟入门并理解Dubbo

青木_
 青木_
发布于 2015/11/05 22:41
字数 2147
阅读 350
收藏 5

1. Dubbo是什么?

        Dubbo是阿里巴巴开源的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。当我们的系统访问量和业务越来越大的时候,不可避免的需要拆分应用进行服务化,以提高开发效率,调优性能,节省关键竞争资源等

核心包含:

        远程通信:基于netty封装的NIO实现长连接,request->response模式交换数据。

        多协议支持:dubbo对使用者十分的友好,每个模块都提供了多种可随意切换的实现,比如序列化(dubbo,hessian2,java...),transporter协议(mina,netty,grizzy),注册中心(Redis,zookeeper,multicast)。

        自动发现:基于注册中心目录服务,服务消费放能够动态的感知到服务提供者的变化,动态的加入新的服务提供者或者减少提供者,来进行平滑的性能调整,同时使调用的地址透明化。

        集群容错:提供基于方法的透明远程调用(RPC),包括软件负载均衡,读写分离,失败容错,自动重试,地址路由,服务无状态。


2. Dubbo能做什么?

    1. 透明的远程方法调用,等同于injvm一样的调用远程方法,只需要简单的配置,没有任何API入侵,对现有代码零改动。

    2.软负载均衡,可在内网替代F5等硬件设备,降低成本,且无单点问题。

    3.服务的自动注册与发现,服务提供者的地址动态的获取,基于注册中心,使服务无状态,因此服务提高了消费端是完全无状态耦合。能干很平滑的添加减少服务提供者的机器。

    4.对spring的支持,dubbo对spring做了schema的扩展对应用API无入侵,只需要配置在spring容器中即可完成启动。


3. Dubbo的架构

截取至dubbo官方文档

节点角色说明:

Provider:暴露服务的服务提供方。

Consumer:调用远程服务的消费放。

Registry:服务注册与发现的注册中心。

Monitor:统计服务的调用册数和调用时间的监控中心。

Conntainer:服务运行容器。

调用关系说明:

1. 服务容器负责启动,加载,运行服务提供者。

2. 服务提供者在启动时,向注册中心注册自己提供的服务。

3. 服务消费者在启动时,向注册中心订阅自己所需的服务。

4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。



4. Dubbo的使用

1.安装注册中心
       安装zookeeper注册中心

http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.3.6/zookeeper-3.3.6.tar.gz

解压进入${zookeeper.home}/config --> 重命名zoo_sample.cif --> zoo.cfg

编辑zoo.cfg 修改 dataDir=/tem/zookeeper --> dataDir=${zookeeper.home}/data

启动zookeeper注册中心,进入${zookeeper.home}/bin window下直接运行zkServer.cmd 查看控制台无错误输出表示成功启动zookeeper。



2.  项目创建以及结构讲解(需要用到maven的知识,请google或者百度)

            

 如上图为一个完成的子模块项目:

    dubbo-demo: 一个字模块的基模块,主要用于整个子模块管理,公共依赖插件的配置。

    dubbo-api : 存放的是的服务接口以及实体类异常类,此包将被服务的具体调用者(dubbo-web)和服务的提供者(dubbo-service)依赖。

    dubbo-service:这是我们需要进行暴露的服务的具体提供者,需要实现服务接口(dubbo-api)所定义的所有接口,并且需要依赖到dubbo的jar注册到注册中心进行服务发布,一般使用dubbo提供的Main.main方法启动暴露服务即可。

    dubbo-web:依赖dubbo的相关和接口项目(dubbo-api)同时注册到注册中心获取动态获取到具体的服务,就可以实现透明的RPC了。



3. 定义服务接口(在dubbo-api模块中定义)

    首先创建实体类,实体类请实现序列化接口

public class Demo implements Serializable {
    private int id;
    private String name;

//getter setter

    public Demo(int id, String name) {
        this.id = id;
        this.name = name;
    }

}

        创建需要暴露服务接口

public interface DemoApi {
	
    List<Demo> getDemos();
	
    void insert(Demo demo);
	
}



4. 编写provider(dubbo-service)

        首先在service模块 pom.xml文件加入所需要的依赖

<dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.4.10</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
            <exclusions>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <!-- logback -->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.13</version>
        </dependency>
        <!-- log4j 实际调用slf4j -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.7.5</version>
            <scope>runtime</scope>
        </dependency>
        <!--此处就是我们定义的接口-->
        <dependency>
            <groupId>dubbo-demo</groupId>
            <artifactId>demo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

        创建服务实现类

public class DefaultDemoApi implements DemoApi {
    public List<Demo> getDemos() {

        System.out.println("rpcContext out 111" + RpcContext.getContext().getAttachment("test"));
        return Arrays.asList(
                new Demo(1, "name")
                , new Demo(2, "name2")
                , new Demo(3, "name3")
        );
    }
    public void insert(Demo demo) {
        System.out.println(String.format("save dome s%",demo));
    }
}



5. 进行服务暴露

        使用Spring xml方式暴露服务

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://code.alibabatech.com/schema/dubbo  http://code.alibabatech.com/schema/dubbo/dubbo.xsd"
        >
    <dubbo:module name="dubbo-demo"/>
    <!--配置应用的名称 配置使用的日志 版本号 以及负责人-->
    <dubbo:application name="eku-forum-provider" logger="slf4j" version="1.0" owner="demo" />
    <!--配置注册中心 使用zookeeper -->
    <dubbo:registry protocol="zookeeper" address="localhost:2181" file="false"/>
    <!--配置provider的暴露端口号 可以固定 也可以填写-1 -1表示随机保证不冲突,threads把表示配置处理业务的线程池-->
    <dubbo:protocol port="28807" threads="20"/>

    <!--此处为使用spring激活本地服务 这里采用xml 也可以使用注解扫描包的方式-->
    <bean id="defaultDemoApi" class="com.eku.demo.service.DefaultDemoApi"/>
    <!--暴露服务-->
    <dubbo:service interface="com.eku.demo.api.DemoApi" ref="defaultDemoApi"/>
</beans>

        讲该配置文件放置在dubbo约定的的资源目录(resources/META-INF/dubbo)下dubbo即可完成自动的读取和解析啦。如下图(这里使用了logback做日志系统,具体百度google)

           

 



       编写服务的启动类

public class DemoApp {
    public static void main(String[] args) {
        com.alibaba.dubbo.container.Main.main(args);
    }
}

        对!你没有看错 只需要这样dubbo的服务就成功启动了,有兴趣可以查看下main方法的源码,他会去扫描上面约定好的目录,并且启动spring,然后加钩子清理资源,最后wait(),推荐这种方式启动服务,成功启动之后的样子大概是这样的:



6. 编写消费端

        请在消费端中加入和service一样的pom的依赖。并且在resources中新建spring的XML配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:dubbl="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://code.alibabatech.com/schema/dubbo  http://code.alibabatech.com/schema/dubbo/dubbo.xsd"
        >
    <dubbo:module name="dubbo-demo"/>
    <!--配置应用的名称 配置使用的日志 版本号 以及负责人-->
    <dubbo:application name="eku-workshop-web" logger="slf4j" version="1.0"   owner="demo" />
    <!--配置注册中心-->
    <dubbo:registry protocol="zookeeper"  address="localhost:2181" file="false"/>
    <!--配置需要引用的服务接口-->
    <dubbo:reference id="dubboDemoApi" interface="com.eku.demo.api.DemoApi"/>
</beans>

        编写调用者类,其实呢调用者就和普通的spring一模一样了,不行看代码。

public class DemoInvokeTest {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:application-consumer.xml");
        DemoApi api = (DemoApi)context.getBean("dubboDemoApi");
        System.out.println(api.getDemos());
      
    }
}

        对就是这么简单。在实际的项目中一般的消费放都是web,如果是使用spring项目那么在你spring中引入该文件即可,代码中的注入注解(@Autowired,@Resource)完全不用动,Spring也会自动注入远程的代理类。除了配置文件没有一点入侵哈。

    到此就结束啦,想要看日志要加入logback.xml哦。

  



     欢迎加入dubbo技术交流群128436143,技术源于沉淀。


© 著作权归作者所有

青木_
粉丝 11
博文 2
码字总数 2992
作品 0
闵行
高级程序员
私信 提问
加载中

评论(1)

芋道源码
芋道源码
5分钟看完了
dubbo 初始操作。简单理解1

目前来说 分布式系统已经十分普遍,国内常用的架构通常为两种,dubbo与springCloud。虽然两种小弟都在本地耍过,可没有实际经验,基本还停留在纸上谈兵的阶段。 如今公司使用了dubbo,特意做...

冰暝
2018/09/04
25
0
真正的成熟

昨天晚上,我觉得挺累,不想做饭了……家庭主妇决定要给自己放个假,给小宝点个外卖凑合一下。她听到这个消息,欢喜雀跃地给自己点了一份必胜客的套餐,算好了送货小哥上门点时间,开始了激动...

cutecarol2017
2017/10/15
0
0
节流(throttle)与防抖(debounce)

频繁触发回调导致的大量计算会引发页面的抖动甚至卡顿。为了规避这种情况,我们需要一些手段来控制事件被触发的频率。就是在这样的背景下,throttle(事件节流)和 debounce(事件防抖)出现...

ShawnSun
08/17
0
0
微服务架构实战学习(四):RPC 框架对比

下面是对市面上比较流行的 RPC 框架的对比 以上对比是我结合各框架的网上资料以及官方文档资源总结的,在实际的使用过程中。我们可以结合我们的业务场景来选择不同的框架。 虽然说没有最好的...

雨林_a1d6
2018/06/11
0
0
区块链入门教程

原文出处:阮一峰 区块链(blockchain)是眼下的大热门,新闻媒体大量报道,宣称它将创造未来。 可是,简单易懂的入门文章却很少。区块链到底是什么,有何特别之处,很少有解释。 下面,我就...

阮一峰
2018/01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部