什么是Dubbo?

Dubbo是一个分布式、高性能、透明化的RPC服务框架,提供服务自动注册、自动发现等高效服务治理方案,可以和Spring框架无缝集成。

Dubbo的主要应用场景?

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

Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 [1]  Spring框架无缝集成。

Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。(见百度。。。)
Dubbo开发文档:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
Dubbo API文档:https://pan.baidu.com/s/16bg1X1ymiZLj1-lyrE6MPg     提取码:8k4z
 
Dubbo的核心功能?
  • Remoting:网络通信框架,提供多种NIO框架封装,包括“同步转异步”和“请求-响应”模式的信息交换方式
  • CLuster:服务框架,提供基于玖蔻方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  • Registry:服务注册,基于注册中心目录服务,使服务消费方能动态查找服务提供方,使地址透明,使服务方可以平滑增加或减少机器。
 Dubbo推荐使用什么协议?
默认使用dubbo协议
Dubbo默认采用什么注册中心是什么?
默认采用Zookeeper
 
单一应用架构

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

垂直应用架构

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

分布式服务架构

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

流动计算架构

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集 群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

架构

节点角色说明:

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

调用关系说明:

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

Dubbo架构具有一下几个特点:连通性/伸缩性/健壮性/以及向未来架构的升级性

连通性

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

健壮性

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

  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

伸缩性

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

升级性

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

 
 
 
框架分层结构中,各个层次的设计要求:
  1. 服务接口层(service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现
  2. 配置层(Config):对外配置接口,以ServiceConfig和ReferenceConfig为中心,可以直接new配置类,也可以通过spring解析配置生成配置类
  3. 服务代理层(Proxy):服务接口透明代理,生成服务的客户端stub和服务器端Skeleton,以ServiceProxy为中心,扩展接口为ProxyFactory
  4. 服务注册层(Registry):封装服务地址的注册与发现,以服务URL为中心,扩展接口为RegistryFactory、Registry和RegistryService。可能没有服务注册中心,此时服务提供方直接暴露服务。
  5. 集群层(Cluster):封装多个提供者的路由及负载均衡,并桥接注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router、和LoadBalance。将多个服务提供房租和为一个提供服务方,实现服务消费来透明,只需要与一个服务提供方进行交互。
  6. 监控层(Monitor):RPC调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor和MonitorService
  7. 远程调用层(Protocol):封装RPC调用,以Invocation和Result为中心,扩展接口为Protocol、Invoker和Exporter。Protocol是服务域,它是Invoker暴露和引用的主功能入口,它负责Invoker的声明周期管理。Invoker是实体域,它是dubbo的核心模型,其他模型都向他靠拢,它代表一个可以执行的体,可向他发起invoker电泳,他有可能是一个本地的实现,也有可能是一个远程的实现,也可能一个集群实现
  8. 信息交换层(Exchange):封装请求响应模式,同步转异步,以Request和Response为中心,扩展接口为Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。
  9. 网络传输层(Transport):抽象main和netty为统一接口,以Message为中心,扩展接口为:channel、Transporter、Client、Server、Codec
  10. 数据序列化层(Serialize):可复用的一些工具,扩展接口为Serialization、ObjectInput、ObjectOutput和ThreadPool
节点角色说明
节点 角色说明
Deployer 自动部署服务的本地代理
Repository 仓库用于存储服务应用发布包
Scheduler 调度中心基于访问压力自动增减服务提供者
Admin 统一管理控制台
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心

Demo:

  • 创建一个普通的Maven工程 dubboparent,在pom.xml文件中导入要使用的坐标
  <dependencies>

         <dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.9</version>
</dependency> <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3..RELEASE</version>
<scope>test</scope>
</dependency> </dependencies>
  • 在dubboparent的上面新建一个模块dubbo-provider的工程和dubbo-consumer的工程和dubbo-common(分别作为提供者和消费者)。
  • 上述的工程建好之后,在三个子模块的pom的文件中会自动引入父工程例如:
         <parent>
    <artifactId>dubbo-parent</artifactId>
    <groupId>zh.stu.Dubbo</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>
  • 当然在父工程中也会引入子工程例如:
         <modules>
    <module>dubbo-provider</module>
    <module>dubbo-consumer</module>
    <module>dubbo-consumer</module>
    <module>dubbo-common</module>
    </modules>

    每一个模块都会加入进来

  • 因为consumer和provider模块都会依赖common模块,所以在他们两个的模块中添加common的依赖(引入common)
         <dependencies>
    <dependency>
    <groupId>zh.stu.Dubbo</groupId>
    <artifactId>dubbocommon</artifactId>
    <version>1.0-SNAPSHOT</version>
    </dependency>
    </dependencies>
  • 在common模块中添加一个接口
     package zh.stu.service;
    
     public interface HelloService {
    
         public String HelloDubbo(String name);
    }
  • 在provider中实现这个接口
     package zh.stu.service.iml;
    
     import zh.stu.service.HelloService;
    import com.alibaba.dubbo.config.annotation.Service;
    
    
    @Service

    5 public class HelloServiceImpl implements HelloService {
    public String HelloDubbo(String name) {
    return "hello"+name;
    }
    }

    接着在resource中新建一个spring的文件夹,用于存放配置文件。再在spring这个文件夹下创建一个XML Configuration File下的Spring config命名为:dubbo-provider。在配置文件中配置:

     <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:application name="hello-world-app" />
    <!-- 使用multicast广播注册中心暴露服务地址 ,注意其中multicast主要是用来做测试用的,一般到实际的项目中就是使用zookeeper-->
    <dubbo:registry address="multicast://224.5.6.7:1234" />
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="zh.stu.service.HelloService" ref="demoService" />
    <!-- 和本地bean一样实现服务 -->
    <bean id="demoService" class="zh.stu.service.iml.HelloServiceImpl" />
    </beans>
  • 最后写一个测试类进行测试。同样是在provider模块下在Test文件夹下新建一个Java类。
     package zh.stu.test;
    
     import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    import zh.stu.service.HelloService; import java.io.IOException; @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:spring/dubbo-provider.xml"}) public class HelloServiceDubbo { @Autowired
    private HelloService helloService; @Test
    public void starttest() throws IOException {
    // helloService.HelloDubbo("dubbo");
    System.out.println("启动dubbo服务");
    System.in.read();
    }
    }

    控制台会输出【启动dubbo服务】

 

