zoukankan      html  css  js  c++  java
  • Dubbo一文入门

    一、简介

       系统的架构,已从最早的单体式架构(一个war包完事)逐渐发展到目前的微服务式架构。微服务,将一个大型的复杂的应用系统,拆分成若干独立的松耦合的小的服务工程,每个服务工程可独立部署,每个服务只需要关注一类任务即可。微服务式架构目前比较代表性的技术有:Dubbo、SpringCloud等。

      Dubbo 最初由阿里巴巴开发使用,后捐献给Apache基金会。Dubbo基于Spring容器运行,提供了面向接口的远程方法调用。官方网站:http://dubbo.apache.org/zh-cn/

      Dubbo的框架结构如下:

        

       1、Registry

        注册中心,是用于发布和订阅服务的一个平台。官方推荐注册中心 ZooKeeper。注册中心ZooKeeper集群搭建详见:https://www.cnblogs.com/eric-fang/p/9283904.html

        (1)发布:服务端开发完毕,将服务的相关信息公开出去。公开的信息包括:服务端所在机器地址、接口名、方法、方法参数、返回、超时时间等。

        (2)订阅:客户端从注册中心去获取公开的服务信息

      2、consumer

        服务的消费者,也即客户端程序。

      3、Provider

        服务提供者,也即服务端程序

      4、Container

        服务端运行容器。Dubbo默认依赖Spring容器启动

      5、Monitor

        监控中心。Dubbo提供的一个jar工程。主要功能是监控统计服务端和客户端的相关使用数据的,比如:服务端多少接口、多少方法,调用次数等。客户端调用哪些服务接口、次数等

      6、管理控制台admin

        Dubbo提供一个war工程,用于实现Dubbo 服务端和客户端的管理,比如:集群负载、均衡策略。服务端可用性等。

    二、Dubbo的服务发布与订阅

      Dubbo的开发中,接口推荐的是单独建立个工程,这样便于服务实现的对外透明化,消费端直接依赖接口工程即可。

       详细示例代码详见 github:https://github.com/qiuhan00/dubbo

      其中,服务提供者注册后,zookeeper中显示如下:

       消费者注册信息:

    三、服务打包发布

       通常,推荐的服务启动方式为Dubbo框架默认提供的 Main 类启动,其中考虑了Dubbo的高级特性以及异常处理,并且实现优雅关机。但是注意的是,Main类启动扫描的Spring配置文件的路径为:/META-INF/spring/*.xml。

      1、使用assembly打包服务

        将代码打成 jar 包,并提供相应的启动文件,比如 start.sh等。执行启动脚本,自动加载执行Main类中的main方法。

        此种方式的打包,需要修改maven配置,新增打包插件,并且install功能也会修改。

      2、assembly打包服务步骤(下述中相关配置文件,详见 github:https://github.com/qiuhan00/dubbo

       (i)新建assembly文件夹,在assembly文件夹中,提供assembly.xml配置文件

       (ii)修改maven配置文件:提供指定打包配置

       (iii)执行 maven clean install。将会在target目录中生成tar.gz的压缩文件,解压后,执行bin目录中相应的启动文件即可:windows中start.bat,linux中start.sh

    四、Dubbo admin管理控制台服务

       老版本的Dubbo发布包中,有个DubboAdmin管理控制台项目,可打包成war,放到tomcat中运行。最新的Dubbo,已经抽出该控制台项目,发布正式版0.1,前后端分离技术,前端采用Vue,后端采用SpringBoot,发布可以使用 jar 运行启动,也可以前后端单独部署运行。相比较而言,新版本的控制台对于开发人员特别是后端程序员不是太友好,工具这东西,还是简单快捷点比较好。

      下面基于老版本的war包部署管理控制台应用,将war包复制到tomcat中webapps目录下,修改工程中的WEB-INF/dubbo.properties配置文件:

    # 注册中心位置. 配置格式为: 协议://IP:port访问. 可以传递参数.
    dubbo.registry.address=zookeeper://111.231.51.200:2181?backup=1111.231.51.200:2182,111.231.51.200:2183
    # 设定监控中心访问用户. 
    # dubbo.admin.用户名.password=密码
    dubbo.admin.root.password=root
    dubbo.admin.guest.password=guest

      注意,tomcat在每次启动的时候,都会去解压webapps目录中的war包文件,所以,第一次修改启动完成后,必须删除相应的war包。

      tomcat启动完成后,使用 http://localhost:8080/dubboadmin/ 访问,输入上面配置的用户名密码即可,出现下面画面即为启动成功

       可以很清晰的看出,目前应用数、提供者、消费者统计数信息。具体使用,在服务治理中有很多具体的子项目,可以自己尝试使用。

    五、Dubbo Monitor监控中心

       用于监控在dubbo开发的接口暴露,注册情况,也可以看接口的调用明细,调用时间等。监控中心挂掉并不会影响生成者和消费者。

    六、集群与负载均衡

       Dubbo本身支持服务的集群部署,无需其他特殊处理。只需要相同的服务接口注册多份,即实现集群。每个服务应用必须唯一性协议访问标识,即 ip + port的唯一性。

      集群即是为了避免单点故障导致的系统不可用,那么集群必然的需要提供集群的容错性配置。Dubbo提供了多种容错性配置,默认是failover失败转移。

      

       1、节点信息

        Invoker : 是provider的一个可调用的service抽象,封装了provider的地址信息和接口信息

        Directory:是Invoker的集合,根据注册中心推送的注册信息动态变更

        Cluster:封装层,将集群的多个Invoker伪装成一个Invoker,对外层透明(外部看起来就是一个服务提供方,无需关注具体调用哪个环境的)。集群的容错逻辑机在此进行

        Router:从多个Invoker按照路由规则选出子集

        LoadBalance:负责从多个Invoker中选出一个用于本次的调用处理,此过程包含了负载均衡算法。

      2、集群配置

        2.1、集群配置标签,默认有 <dubbo:provider>、<dubbo:service>、<dubbo:consumer>、<dubbo:reference>。但是由于<dubbo:provider>和<dubbo:consumer>的粒度比较大,所以一般不推荐使用。

        2.2、配置cluster标签属性:

          cluster标签属性可选值:failover、failfast、failsafe、failback、forking。默认值为failover。

         (i)failover :失败转移。当调用过程失败后,自动转移调用其他的服务。通常用于读操作。重试会影响调用的效率。重试可通过属性retries来进行配置。retries的默认值为2,即最多重试2次(不包含首次调用,即最多会发生3次调用)

    <dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover" retries="2" loadbalance="roundrobin"></dubbo:service>
       

        或者可以再具体到方法: 

       <dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover">
               <dubbo:method name="sayHello" retries="2" loadbalance="roundrobin"></dubbo:method>
       </dubbo:service>

        (ii)failfast:快速失败。只调用一次,失败即报错。通常,用于非幂等性操作,比如用户新增。配置方法及修改 cluster="failfast"

        (iii)failsafe:失败安全。调用过程,出现异常,直接忽略。

        (iiii)failback:失败回复。调用过程失败的话,后台自动记录失败请求并定时重发。

              forking:并行调用多个服务,只要一个返回即认为调用成功。可通过forks="2"来设置并行请求数

      3、负载均衡配置

        3.1、负载均衡配置标签,默认有 <dubbo:provider>、<dubbo:service>、<dubbo:consumer>、<dubbo:reference>。但是由于<dubbo:provider>和<dubbo:consumer>的粒度比较大,一般不推荐使用。

        3.2、配置loadbalance标签属性:

          loadbalance标签属性可选值:random、roundrobin、leastactive、consistenthash。默认值为random。

         (i)random:随机,按权重设置随机几率。权重可以通过管理控制台即时调整或者通过标签weight属性来进行设置

    <dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover" retries="2" loadbalance="random"></dubbo:service>

        或者可以再具体到方法: 

       <dubbo:service interface="com.cfang.api.DemoService" ref="demoService" protocol="dubbo" cluster="failover">
               <dubbo:method name="sayHello" retries="2" loadbalance="random"></dubbo:method>
       </dubbo:service>

        (ii)RoundRobin:轮询,按公约后的权重设置轮循比率。存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求第二台时就卡在那,久而久之,所有请求都卡在调到第二台上

        (iii)LeastActive:最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

        (iiii)ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

    七、高级特性

      1、服务启动时检查(消费者配置)

        Dubbo默认在启动的时候会检查依赖的服务是否可用,不可用时会抛出  java.lang.IllegalStateException :No provider available的异常,以便生产上线时候,能及早的发现问题。默认check="true"。

        可通过check="false"关闭检查,开发测试的时候,如果依赖的部分服务不可用时,可关闭检查保证应用的正常启动。如果应用中Spring 容器是懒加载的,或者通过 API 编程延迟引用服务,必须关闭 check,否则服务临时不可用时,会抛出异常,拿到 null 引用,如果 check="false",总是会返回引用,当服务恢复时,能自动连上。

        推荐配置方式:

     <dubbo:reference id="demoService" interface="com.cfang.api.DemoService" check="false"/>

      2、直连提供者

         开发测试过程中,可能需要绕过注册中心,直接测试指定的服务提供者,这时候,可配置点对点直连调用,忽略注册中心中的服务提供者列表。

        配置方式:  

    <dubbo:reference id="demoService" interface="com.cfang.api.DemoService" check="false" url="dubbo://172.31.31.2:20881"/>

      3、服务只订阅只注册

         3.1、只订阅

          通常一个应用可以即是服务的提供方也是服务的订阅者,当正在测试调试某服务接口的时候,如果注册到了注册中心中去,可能会导致服务消费的不正常。所以,此时,可以设置只订阅服务而不进行注册发布服务,配合直连测试正在开发的服务。

        配置方式为:

    <dubbo:registry address="111.231.51.200:2181,111.231.51.200:2182,111.231.51.200:2183" protocol="zookeeper" register="false"></dubbo:registry>

        3.2、只注册

         说太多不如一张图来的直接明了:

     

       推荐配置方式为:

    <dubbo:registry id="Registry1" address="111.231.51.200:2181" />
    <dubbo:registry id="Registry2" address="111.231.51.200:2185" subscribe="false" />

    八、配置文件高级属性定义

      1、version版本

      定义服务的版本。推荐使用三个位数来表示,如1.0.0、1.0.1等。通常在服务的不断升级过程中,用于多版本服务的兼容。消费者配置中的version必须与服务提供方保持一致,否则会报错 may be version or group mismatch。推荐配置如下:

    <!-- 服务提供者 -->
    <dubbo:service interface="IA" ref="a" version="1.0.0" />
    
    
    <!-- 服务消费 -->
    <dubbo:reference interface="IA" id="consumer" version="1.0.0" />

      2、group服务分组

      当一个服务接口有多个服务接口实现类的时候,可以使用服务接口分组来定义。比如接口 IA 有实现A1和A2

      那么服务提供者配置如下:

    <dubbo:service interface="IA" ref="com.xxx.xxx.A1" group="g1" />
    <dubbo:service interface="IA" ref="com.xxx.xxx.A2" group="g2" />

      服务消费者配置:

    <dubbo:reference interface="IA" group="g1" id="consumer1" />
    <dubbo:reference interface="IA" group="g2" id="consumer2" />

      3、retries调用重试

      dubbo,调用服务可以自动重试多次,默认的重试次数为 2(加上初始调用,也就是最多3次)。推荐配置见上面的集群配置failover中。一般,重试用于幂等的查询操作中,而在增删改中建议将重试次数retreis设置为0。

    九、总结

      简单的介绍了Dubbo的使用配置过程,Dubbo目前是越来越活,更详细的使用可以去进一步的研究官方网站,而由于有中文,所以,看起来就很节省一部分力气了。

  • 相关阅读:
    centos 6.5 下安装RabbitMQ-3.7.28 二进制版本
    Centos 6.5 Rabbitmq 安装和集群,镜像部署
    Vim 自动添加脚本头部信息
    vim 手动添加脚本头部信息
    Pandas系列教程(11)Pandas的索引index
    Pandas系列教程(10)Pandas的axis参数
    Pandas系列教程(9)Pandas字符串处理
    Pandas系列教程(8)pandas数据排序
    Pandas系列教程(7)Pandas的SettingWithCopyWarning
    Pandas系列教程(6)Pandas缺失值处理
  • 原文地址:https://www.cnblogs.com/eric-fang/p/11316557.html
Copyright © 2011-2022 走看看