读音 |ˈdʌbəʊ| !不是[dubəʊ]! 

(重点:调用步骤)

Dubbo是什么

Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包括:

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

Dubbo能做什么

Dubbo功能强大,总结下来,它大致可以做以下几件事:

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

Dubbo架构图

这是最重要的,理解Dubbo的架构图是理解Dubbo的第一步,我从Dubbo官网手册上截了一下Dubbo架构图:

在接下来的讲解之前,说明一个概念:所谓SOA也好,分布式服务框架也好,不是服务消费者从中间件(一般都是Zookeeper)上去拿数据,而是服务消费者从中间件上拿到可用的服务生产者的集群地址(生产者地址列表),再从集群地址中选出一个进行直连

接下来认识一下图中的结点:

  • Provider:暴露服务的服务提供方,或者直白点说就是服务生产者
  • Consumer:调用远程服务的服务消费方,也就是服务消费者
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心
  • Container:服务(生产者)运行容器

调用步骤

(阿里:SOA怎么提供服务的,调用服务的。答:调用步骤->负载均衡->一致性hash算法)

图中已经有了调用步骤了,接着对步骤进行说明:

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

Dubbo用法

Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入(这句话的意思是应用程序不会、不需要手动调用Dubbo的任何类和任何接口),只需用Spring加载Dubbo的配置即可(意思是对Dubbo的使用只需要写Spring配置文件或注解),Dubbo基于Spring的Schema扩展进行加载。

如果不想使用Spring配置,而希望通过API的方式进行调用,可以自己看一下官方手册Dubbo API配置,但是,这种做法十分不推荐。

下面简单说明一下Dubbo的用法,首先要定义服务生产者的接口及其实现,那么定义一个接口(该接口需要单独打包,在生产者和消费者之间共享):

package com.xrq.dubbo.demo;

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

在服务生产者处实现接口(对服务消费者隐藏接口实现细节):

package com.xrq.dubbo.demo.provider;

import com.xrq.dubbo.demo.DemoService;

public class DemoServiceImpl implements DemoService
{
public String sayHello(String name)
{
return "Hello " + name;
}
}

写一个provider.xml,在服务生产者使用Spring暴露服务:

<?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:application name="hello-world-app" /> <!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.xrq.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.xrq.dubbo.demo.provider.DemoServiceImpl" /> </beans>

在服务消费者处写一个consumer.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:application name="consumer-of-helloworld-app" /> <!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry address="multicast://224.5.6.7:1234" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" /> </beans>

服务消费者处只要通过Spring拿到demoService,即可像使用本地接口一样使用DemoService这个接口里面的方法:

import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xrq.dubbo.demo.DemoService; public class Consumer
{
public static void main(String[] args) throws Exception
{
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext(new String[] {"http://aaa.bbb.ccc:dddd/eee/fff/consumer.xml"});
context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
String hello = demoService.sayHello("world"); // 执行远程方法 System.out.println(hello); // 显示调用结果
}
}

看到整个过程中:

1、没有任何Dubbo的代码,使用Dubbo的时候全部都是Spring配置,这就是前面提到的Dubbo对应用没有任何API侵入

2、不需要考虑底层线程模型、序列化、反序列化、url解析等问题,这些都是Dubbo底层做好的

