Dubbo的使用及原理浅析

原文地址:http://www.cnblogs.com/wang-meng/p/5791598.html

Dubbo是什么?

Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

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

名词解析:

SOA 面向服务架构(Service Oriented Architecture)

RPC: 远程过程调用(Remote Procedure Call)

NIO 网络接口对象

其核心部分包含:

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

Dubbo能做什么?

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

Spring集成

  • Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

    上面简单介绍了Dubbo的一些概念, 这里再给一张图来形象的形容下:

 

我们用这张图来形容 , 那么映射到 项目中:
      当我们在多个Tomcat部署不同的系统时, 例如A系统(TomcatA)想调用B系统(TomcatB)中的服务, 这时Dubbo就有了用武之地. 首先我们需要B系统在注册中心将自己的Url注册进去, 然后注册中心将Url返还给系统A, 那么系统A就可以调用了. 当然了我这里说的只是Dubbo的一种用法, 在这个项目中使用的也是Dubbo的远程调用功能. (感觉真的和webservice有点像)

下面就步入正题, 看看Dubbo在项目中的使用实例:
1, 在linux下安装Zookeeper
这个地方就不详细概述Zookeeper的安装了, 前面关于Linux的博文已经有讲过在Linux下软件的安装了, 这里安装好后直接启动 Zookeeper.

2, 使用需求
在这里 当我们有一种需求, 我们需要在后台(console)去对商品(product)做一些操做, 而这里我们只能够使用到公共的service方法, 那么怎么调用product中service的实现呢? 
项目结构:

公共service方法:
TestTbService.java:

1 package cn.itcast.core.service;

2

3 import cn.itcast.core.bean.TestTb;

4

5 public interface TestTbService {

6     public void insertTestTb(TestTb testTb);

7 }




product中的service实现类:
TestTbService.java:

1 package cn.itcast.core.service;

2

3 import org.springframework.beans.factory.annotation.Autowired;

4 import org.springframework.stereotype.Service;

5 import org.springframework.transaction.annotation.Transactional;

6

7 import cn.itcast.core.bean.TestTb;

8 import cn.itcast.core.dao.TestTbDao;

9

10 @Service("testTbService")

11 @Transactional

12 public class TestTbServiceImpl implements TestTbService {

13

14     @Autowired

15     private TestTbDao testTbDao;

16

17     //保存

18     public void insertTestTb(TestTb testTb){

19         testTbDao.insertTestTb(testTb);

20     }

21 }

在console中使用product中的service实现类:
CenterController.java:

1 package cn.itcast.core.controller;

2

3 import java.util.Date;

4

5 import org.junit.runners.model.TestTimedOutException;

6 import org.springframework.beans.factory.annotation.Autowired;

7 import org.springframework.stereotype.Controller;

8 import org.springframework.ui.Model;

9 import org.springframework.web.bind.annotation.RequestMapping;

10

11 import cn.itcast.core.bean.TestTb;

12 import cn.itcast.core.service.TestTbService;

13

14 @Controller

15 public class CenterController {

16

17     @Autowired

18     private TestTbService testTbService;

19

20     //测试

21     @RequestMapping(value = "/test/index.do")

22     public void index(Model model){

23

24         TestTb testTb = new TestTb();

25         testTb.setName("范冰冰");

26         testTb.setBirthday(new Date());

27

28         testTbService.insertTestTb(testTb);

29

30     }

31 }

如果这样直接调用能够行的通吗?  当然是不行的, 在console里面定义的只是service方法, 那么这里是怎么直接调用到了product中的service实现类呢?

当然了, 这里就需要一些配置文件了:
首先是需要在product中注册服务:
dubbo-provider.xml:

1 <beans xmlns="http://www.springframework.org/schema/beans"

2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"

3     xmlns:context="http://www.springframework.org/schema/context"

4     xmlns:aop="http://www.springframework.org/schema/aop"

