分布式系统架构——dubbo与SSM整合问题

原文链接:http://www.2cto.com/kf/201606/515503.html


随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。其中阿里的dubbo就是一款分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案。

一、Dubbo简介

1.1 背景与需求

随着互联网的发展,上网的人越来越多。加之移动互联的普及,更加快了互联网的脚步。随之而来的,便是对网站应用的强大挑战,和飞速的成长。下面我们就简单总结一下网站系统的成长史。

单一应用框架
当网站流量很小时,只需一个应用,将所有的功能都不熟在一起,以减少不熟节点和成本。 此时,用于监护增删改查工作量的数据访问框架(ORM)是关键。 垂直应用框架
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。 分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。 流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。

1.2 什么是Dubbo

Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。

主要核心部件有:
1. Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制.
2. RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能
3. Registry: 服务目录框架用于服务的注册和服务事件发布和订阅.

1.3 Dubbo架构

节点角色说明:

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

调用关系说明:

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

二、Dubbo的简单使用

2.1 准备工作

使用maven配置dubbo

?

1

2

3

4

5

<code class="hljs xml"><dependency>

    <groupid>com.alibaba</groupid> 

    dubbo</artifactid>

    <version>2.4.10</version>

</dependency></code>

2.1 服务提供端(provider)

第一步:配置provider.xml

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code class="hljs xml"><!--?xml version="1.0" encoding="UTF-8"?-->

 

    <!-- 提供方应用信息,用于计算依赖关系 -->

    <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 ref="demoService" interface="com.xiaocao.mydubbo.DemoService">

    <!-- 和本地bean一样实现服务 -->

    <bean class="com.xiaocao.mydubbo.impl.DemoServiceImpl" id="demoService">

</bean></dubbo:service></dubbo:protocol></dubbo:registry></dubbo:application></beans></code>

第二步:设计接口与实现类

接口:

?

1

2

3

4

<code class="hljs cs">package com.xiaocao.mydubbo;

public interface DemoService {

    public String sayHello(String name);

}</code>

实现类:

1

2

3

4

5

6

7

8

9

10

11

<code class="hljs java">package com.xiaocao.mydubbo.impl;
 
import com.xiaocao.mydubbo.DemoService;
 
public class DemoServiceImpl implements DemoService{
    @Override
    public String sayHello(String name) {
        return "hello" + name;
    }
}
</code>

2.2 服务使用端(consumer)

第一步:配置consumer.xml

1

2

3

4

5

6

7

8

9

10

<code class="hljs xml"><!--?xml version="1.0" encoding="UTF-8"?-->
 
     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <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.xiaocao.mydubbo.DemoService">
</dubbo:reference></dubbo:registry></dubbo:application></beans></code>

第二步:将provider的接口生成jar包引入,或者之际拷贝到consumer项目(包名必须一样)

2.3 测试

privider端:

1

2

3

4

5

6

7

8

9

10

11

<code class="hljs java">package com.xiaocao.mydubbo.main;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Provider {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "provider.xml" });
        context.start();
        System.in.read(); // 按任意键退出
    }
}</code>

consumer端:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code class="hljs avrasm">package com.xiaocao.mydubbo.main;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.xiaocao.mydubbo.DemoService;
 
public class Consumer {
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "consumer.xml" });
        context.start();
        DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理
        String hello = demoService.sayHello("  dubbo "); // 执行远程方法
        context.close();
        System.out.println(hello);
    }
}</code>

结果:

三、Dubbo与SSM框架整合实现分布式系统

整合的话需要注意两个问题:
1. 使用spring的时候,他总是加载不了dubbo下的xsd文件,而是去http://code.alibabatech.com/schema/dubbo/dubbo.xsd下载。而阿里的网站已经停了好几个月了,所以命名空间不能使用,需要手动配置。
解决办法:取下载好的dubbo的jar包META-INF下的xsd文件,配置到eclipse的xml配置中
2. Dubbo缺省依赖以下三方库:


我们在使用mybatis与spring整合的时候,使用spring至少是3.0版本。而Dubbo引用的是2.*版本。会引起版本冲突。
解决办法:修改pom文件中的dubbo<�喎�"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxwcmUgY2xhc3M9"brush:java;"> com.alibaba     dubbo     ${dubbo.version}     org.springframework             spring             4.1.2             

整合步骤一:在web.xml配置加载provider.xml

使用spring容器加载写好的provider.xml文件

1
2
3
4
5
6
7
8
<code class="hljs xml"><!-- 初始化spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext-*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener></code>

注:我的provider配置文件命名的是applicationContext-privider.xml

整合步骤二:共享接口文件

整合步骤三:在consumer端使用Ioc注解,像本地一样调用即可

四、感想

dubbo其实是使用配置文件的方式包装了RPC远程过程调用,而RPC的底层实现,其实是使用了动态代理和Socket通信。所以乍一看dubbo的功能很神奇,可以让使用本地方法一样实现远程调用,其实内在的机制只是简单的技术进行组合。

总结:我们在学习的过程中,总是会听到前辈们给我们强调基础的重要性。这确实是很简单但是很重要的真理。技术不断的推陈出新,我们只是学习使用技术是永远赶不上的,更别说有所创新和发展了。其实新技术的产生,往往都是一些你我都知道的技术经过重新组合而产生的,只要我们能理解了基本的技术和知识,应对任何新技术的产生都能很快的理解和应用。

再说一遍我之前博客说过的话吧:技术其实就在那里,多不多少不少,只要我们思维足够开阔,就能够把一些简单的技术组合成一种让人耳目一新的技术。而在中国其实从不缺乏技术人才,而是缺乏技术的想象力,只有我们将已有的技术进行大胆的想象和组合,就能让我们的技术流行起来,让别人追赶我们的思维,而不是我们一直再用双手追赶别人的思维,这样是永远赶不上的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • Dubbo是什么 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式...
    Coselding阅读 17,165评论 3 196
  • 我记得我看这本书的时候,他没走,就睡守在我的屋外。 我听见瓦片一滴滴的掉落,裸露在地面上,就像换灯泡时触电的感觉。...
    JerryDJ阅读 246评论 0 0
  • 初中时看三毛的《梦里花落知多少》,在还不懂爱情的年纪,却在被窝里哭的像失了恋的姑娘。那时在无数个香甜的梦境里,我遇...
    啊喵星人阅读 460评论 0 2
  • 上大学的人总是怀念高中,甚至从前脚踏入大学的门槛开始,就希望回去高中,回去熟悉的校园,回到熟悉的人身边。后来发现其...
    伊荷依阅读 932评论 1 7