Dubbo是什么的更多相关文章

  1. 用dubbo时遇到的一个序列化的坑

    首先,这是标题党,问题并不是出现在序列化上,这是报错的一部分: Caused by: com.alibaba.dubbo.remoting.RemotingException: Failed to s ...

  2. dubbo服务提供与消费

    一.前言 项目中用到了Dubbo,临时抱大腿,学习了dubbo的简单实用方法.现在就来总结一下dubbo如何提供服务,如何消费服务,并做了一个简单的demo作为参考. 二.Dubbo是什么 Dubbo ...

  3. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

  4. Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出现的问题

    现互联网公司后端架构常用到Spring+SpringMVC+MyBatis,通过Maven来构建.通过学习,我已经掌握了基本的搭建过程,写下基础文章为而后的深入学习奠定基础. 首先说一下这篇文章的主要 ...

  5. Dubbo 备注

    Dubbo是阿里开源的一款服务治理中间件,主要包含如下节点: Provider: 暴露服务的服务提供方. Consumer: 调用远程服务的服务消费方. Registry: 服务注册与发现的注册中心. ...

  6. Dubbo学习小记

    前言 周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境. 熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是 ...

  7. Running Dubbo On Spring Boot

    Dubbo(http://dubbo.io/) 是阿里的开源的一款分布式服务框架.而Spring Boot则是Spring社区这两年致力于打造的简化Java配置的微服务框架. 利用他们各自优势,配置到 ...

  8. 【转】Dubbo使用例子并且和Spring集成使用

    一.编写客户端和服务器端共用接口类1.登录接口类public interface LoginService {    public User login(String name, String psw ...

  9. 基于SOA分布式架构的dubbo框架基础学习篇

    以需求用例为基,抽象接口,Case&Coding两条线并行,服务(M)&消费(VC)分离,单元.接口.功能.集成四层质量管理,自动化集成.测试.交付全程支持. 3个大阶段(需求分析阶段 ...

  10. dubbo连接zookeeper注册中心因为断网导致线程无限等待问题【转】

    最近维护的系统切换了网络环境,由联通换成了电信网络,因为某些过滤规则导致系统连不上zookeeper服务器(应用系统机器在深圳,网络为电信线路,zookeeper服务器在北京,网络为联通线路),因为我 ...

随机推荐

  1. Centos6.5下VNC Server配置

    整个流程如下~ 1.首先,检查下本机是否安装了vnc: 提示没有安装,那么开始装吧: 2.先关闭防火墙 查看防火墙状态: 关闭防火墙: 注:要切到root下 [carsonzhu@localhost ...

  2. html DOM導航

    getElementByTagname()獲取所有相同標籤的節點列表,length表示節點的長度: lastchild表示最後一個子節點,firstchild表示第一個子節點,parentnode表示 ...

  3. LODOP弹出对话框获取保存文件的路径

    通常一般不会让用户自己在文本框里填上路径,因为路径要输入字母字符等比较麻烦,而且用户硬盘里文件很多,也不知道要保存在哪里,LODOP可以弹出一个选择保存路径的弹窗,然后把返回选择的路径值.这样用户就可 ...

  4. 删除文件,copy文件bat

    由于IntelliJ IDEA Build Artifacts速度实在是无法忍受,特整理了一个bat脚本方便maven install后更新jar文件到部署包 del /F /S /Q D:\Idea ...

  5. mysql中存储过程

    存储过程procedure 存储过程,其本质还是函数——但其规定:不能有返回值: 定义形式: 说明: 1,in:用于设定该变量是用来“接收实参数据”的,即“传入”:默认不写,就是in 2,out:用于 ...

  6. linux一次性解压多个.gz或者.tar.gz文件

    对于解压多个.gz文件的,用此命令: for gz in *.gz; do gunzip $gz; done 对于解压多个.tar.gz文件的,用下面命令: for tar in *.tar.gz; ...

  7. Shell基础知识(三)

    Shell中变量的作用域: 在当前Shell会话中使用,全局变量. 在函数内部使用,局部变量. 可以在其他Shell会话中使用,环境变量. 局部变量: 默认情况下函数内的变量也是全局变量 #!/bin ...

  8. [poj1275][Cashier Employment]

    poj1275 题目大意: 每天有24小时,每个小时需要一定的人.有m个人每个人会有一个开始工作的时间,每个人会工作8小时,问至少需要多少人才能完成任务.如果这m个人也不能完成任务就输出"N ...

  9. c 的内存分配与释放原则: 通常应遵循“谁malloc,谁free”的原则。

    通常应遵循“谁malloc,谁free”的原则. ------------------------   一位大神的话. 2013-02-09

  10. react性能检测与优化

    网页运行最重要的是速度快嘛,那我们怎么知道网页运行的时候,哪些部分快哪些部分慢呢? 我们可以安装react性能检测工具进行检测,通过安装 然后修改app/index.jsx文件 ,在要检测的组件运行之 ...