• Dubbo框架


    一、Dubbo是什么?

    Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)。

    其核心部分包含:
    1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
    2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
    3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

    二、Dubbo的作用

    1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。      
    2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。
    3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。

     

    三、Dubbo的架构

    dubbo架构图

    节点角色说明:

           Provider: 暴露服务的服务提供方。

           Consumer: 调用远程服务的服务消费方。

           Registry: 服务注册与发现的注册中心。

           Monitor: 统计服务的调用次调和调用时间的监控中心。

           Container: 服务运行容器。

    调用关系说明:

    0 服务容器负责启动,加载,运行服务提供者。

    1. 服务提供者在启动时,向注册中心注册自己提供的服务。

    2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

    3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

    4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

    5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

     四、Dubbo的使用方法

    Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

     服务提供者:

    1. 下载zookeeper注册中心,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/  下载后解压即可,进入D:apach-zookeeper-3.4.5in,

    双击zkServer.cmd启动注册中心服务。

    2. 定义服务接口: (该接口需单独打包,在服务提供方和消费方共享)

     1     package com.unj.dubbotest.provider;  
     2       
     3     import java.util.List;  
     4       
     5     public interface DemoService {  
     6       
     7         String sayHello(String name);  
     8       
     9         public List getUsers();  
    10       
    11     }  

    在服务提供方实现接口:(对服务消费方隐藏实现)

     1     package com.unj.dubbotest.provider;  
     2       
     3     import java.util.ArrayList;  
     4     import java.util.LinkedList;  
     5     import java.util.List;  
     6       
     7       
     8     public class DemoServiceImpl implements DemoService{  
     9           
    10          public String sayHello(String name) {  
    11                 return "Hello " + name;  
    12          }  
    13          public List getUsers() {  
    14              List list = new ArrayList();  
    15              User u1 = new User();  
    16              u1.setName("jack");  
    17              u1.setAge(20);  
    18              u1.setSex("男");  
    19                
    20              User u2 = new User();  
    21              u2.setName("tom");  
    22              u2.setAge(21);  
    23              u2.setSex("女");  
    24                
    25              User u3 = new User();  
    26              u3.setName("rose");  
    27              u3.setAge(19);  
    28              u3.setSex("女");  
    29                
    30              list.add(u1);  
    31              list.add(u2);  
    32              list.add(u3);  
    33              return list;  
    34          }  
    35     }  

    用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.unj.dubbotest.provider.DemoServiceImpl" />  
              
            <!-- 提供方应用信息,用于计算依赖关系 -->  
            <dubbo:application name="xixi_provider"  />  
           
            <!-- 使用multicast广播注册中心暴露服务地址   
            <dubbo:registry address="multicast://224.5.6.7:1234" />-->  
            
            <!-- 使用zookeeper注册中心暴露服务地址 -->  
            <dubbo:registry address="zookeeper://127.0.0.1:2181" />   
            
            <!-- 用dubbo协议在20880端口暴露服务 -->  
            <dubbo:protocol name="dubbo" port="20880" />  
           
            <!-- 声明需要暴露的服务接口 -->  
            <dubbo:service interface="com.unj.dubbotest.provider.DemoService" ref="demoService" />  
              
        </beans>  

    说明:

    dubbo:registry 标签一些属性的说明:

    1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。

    2)check注册中心不存在时,是否报错。

    3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。

    4)timeout注册中心请求超时时间(毫秒)。

    5)address可以Zookeeper集群配置,地址可以多个以逗号隔开等。

     

    dubbo:service 标签的一些属性说明:

    1)interface服务接口的路径

    2)ref引用对应的实现类的Bean的ID

    3)registry向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A

    4)register 默认true ,该协议的服务是否注册到注册中心。

    服务消费者:

    1.通过Spring配置引用远程服务:

     1     <?xml version="1.0" encoding="UTF-8"?>  
     2     <beans xmlns="http://www.springframework.org/schema/beans"  
     3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
     4         xsi:schemaLocation="http://www.springframework.org/schema/beans  
     5             http://www.springframework.org/schema/beans/spring-beans.xsd  
     6             http://code.alibabatech.com/schema/dubbo  
     7             http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
     8             ">  
     9       
    10         <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->  
    11         <dubbo:application name="hehe_consumer" />  
    12       
    13         <!-- 使用zookeeper注册中心暴露服务地址 -->  
    14         <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->  
    15         <dubbo:registry address="zookeeper://127.0.0.1:2181" />  
    16       
    17         <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->  
    18         <dubbo:reference id="demoService"  
    19             interface="com.unj.dubbotest.provider.DemoService" />  
    20       
    21     </beans>  

    2.消费方调用远程服务:

    @Autowired
    DemoService demoService;

     

    五、dubbo服务治理

    六、dubbo的集群容错和负载均衡

    各节点关系:

      Invoker:是Provider的一个可调用Service的抽象,Invoker封装了Provider地址及Service接口信息。

      Directory:代表多个Invoker,可以把它看成List<Invoker>,但与List不同的是,它的值可能是动态变化的,比如注册中心推送变更。

      Cluster:将Directory中的多个Invoker伪装成一个Invoker,对上层透明,伪装过程包含了容错逻辑,调用失败后,重试另一个。

      Router:负责从多个Invoker中按路由规则选出子集,比如读写分离,应用隔离等。

      LoadBalance:负责从多个Invoker中选出具体的一个用于本次调用,选的过程包含了负载均衡算法,调用失败后,需要重选。

    1、集群容错

     集群容错模式:

    ①Failover Cluster

    失败自动切换,当出现失败,重试其它服务器。(缺省)通常用于读操作,但重试会带来更长延迟。可通过retries="2"来设置重试次数(不含第一次)。

    ②Failfast Cluster

    快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

    ③Failsafe Cluster

    失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

    ④Failback Cluster

    失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

    ⑤Forking Cluster

    并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过forks="2"来设置最大并行数。

    ⑥Broadcast Cluster

    广播调用所有提供者,逐个调用,任意一台报错则报错。(2.1.0开始支持)通常用于通知所有提供者更新缓存或日志等本地资源信息。

    重试次数配置如:(failover集群模式生效)

    <dubbo:service retries="2"/>

    或:

    <dubbo:reference retries="2"/>

    或:

    <dubbo:reference>

       <dubbo:methodname="findFoo" retries="2"/>

    </dubbo:reference>

     

    集群模式配置如:

    <dubbo:service cluster="failsafe"/>

    或:

    <dubbo:reference cluster="failsafe"/>

    2、负载均衡

     均衡策略:(缺省为random随机调用

    ①Random LoadBalance

    随机,按权重设置随机概率

    在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

    RoundRobin LoadBalance

    轮循,按公约后的权重设置轮循比率

    存在慢的提供者累积请求问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

    LeastActive LoadBalance

    最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差

    使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

    ConsistentHash LoadBalance

    一致性Hash,相同参数的请求总是发到同一提供者

    当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。

    均衡策略配置:

    例如:

    <dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" loadbalance="roundrobin"/>

     

  • 相关阅读:
    分梨
    18岁生日
    马的移动
    摆积木
    杭电2093考试排名
    栈的应用——四则运算表达式求值
    用指针实现对二维数组元素的访问
    用多种方法访问字符数组元素
    fread()函数和fwrite()函数进行文件操作
    hdu-1431 素数回文
  • 原文地址:https://www.cnblogs.com/zq-boke/p/8630487.html
Copyright © 2020-2023  润新知