5     xmlns:tx="http://www.springframework.org/schema/tx"

6     xmlns:task="http://www.springframework.org/schema/task"

7     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

8     xsi:schemaLocation="http://www.springframework.org/schema/beans

9         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

10         http://www.springframework.org/schema/mvc

11         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

12         http://www.springframework.org/schema/context

13         http://www.springframework.org/schema/context/spring-context-4.0.xsd

14         http://www.springframework.org/schema/aop

15         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

16         http://www.springframework.org/schema/tx

17         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

18         http://www.springframework.org/schema/task

19            http://www.springframework.org/schema/task/spring-task-4.0.xsd

20         http://code.alibabatech.com/schema/dubbo

21         http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

22

23

24         <!-- 整合Dubbo -->

25         <!-- 第一步:Dubbo起名称    计算用此名称来区分   -->

26         <dubbo:application name="babasport-service-product"/>

27         <!-- 第二步:中介  注册中心: zookeeper  redis ... -->

28         <!-- <dubbo:registry address="192.168.200.128:2181,192.168.200.129:2181,192.168.200.130:2181" protocol="zookeeper"/> -->

29         <dubbo:registry address="192.168.200.128:2181" protocol="zookeeper"/>

30         <!-- 第三步:设置dubbo的端口号     192.168.40.88:20880/接口  -->

31         <dubbo:protocol name="dubbo" port="20880"/>

32         <!-- 第四步:设置服务提供方 提供的接口 -->

33         <dubbo:service interface="cn.itcast.core.service.TestTbService" ref="testTbService"/>

34

35 </beans>

接下来就是在console中使用了:
服务消费方:
dubbo-cusmer.xml:

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:task="http://www.springframework.org/schema/task"

xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-4.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

http://www.springframework.org/schema/task

http://www.springframework.org/schema/task/spring-task-4.0.xsd

http://code.alibabatech.com/schema/dubbo

http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<!-- 整合Dubbo -->

<!-- 第一步:Dubbo起名称    计算用此名称来区分   -->

<dubbo:application name="babasport-console"/>

<!-- 第二步:中介  注册中心    zookeeper  redis ... -->

<!--<dubbo:registry address="192.168.200.128:2181,192.168.200.129:2181,192.168.200.130:2181" protocol="zookeeper"/> -->

<dubbo:registry address="192.168.200.128:2181" protocol="zookeeper"/>

<!-- 第三步:调用服务提供方 提供的接口 -->

<dubbo:reference interface="cn.itcast.core.service.TestTbService" id="testTbService"/>

</beans>

原文地址:https://www.cnblogs.com/lflying/p/10986371.html

时间: 2024-10-14 22:39:06

Dubbo的使用及原理浅析的相关文章

【Spark Core】TaskScheduler源码与任务提交原理浅析2

引言 上一节<TaskScheduler源码与任务提交原理浅析1>介绍了TaskScheduler的创建过程,在这一节中,我将承接<Stage生成和Stage源码浅析>中的submitMissingTasks函数继续介绍task的创建和分发工作. DAGScheduler中的submitMissingTasks函数 如果一个Stage的所有的parent stage都已经计算完成或者存在于cache中,那么他会调用submitMissingTasks来提交该Stage所包含的Tas

Handler原理浅析

    理解Handler的原理首先要搞清楚什么是Looper,在我的上一篇博文中对此有专门的介绍.Looper的作用是开启一个消息循环,从MessageQueue(Message队列,是Looper的成员变量)中循环取出消息处理.一个线程要使用Handler来处理来自其它线程的消息,这个线程必须有且仅有一个Looper对象与之绑定,也可以说一个Looper对象是是与一个线程一一对应的. Hander有一个Looper类型的成员,在Handler的构造函数(new Handler()或者new

微信QQ的二维码登录原理浅析

在很多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),二维码验证,多终端辅助授权应用开始多起来,这里先说下啥是二维码,其实二维码就是存了二进制数据的黑白图片,当出现要求二维码登录的时候,服务器会生成一条临时的唯一的二维码信息,发送到客户端以二维码(图片)的形式写入到网页,然后你就会看到统一的四个方形的二维码,如果做的好这个二维码信息应该是有时效的,这里暂且不考虑这些,就简单的微信登录作为例子看看吧: 首先说下整个授权流程: 在客户端网页中会不断向服

