zoukankan      html  css  js  c++  java
  • Dubbo 体验(一)

        最近新加入一个项目组,所使用的是Dubbo,采用的架构是分布式架构,数据库采用MySQL分片。之前也接触过一下,但为了能更好融入团队,所以找Dubbo官网看文档。

    才发现Dubbo的官网已搬去apache。好吧,最近太关注于SpringCloud。

    附上现在Dubbo地址 :http://dubbo.apache.org/zh-cn/docs/user/quick-start.html 。

    Dubbo由于之前没咋更新,被人诟病。但无可争议,这是一个很强大的服务治理框架,历经双十一考验,有着非常完整的中文文档。

     十月底,看到一则消息,Spring Cloud Alibaba正式入驻Spring Cloud官方孵化器!附上阿里的spring-cloud地址:

    https://github.com/spring-cloud-incubator/spring-cloud-alibaba 。

      什么鬼, 似乎跑题了耶,废话不说,先来Dubbo试一波。

    Dubbo 是什么

      一款分布式服务框架

      高性能和透明化的RPC远程服务调用方案

      SOA服务治理方案

    顺便一提RPC:

    来自百度百科:

    RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

    大概意思可以这么理解:现在有两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络传输调用。 A可以通过使用参数将信息传送给B,而后可以通过传回的结果得到信息。而这一过程,对于开发人员来说是透明的。

    官网Dubbo 架构图

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


    调用关系说明

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

     Dubbo使用

           Dubbo是基于Spring的Schema进行扩展,对应用没有任何API侵入,就是说开发者采用只需要采用Spring即可开发。

    本次Demo 采用maven+idea 进行开发,使用zookeeper作为服务注册中心。

    Server 端开发

    工程结构如下所示

     

     maven工程一般第一步就是配置pom.xml,导入jar包。

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.2.6.RELEASE</version>
            </dependency>
    
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>2.5.3</version>
            </dependency>
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>0.9</version>
            </dependency>
        </dependencies>
    
    </project>

     接下来是provider接口

    package com.dubbotest;
    
    public interface Provider{
        String send(String name) throws Exception;
    
    }

    provider实现类

    package com.dubbotest.impl;
    
    import com.dubbotest.Provider;
    
    public class DemoServiceImpl implements Provider {
        public String send(String name) throws Exception {
            System.out.println(" got a argument: " + name);
            return "message from provider: " + name;
        }
    }

    配置application.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
            ">
        <!-- 具体的实现bean -->
        <bean id="demoService"
              class="com.dubbotest.impl.DemoServiceImpl" />
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="anyname_provider" />
        <!-- 使用zookeeper注册中心暴露服务地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181" />
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
        <!-- 声明需要暴露的服务接口 -->
        <dubbo:service interface="com.dubbotest.Provider"
                       ref="demoService" />
    
    </beans>

    启动类

    package com.dubbo.test;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Test {
        public static void main(String[] args) throws Exception {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
            context.start();
            System.out.println(" provider run ");
            System.in.read(); // 按任意键退出
        }
    }

    Client端开发

    接下来,client差不多 ,工程结构如下所示

    也需配置接口,正常来说,可以将server的接口打成jar包,然后client端导入即可。

    配置application.xml,此处是consumer,用于远程服务调用。

    <?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
            ">
        <!-- 具体的实现bean -->
        <bean id="demoService"
              class="com.dubbotest.impl.DemoServiceImpl" />
        <!-- 提供方应用信息,用于计算依赖关系 -->
        <dubbo:application name="anyname_provider" />
        <!-- 使用zookeeper注册中心暴露服务地址 -->
        <dubbo:registry address="zookeeper://127.0.0.1:2181" />
        <!-- 用dubbo协议在20880端口暴露服务 -->
        <dubbo:protocol name="dubbo" port="20880" />
        <!-- 声明需要暴露的服务接口 -->
        <dubbo:service interface="com.dubbotest.Provider"
                       ref="demoService" />
    
    </beans>

    配置consumer 启动类

    package com.dubbo.test;
    
    import com.dubbotest.Provider;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import java.text.Format;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    public class Consumer {
        public static void main(String[] args)throws Exception {
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "applicationContext.xml" });
            context.start();
            Provider demoService = (Provider) context.getBean("demoService"); // 获取远程服务代理
            Format sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String  mgs = demoService.send(sdf.format(new Date()));// 执行远程方法
            System.out.println( mgs);// 显示结果
    
        }
    }

     OK,接下来,就是测试是否发送成功。先启动ZK,再启动Test类,在控制台可以看到  provider run ,说明启动成功。

    再启动consumer 类。可看到控制台,

    说明调用成功。

    总结

    通过这个Demo,我们可以看到,使用Dubbo,我们只需使用Spring配置即可开发,对应用无入侵性。

    其次我们无需关注底层的线程IO模型,网络通讯问题。

    还有就是服务自动注册与发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

  • 相关阅读:
    layui弹出层处理(获取、操作弹出层数据等)
    Unity3D判断鼠标向右或向左滑动,响应不同的事件
    (转载)李剑英的CSLight入门指南结合NGUI热更新
    Unity3D研究院之LZMA压缩文件与解压文件
    CSLight研究院之学习笔记结合NGUI(一)
    《暗黑世界GM管理后台系统》部署+功能说明文档
    Firefly卡牌手游《暗黑世界V1.5》服务器端源码+GM管理后台源码
    电信SDK Pay函数里面System.out.print 无输出消息
    WP8:在Unity中使用OpenXLive
    WP8:Unity3D之间的值传递
  • 原文地址:https://www.cnblogs.com/sunTin/p/9950997.html
Copyright © 2011-2022 走看看