zoukankan      html  css  js  c++  java
  • Dubbo简易学习

    0.  Dubbo简易介绍

      DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    1.  架构演变

       

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

    2.  常见问题

      在大规模服务化之前,应用可能只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡。

      (1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。

      此时需要一个服务注册中心,动态的注册和发现服务,使服务的位置透明。

      并通过在消费方获取服务提供方地址列表,实现软负载均衡和Failover,降低对F5硬件负载均衡器的依赖,也能减少部分成本。

      (2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。

      这时,需要自动画出应用间的依赖关系图,以帮助架构师理清理关系。

      (3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?

      为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。

      其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

    3.  Dubbo简易项目

      3.1  项目结构:

        

        dubbo-parent :所有项目的父项目,统一管理依赖等

        dubbo-api:提供对外暴露的API服务

        dubbo-provider:服务的生产者,提供对API的实现

        dubbo-consumer:服务的消费者,

      3.2       pom.xml

        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    
            <!-- frameworks -->
            <org.springframework.version>3.2.4.RELEASE</org.springframework.version>
    
        </properties>
      
      <dependencyManagement>
            <dependencies>
    
                <dependency>
                    <groupId>commons-io</groupId>
                    <artifactId>commons-io</artifactId>
                    <version>2.0.1</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                    <version>3.1</version>
                </dependency>
                <dependency>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                    <version>1.1.3</version>
                </dependency>
                <dependency>
                    <groupId>org.jboss.netty</groupId>
                    <artifactId>netty</artifactId>
                    <version>3.2.5.Final</version>
                </dependency>
                <dependency>
                    <groupId>javassist</groupId>
                    <artifactId>javassist</artifactId>
                    <version>3.12.1.GA</version>
                </dependency>
    
                <dependency>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                    <version>1.2.17</version>
                </dependency>
    
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-api</artifactId>
                    <version>1.7.5</version>
                </dependency>
                <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                    <version>1.6.6</version>
                </dependency>
    
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>dubbo</artifactId>
                    <!-- <version>2.5.4-SNAPSHOT</version> -->
                    <version>2.5.3</version>
                </dependency>
    
    
                <dependency>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                    <version>3.3.3</version>
                </dependency>
                <dependency>
                    <groupId>com.101tec</groupId>
                    <artifactId>zkclient</artifactId>
                    <version>0.3</version>
                </dependency>
    
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aop</artifactId>
                    <version>${org.springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aspects</artifactId>
                    <version>${org.springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-beans</artifactId>
                    <version>${org.springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context</artifactId>
                    <version>${org.springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-context-support</artifactId>
                    <version>${org.springframework.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                    <version>${org.springframework.version}</version>
                </dependency>
    
            </dependencies>
        </dependencyManagement>

       3.2       定义接口

        在dubbo-api项目中暴露对外提供的服务接口(API):

        

    /**
     * 
     * 测试接口
     * 
     * @author night
     */
    public interface HelloService {
    
        void echo(String str);
        
    }

       3.3  注册生产者服务

      编辑dubbo-provider项目的pom.xml文件,引入dubbo-api项目:

    <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.luisyang</groupId>
                <artifactId>dubbo-api</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.luisyang.dubbo</groupId>
                <artifactId>dubbo-api</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <!-- dubbo 需要的jar start -->
            <dependency>
                <groupId>org.jboss.netty</groupId>
                <artifactId>netty</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
            </dependency>
            <!-- dubbo 需要的jar end -->
    
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </dependency>
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </dependency>
    
            <!-- Common Dependency End -->
    
            <!-- Spring Dependency Begin -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <scope>compile</scope>
            </dependency>
    
            <!-- Spring Dependency End -->
        </dependencies> 

             添加接口实现:

    public class HelloServiceImpl implements  HelloService{
    
            public void echo(String str) {
                // TODO Auto-generated method stub
                System.out.println("Hello  " +str +"  !!!!!");
            }
    
    }

      添加服务配置文件:

    <?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"
        xmlns:context="http://www.springframework.org/schema/context" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
        
        <!-- 读入配置属性文件 -->
        <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="ignoreResourceNotFound" value="false" /> 
              <property name="ignoreUnresolvablePlaceholders" value="true" />  
            
            <property name="locations">
                <list>
                    <value>file:conf/*.properties</value>
                </list>
            </property>
        </bean>
        
        <dubbo:provider>
             <dubbo:parameter key="shutdown.timeout" value="10000" /> <!-- 单位毫秒 -->
        </dubbo:provider>
        
        <!-- owner应用或者服务的负责人 -->
        <dubbo:application name="demo-provider" owner=""/>
        
        <!-- 建议将internal配置放到公共配置文件中 -->
        <dubbo:registry id="internal" protocol="${dubbo.registry.internal.protocol}" address="${dubbo.registry.internal.address}" />
         <dubbo:registry id="external" protocol="${dubbo.registry.external.protocol}" address="${dubbo.registry.internal.address}" />
        
        <!--  大文件传输,协议选择rmi -->
         <dubbo:protocol name="rmi" port="1099" accesslog="log/access.log" /> 
        
        <dubbo:protocol name="dubbo" port="20880" accesslog="true">
            <dubbo:parameter key="shutdown.timeout" value="10000" /> <!-- 单位毫秒 -->
        </dubbo:protocol>
        
        <bean id="helloService" class="org.luisyang.dubbo.api.impl.HelloServiceImpl" />
        
        <!-- 
                    当consumer发现所有服务不可用时,mock的使用场景
         <provider delay="-1" /> 当spring容器有依赖,需要
         <protocol/service/reference timeout="1000"  默认1000ms, 复杂/阻塞时间比较长的服务可以加大 
         -->
        <dubbo:service interface="org.luisyang.dubbo.api.HelloService" ref="helloService" protocol="dubbo" registry="internal"  />
        <!-- internal暴露给内部的,external是暴露给外部的(比如网银) -->
        <!-- <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" protocol="rmi" registry="internal" /> -->
        
    </beans>  

         添加日志配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
    
        <appender name="FIlE_LOG" class="org.apache.log4j.RollingFileAppender">
            <param name="File" value="log/provider.log" />
            <param name="Append" value="true" />
            <param name="MaxFileSize" value="15000KB" />
            <param name="MaxBackupIndex" value="100"/>
            <param name="encoding" value="UTF-8"/>
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n" />
            </layout>
        </appender>
        
        <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n" />
            </layout>
        </appender>
        <root>
            <level value="INFO" />
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="FIlE_LOG" />
        </root>
    </log4j:configuration>

             添加属性配置文件(dubbo-rpc.properties):

    dubbo.registry.internal.protocol=zookeeper
    dubbo.registry.external.protocol=zookeeper
    dubbo.registry.internal.address=192.168.91.132:2181
    dubbo.registry.external.address=192.168.91.132:2181

      dubbo.provider.servcie.version=1.0.0

             添加属性配置文件(dubbo.properties):

    dubbo.container=log4j,spring
    dubbo.application.name=demo-provider
    dubbo.application.owner=william
    dubbo.shutdown.hook=true
    #dubbo.registry.address=multicast://224.5.6.7:1234
    #dubbo.registry.address=zookeeper://127.0.0.1:2181
    #dubbo.registry.address=redis://127.0.0.1:6379
    #dubbo.registry.address=dubbo://127.0.0.1:9090
    #dubbo.monitor.protocol=registry
    dubbo.protocol.name=dubbo
    dubbo.protocol.port=20880
    #dubbo.protocol.host=192.168.116.1
    dubbo.service.loadbalance=roundrobin
    #dubbo.log4j.file=logs/dubbo-demo-consumer.log
    #dubbo.log4j.level=WARN

             添加测试类:

        /**
     * 
     * 发布服务 
     * 
     * @author night
     */
    public class ProviderTest {
    
    
        public static void main(String[] args) throws Exception {
            
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springContext.xml");
            
            context.start();
            
            System.in.read();
        }
    
    }

      3.5       注册服务消费者

          同上服务生产者,pom文件中引入dubbo-api的依赖

                                           日志配置文件也同上。

         添加服务配置文件:

    <?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-2.5.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
        
        <!-- 读入配置属性文件 -->
        <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="ignoreResourceNotFound" value="false" /> 
              <property name="ignoreUnresolvablePlaceholders" value="true" />  
            
            <property name="locations">
                <list>
                    <value>file:conf/*.properties</value>
                </list>
            </property>
        </bean>
        
        
        <dubbo:application name="demo-consumer" />
        
        <dubbo:consumer timeout="100000" />
        
        <dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" />
        
        <dubbo:reference id="helloService" interface="org.luisyang.dubbo.api.HelloService" protocol="dubbo" check="false"/>
    
    </beans>

        添加服务属性配置文件(dubbo.properties):

    dubbo.container=log4j,spring
    dubbo.application.name=demo-consumer
    dubbo.application.owner=william
    #dubbo.registry.address=multicast://224.5.6.7:1234
    #dubbo.registry.address=localhost:2181
    dubbo.registry.address=192.168.91.132:2181
    #dubbo.registry.address=redis://127.0.0.1:6379
    #dubbo.registry.address=dubbo://127.0.0.1:9090
    #dubbo.monitor.protocol=registry
    dubbo.protocol.name=dubbo
    dubbo.protocol.port=20880
    dubbo.service.loadbalance=roundrobin
    
    dubbo.consumer.ref.version=1.0

        添加消费服务测试类:

    /**
     * 
     *  消费服务
     * 
     * @author night
     */
    public class ConsumerTest {
    
        public static void main(String[] args) throws Exception {
            
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("springContext.xml");
            context.start();
            
            HelloService helloService = (HelloService) context.getBean("helloService");
            int i  = 1; 
            while(true){
                helloService.echo("word"+i);
                Thread.sleep(1000);
                i ++;
            }
        }
    }

        3.6       注册中心

        由于Dubbo启动需要到第三方的注册中心查询/注册服务信息。(本示例中采用的是Zookeeper。)

        Linux下简易搭建单节点的Zookeeper服务。

        下载地址:

            http://mirrors.cnnic.cn/apache/zookeeper/

        将Zookeeper安装拷贝至远程服务器中。

        

        

          [root]# tar –zxvf zookeeper-3.4.6.tar.gz

          [root]# mv zookeeper-3.4.6 zookeeper

               [root]# cd zookeeper

               [root]# touch conf/zoo.cfg

               [root]# vi conf/zoo.cfg

        拷贝如下内容:

    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/opt/zookeeper/data
    dataLogDir=/opt/zookeeper/logs
    clientPort=2181

        

        启动Zookeeper服务:

         [root]#  ./bin/zkServer.sh start

        查看服务状态:

         [root]#  ./bin/zkServer.sh status

        停止服务:

         [root]#  ./bin/zkServer.sh stop

        

        3.7       测试:

        运行ProviderTest.java 将服务注册到服务中心。

        

          运行ConsumerTest.java消费服务。

         

        

    4.参考资料

      Dubbo官网:

          http://dubbo.io/

      用户指南:

          http://dubbo.io/User+Guide-zh.htm

      Zookeeper官网:

         http://zookeeper.apache.org/

      Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错):

         http://doc.okbase.net/congcong68/archive/112508.html

    5.示例下载

      dubo-parent

      

  • 相关阅读:
    几个新角色:数据科学家、数据分析师、数据(算法)工程师
    人类投资经理再也无法击败电脑的时代终将到来了...
    Action Results in Web API 2
    Multiple actions were found that match the request in Web Api
    Routing in ASP.NET Web API
    how to create an asp.net web api project in visual studio 2017
    网站漏洞扫描工具
    How does asp.net web api work?
    asp.net web api history and how does it work?
    What is the difference between a web API and a web service?
  • 原文地址:https://www.cnblogs.com/LuisYang/p/6054117.html
Copyright © 2011-2022 走看看