zoukankan      html  css  js  c++  java
  • dubbo分布服务框架

    1)安装zookeeper:

    下载源代码zookeeper-3.3.6并解压缩,进入目录zookeeper-3.3.6/conf中修改zoo_sample.conf文件并重新保存为zoo.conf

    1.1)单机模式:

    1. tickTime=2000
    2. dataDir= /zookeeper-3.3.6/tmp/zookeeper
    3. dataLogDir=/zookeeper-3.3.6/tmp/zookeeper
    4. clientPort=2181

        ltickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

        ldataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

        ldataLogDir: log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置.

        lclientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

    1.2)集群模式:

     

    1. initLimit=5
    2. syncLimit=2
    3. server.1=192.168.136.129:2888:3888
    4. server.2=192.168.136.131:2888:3888

        linitLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader Follower 服务器)初始化连接时               最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10

        lsyncLimit:这个配置项标识 Leader Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4

        lserver.A=BCD:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

        l除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server

    1.3)启动zookeeper:

    进入bin目录:

    1. ./zkServer.sh start

    启动结果如图:

    2dubbo使用

    2.1)新建生产者项目

    2.1.1)定义接口类:

    package provider;

    /**

     * 接口类,服务需要实现此类

     * @author huangt

     */

    public interface IProcessData {

        public String deal(String data);

    }

     

    2.1.2)实现接口:

    package provider;

     

    /**

     * 实现接口

     * @author huangt

     */

    public class ProcessDataImpl implements IProcessData {

        @Override

        public String deal(String data) {

           System.out.println("逻辑处理。。。");

           return "Finished:" + data;

        }

    }

     

    2.1.3)在spring的配置文件中注册服务接口:

    <!-- 注册名称 -->

        <dubbo:application name="provider" />

        <!-- 使用zookeeper注册中心暴露服务地址,这里zookeeper配置为一个集群方式

               address=zookeeper服务IP:监听端口

        -->

        <dubbo:registry protocol="zookeeper" check="true"

         address="192.168.136.129:2181,192.168.136.131:2181"/>

     

        <!-- dubbo协议在20880端口暴露服务 -->

        <dubbo:protocol name="dubbo" port="20880"/>

       

        <!-- 接口实现类 -->

        <bean id="demoService"class="provider.ProcessDataImpl" />

       

        <!-- 发布接口--> 

        <dubbo:service interface="provider.IProcessData" ref="demoService" register="true"/> 

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

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

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

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

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

         1interface服务接口的路径

         2ref引用对应的实现类的BeanID

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

     

    启动生产者:

    package main;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

     

    public class DubboProviderMain {

        public static void main(String[] args) throws Exception { 

            @SuppressWarnings("resource")

           ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( 

                    new String[]{"applicationProvider.xml"}); 

            context.start();

            System.out.println("Press any key to exit."); 

            System.in.read(); 

        } 

    }

    2.2.编写消费者工程:

    2.2.1)消费者配置:

    <dubbo:application name="consumer-of-helloworld-app" />

     

        <!-- <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181,127.0.0.1:2182"

           /> -->

        <dubbo:registry protocol="zookeeper"

           address="192.168.136.129:2181,192.168.136.131:2181"/>

     

        <dubbo:reference id="demoService" interface="provider.IProcessData" />

    dubbo:reference 的一些属性的说明:

        1interface调用的服务接口

          2check 启动时检查提供者是否存在,true报错,false忽略

          3loadbalance 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用

     

     2.2.2)编写消费者类:

    package consumer;

     

    import org.springframework.context.support.ClassPathXmlApplicationContext;

     

    import provider.IProcessData;

    public class ConsumerThd { 

     

        public static void main(String[] args) {

           @SuppressWarnings("resource")

           ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( 

                    new String[]{"applicationConsumer.xml"}); 

            context.start();

            IProcessData demoService = (IProcessData) context.getBean("demoService");

           

           String hello = demoService.deal("nihao");

            System.out.println("返回结果:" + hello);

        }

    }

     

    启动消费者访问,可以访问到相关的生产者。

    3dubbo集群容错模式容错性和负载均衡

    容错性

    当客户端访问服务端的时候,服务端出错或者网络出现问题,都会使得远程访问失败,失败是不可避免的,所以Dubbo制定了一些策略:

    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:method name="findFoo" retries="2" />

    </dubbo:reference>

    集群模式配置如:

    <dubbo:service cluster="failsafe" />

    或:

    <dubbo:reference cluster="failsafe" />

     

    负载均衡

    在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用。

    Random LoadBalance

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

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

    RoundRobin LoadBalance

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

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

    LeastActive LoadBalance

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

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

    ConsistentHash LoadBalance

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

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

    缺省只对第一个参数Hash,如果要修改,请配置<dubbo:parameter key="hash.arguments" value="0,1" />

    缺省用160份虚拟节点,如果要修改,请配置<dubbo:parameter key="hash.nodes" value="320" />

    配置如:

    <dubbo:service interface="..." loadbalance="roundrobin" />

    或:

    <dubbo:reference interface="..." loadbalance="roundrobin" />

    或:

    <dubbo:service interface="...">

    <dubbo:method name="..." loadbalance="roundrobin"/>

    </dubbo:service>

    或:

    <dubbo:reference interface="...">

    <dubbo:method name="..." loadbalance="roundrobin"/>

    </dubbo:reference>

     





    附件列表

    • 相关阅读:
      Spring整合JMS(四)——事务管理
      centos7.3部署django用uwsgi和nginx[亲测可用]
      ImportError: Couldn't import Django.或者提示Django 模块不存在
      ModuleNotFoundError: No module named '_sqlite3'
      django-admin:command not found的解决办法
      2个版本并存的python使用新的版本安装django的方法
      uwsgi的使用
      plugins/python/uwsgi_python.h:2:20: fatal error: Python.h: No such file or directory
      cento7.3下玩转sphinx
      一些常用的centos命令,记忆下,属于常用的
    • 原文地址:https://www.cnblogs.com/huangt/p/4607199.html
    Copyright © 2011-2022 走看看