LINQ内部执行原理浅析

C#3.0 增加LINQ的特性 一.基本概念 LINQ,语言级集成查询(Language INtegrated Query) 经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段.程序员现在都已经认同像类(classes).对象(objects).方法(methods)这样的语言特性.考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来

iOS 关于微信检测SDK应用的原理浅析

微信作为一个开放平台,各方面都是做得比较好的,推出了SDK之后,微信与使用了SDK的应用便能进行更多交互.但在iOS平台上,应用间交换数据还是相对麻烦的,那么微信为什么能直接在应用检测到其他使用了SDK的应用呢?基于这个疑问,我用了一个下午研究其原理. 一.SDK的方法 我之前也没使用过微信的SDK,不过下载后,查看发现SDK接口有这么一段 1 /*! @brief WXApi的成员函数,在微信终端程序中注册第三方应用. 2 * 3 * 需要在每次启动第三方应用程序时调用.第一次调用后,会在微信

如何在App中实现朋友圈功能之一朋友圈实现原理浅析——箭扣科技Arrownock

如何在App中实现朋友圈功能 之一 朋友圈实现原理浅析 微信朋友圈.新浪微博.知乎等知名朋友圈类型功能,大家有没有想过其实现的逻辑呢? 本文以微信朋友圈功能为例,解析实现逻辑. 朋友圈的结构: 朋友圈从总体上来说会分为6块结构,分别是墙.用户.图片.墙贴.评论与点赞. 墙:一块公共的墙,所有的墙贴都位于其上,如果APP只实现朋友圈功能,那么墙贴其实是可以不用的,但是如果APP要实现朋友圈.新闻圈等等其他各种墙贴类型消息的话,那么墙就显得很有必要了,这时候我们需要通过建立不同的墙来展示不同类型的墙

【Spark Core】TaskScheduler源代码与任务提交原理浅析2

引言 上一节<TaskScheduler源代码与任务提交原理浅析1>介绍了TaskScheduler的创建过程,在这一节中,我将承接<Stage生成和Stage源代码浅析>中的submitMissingTasks函数继续介绍task的创建和分发工作. DAGScheduler中的submitMissingTasks函数 假设一个Stage的全部的parent stage都已经计算完毕或者存在于cache中.那么他会调用submitMissingTasks来提交该Stage所包括的T

Javascript自执行匿名函数(function() { })()的原理浅析

匿名函数就是没有函数名的函数.这篇文章主要介绍了Javascript自执行匿名函数(function() { })()的原理浅析的相关资料,需要的朋友可以参考下 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数指没有指定函数名或指针的函数,自执行匿名函数只是其中一种,下文中称这种函数为:自执行函数 下面是一个最常见的自执行函数: // 传统匿名函数 (function() { alert('hello'); })(); 这段代码的执行效果就是在页面再载入时弹出

vue的双向绑定原理浅析与简单实现

很久之前看过vue的一些原理,对其中的双向绑定原理也有一定程度上的了解,只是最近才在项目上使用vue,这才决定好好了解下vue的实现原理,因此这里对vue的双向绑定原理进行浅析,并做一个简单的实现. vue双向绑定的原理浅析 vue数据的双向绑定是通过数据劫持,并结合发布-订阅模式的方式来实现的. 我们先通过一个最简单的vue例子来查看vue初始化数据上的对象到底是什么东西. var vm = new Vue({ data: { // 双向绑定的数据对象 obj: { a: 1 } }, cre