最新文章

  1. 15个关于Chrome的开发必备小技巧[译]
  2. 从微软下载安装Windows10
  3. 【笔记6】用pandas实现条目数据格式的推荐算法 (基于物品的协同)
  4. ajax 请求如何解决乱码
  5. SSH三大框架笔面试总结
  6. SZU-A22
  7. 【C语言】12-指向一维数组元素的指针
  8. Prime Path 分类: 搜索 POJ 2015-08-09 16:21 4人阅读 评论(0) 收藏
  9. HttpWebRequest&#39;s Timeout and ReadWriteTimeout — What do these mean for the underlying TCP connection?
  10. 插件svn简单使用
  11. Jenkins 实际项目操作
  12. android文字阴影效果设置
  13. SpringMVC 国际化-中英文切换
  14. 13.MySQL(一)
  15. JQ方法实用案例///鼠标移动到div和修改ipt中弹窗、CSS鼠标变小手、JQ获取元素属性、JQ选择器
  16. 深度学习框架Tensor张量的操作使用
  17. 在Altium Designer 10中实现元器件旋转45&#176;角放置
  18. OpenCL科普及在ubuntu 16.04 LTS上的安装
  19. Qt之QLocalSocket
  20. 为什么const对象只能调用const成员函数,而不能调用非const成员函数?

热门文章

  1. KiCAD实用操作
  2. htop资源管理器
  3. CICS FILE OPEN
  4. Codeforces 1149D 最短路 状压DP
  5. 笔记61 Spring Boot快速入门(一)
  6. 了解跨站请求伪造CSRF
  7. leetcode-164周赛-1269-停在原地的方案数
  8. Oracle系列教程之一软件安装与卸载
  9. Python 内置模块:os模块
  10. json格式化在线工具推荐