dubbo-helloword

【背景】
分布式架构的普遍运用是类似dubbo等SOA框架出现的必然条件,旨在方便各个服务间的相互调用。这里借用dubbo官网的一句话:分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

2017-05-16_103507.png

上图可以看出传统的mvc(垂直架构)之后(RPC、SOA)均是将服务与接口分离,以便于多种平台的调用,达到一次开发重复使用的效果,简单的理解就是将service层单独分离出来,而controller层在调用service是夸服务器,传统的方式可以采用httpclient进行服务器间的接口调用,但是那样做除了代码冗余,不方便外,其次就是效率问题。

【架构】

2017-05-16_104250.png
节点说明:
    Provider: 暴露服务的服务提供方。
    Consumer: 调用远程服务的服务消费方。
    Registry: 服务注册与发现的注册中心(服务在调用之前先要注册)。
    Monitor: 统计服务的调用次调和调用时间的监控中心。
    Container: 服务运行容器。

运行流程:
    0 : 容器启动,加载服务(加载服务接口)
    1 : 服务提供方向注册中心注册自己的服务(将所有的服务接口信息到注册中心进行注册登记)
    2 : 消费方向注册中心发送接口请求(我要调用xxx接口)
    3 : 注册中心返回相应的服务地址(你要调用的接口在xxx地址,你去调用吧)
    4 :消费方依据服务地址调用服务(消费者拿着注册中心给的地址去调用服务)
    5 : Monitor进行服务调用的统计(谁来调用的,什么时间调用的等)

【优点】

(1) 连通性:

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

(2) 健状性:

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

(3) 伸缩性:

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

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

【入门案例】
【1:准备】

导入jar包
      dubbo的jar
      spring的jar : 做dubbo配置 
      zk的jar : 做注册中心

启动zookeeper服务

这里建两个工程,分离service与controller模拟跨服务调用

【2:provider服务方】

2017-05-16_110446.png

user.java

public class User implements Serializable {
    private String name;
    private int age;

    public User(){}
    public User(String name,int age){
        this.name = name;
        this.age = age;
    }
    //getter  setter 方法
    //tostring  方法      
}

SampleService.java

public interface SampleService {
    String sayHello(String name);
    public List<User> getUsers();
}

SampleServiceImpl.java

public class SampleServiceImpl implements SampleService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name;
    }

    @Override
    public List<User> getUsers() {
        List<User> list = new ArrayList<>();
        //模拟数据库数据
        User user1 = new User("zhangsan",16);
        User user2 = new User("lisi",14);
        list.add(user1);
        list.add(user2);
        return list;
    }

}

Provider.java

public class Provider {

    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"sample-provider.xml"});
        context.start();
        //为保证服务一直开着,利用输入流阻塞来模拟,开发中,这些应该打jar包在服务器上运行
        System.in.read();
    }
}

sample-provider.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="sample-provider"  />
 
    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://192.168.1.201:2181" />
 
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
 
    <!-- 声明需要暴露的服务接口,写操作可以设置retries=0避免重复调用SOA服务 -->
    <dubbo:service interface="dubbo.sample.provider.SampleService" ref="sampleService" />
 
    <!-- 具体实现bean -->
    <bean id="sampleService" class="dubbo.sample.provider.impl.SampleServiceImpl" />
 
</beans>

运行Provider.java启动注册服务接口

2017-05-16_111901.png

【3:consumer消费方】

2017-05-16_110506.png

user.java

public class User implements Serializable {
    private String name;
    private int age;

    public User(){}
    public User(String name,int age){
        this.name = name;
        this.age = age;
    }
    //getter  setter 方法
    //tostring  方法      
}

SampleService.java

public interface SampleService {
    String sayHello(String name);
    public List<User> getUsers();
}

Consumer.java

public class Consumer {

    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"sample-consumer.xml"});
        context.start();
        
        //获取service
        SampleService sampleService = (SampleService) context.getBean("sampleService");
        String hello = sampleService.sayHello("xiaojiang");
        System.out.println(hello);
        
        List<User> list = sampleService.getUsers();
        for(int i = 0 ; i<list.size();i++){
            System.out.println(list.get(i).toString());
        }
        
        System.in.read();
    }
}

sample-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="sample-consumer"  />
 
    <!-- 使用zookeeper注册中心暴露发现服务地址 -->
    <dubbo:registry address="zookeeper://192.168.1.201:2181" />
 
    <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
    <dubbo:reference id="sampleService" interface="dubbo.sample.provider.SampleService" />
 
</beans>

运行Consumer.java调用服务

2017-05-16_112036.png

这样就完成了项目间的简单调用

总结:

1:服务方提供的接口,消费方也要有相同的接口才能调用,只不过具体的接口实现在服务方
2:zookeeper注册中心可以理解为一个桥梁,记录着服务接口的信息,以供消费方进行调用
3:如果牵扯到具体的引用对象pojo,消费方要对应上服务方
4:xml总结
图解:

2017-05-16_112842.png

具体可以查看dubbo官方文档:http://dubbo.io/

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

推荐阅读更多精彩内容