zoukankan      html  css  js  c++  java
  • Dubbo入门到实战2

    1、为什么需要dubbo
    2、dubbo架构简析
    3、dubbo入门
    4、zookeeper注册中心加入dubbo
    5、dubbo多种配置方式(xml、api、注解)
    6、常用场景介绍

    接上篇

    六 常用场景

    在下面的讲解中,都会是以 xml 配置的方式来讲解的,这也是 dubbo 官方比较推荐的方式。以下的操作都是在服务端的 xml 配置文件和消费端的配置文件来讲解的。

    6.1 启动时检查

    Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 `check="true"。

    但是,有的时候,我们并不是都需要启动时就检查的,比如测试的时候,我们是需要更快速的启动,所以,这种场景的时候,我们是需要关闭这个功能的。

    下面,我们看看如何使用这个功能。

    在服务端注册的时候(客户端注册时同样适用);

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

    在客户端引用服务端服务的时候;

    <dubbo:reference check="false" id="providerService"
                         interface="com.sihai.dubbo.provider.service.ProviderService"/>

    就是这么简单,就是这么强!

    6.2 集群容错

    dubbo 也是支持集群容错的,同时也有很多可选的方案,其中,默认的方案是 failover,也就是重试机制。

    首先,我们先把所有的容错机制都整理一遍,然后再看看使用。

    集群模式说明使用方法
    Failover Cluster 失败自动切换,当出现失败,重试其它服务器通常用于读操作,但重试会带来更长延迟。可通过 retries="2" 来设置重试次数(不含第一次)。 cluster="xxx" xxx:集群模式名称 ,例如cluster="failover"
    Failfast Cluster 快速失败只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录  
    Failsafe Cluster 失败安全,出现异常时,直接忽略  
    Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作  
    Forking Cluster 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。  
    Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息  

    使用实例
    发布服务或者引用服务的时候设置

    <!--服务发布的配置,需要暴露的服务接口-->
        <dubbo:service cluster="failover" retries="2"
                interface="com.sihai.dubbo.provider.service.ProviderService"
                ref="providerService"/>
    <dubbo:reference cluster="failover" retries="2" check="false" id="providerService"
                         interface="com.sihai.dubbo.provider.service.ProviderService"/>

    6.3 负载均衡

    负载均衡想必是一个再熟悉不过的概念了,所以,dubbo 支持也是再正常不过了,这里也总结一下 dubbo 支持的负载均衡的一些方案及使用方法。

    负载均衡模式说明使用方法
    Random LoadBalance 随机 按权重设置随机概率 <dubbo:service loadbalance="xxx"/> xxx:负载均衡方法
    RoundRobin LoadBalance 轮询 按公约后的权重设置轮询比率。  
    LeastActive LoadBalance 最少活跃调用数 相同活跃数的随机,活跃数指调用前后计数差。  
    ConsistentHash LoadBalance 一致性 Hash 相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。  

    6.4 直连提供者

    在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,所以,这种情况下,我们只需要直接连接服务端的地即可,其实,这种方法在前面的讲解已经使用到了,第一种讲解的方式就是这种方式,因为这种方式简单。

    使用

    <dubbo:reference id="providerService"
                         interface="com.sihai.dubbo.provider.service.ProviderService"
                         url="dubbo://192.168.234.1:20880/com.sihai.dubbo.provider.service.ProviderService"/>

    说明:可以看到,只要在消费端在 dubbo:reference 节点使用 url 给出服务端的方法即可。

    6.5 只订阅

    只订阅就是只能够订阅服务端的服务,而不能够注册。

    引用官方的使用场景如下:

    为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。
    可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。
    <dubbo:registry register="false" protocol="zookeeper" address="localhost:2181,localhost:2182,localhost:2183" check="false"/>

    ① 使用只订阅方式

    在服务提供端使用 register="false" 的时候,我们使用下面的方式获取服务端的服务;

    <dubbo:reference cluster="failover" retries="2" check="false" id="providerService"
                         interface="com.sihai.dubbo.provider.service.ProviderService"/>

    启动信息
    图片.png
    发现,这时候并不是向注册中心 zookeeper 注册,而只是做了发布服务和启动netty

    ② 不使用只订阅方式

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

    启动信息

    可以发现,这里就向注册中心 zookeeper 注册了。

    6.6 只注册

    只注册正好跟前面的只订阅相反,这个时候可以向注册中心注册,但是,消费端却不能够读到服务。

    应用场景

    如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。
    这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。

    使用说明

    <dubbo:registry subscribe="false" address="localhost:2181"></dubbo:registry>

    在服务端的 dubbo:registry 节点下使用 subscribe="false" 来声明这个服务是只注册的服务。

    这个时候消费端调用的时候是不能调用的。

    6.7 多协议机制

    在前面我们使用的协议都是 dubbo 协议,但是 dubbo 除了支持这种协议外还支持其他的协议,比如,rmi、hessian等,另外,而且还可以用多种协议同时暴露一种服务。

    使用方法

    ① 一种接口使用一种协议

    先声明多种协议

     <!--当前服务发布所依赖的协议;webserovice、Thrift、Hessain、http-->
        <dubbo:protocol name="dubbo" port="20880"/>
        <dubbo:protocol name="rmi" port="1099" />

    然后在发布接口的时候使用具体协议

    <!--服务发布的配置,需要暴露的服务接口-->
        <dubbo:service cluster="failover" retries="2"
                interface="com.sihai.dubbo.provider.service.ProviderService"
                ref="providerService"/>
        <dubbo:service cluster="failover" retries="2"
                       interface="com.sihai.dubbo.provider.service.ProviderService"
                       ref="providerService" protocol="rmi"/>

    在输出日志中,就可以找到rmi发布的接口。

    rmi://192.168.234.1:1099/com.sihai.dubbo.provider.service.ProviderService?anyhost=true&application=provider&bean.name=com.sihai.dubbo.provider.service.ProviderService&cluster=failover&dubbo=2.0.2&generic=false&interface=com.sihai.dubbo.provider.service.ProviderService&methods=SayHello&owner=sihai&pid=796&retries=2&side=provider&timestamp=1564281053185, dubbo version: 2.6.6, current host: 192.168.234.1

    ② 一种接口使用多种协议
    声明协议和上面的方式一样,在发布接口的时候有一点不一样。

    <dubbo:service cluster="failover" retries="2"
                       interface="com.sihai.dubbo.provider.service.ProviderService"
                       ref="providerService" protocol="rmi,dubbo"/>

    说明:protocol属性,可以用,隔开,使用多种协议。

    6.8 多注册中心

    Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。

    服务端多注册中心发布服务

    一个服务可以在不同的注册中心注册,当一个注册中心出现问题时,可以用其他的注册中心。

    注册

    <!--多注册中心-->
        <dubbo:registry protocol="zookeeper" id="reg1" timeout="10000" address="localhost:2181"/>
        <dubbo:registry protocol="zookeeper" id="reg2" timeout="10000" address="localhost:2182"/>
        <dubbo:registry protocol="zookeeper" id="reg3" timeout="10000" address="localhost:2183"/>

    发布服务

    <!--服务发布的配置,需要暴露的服务接口-->
        <dubbo:service cluster="failover" retries="2"
                interface="com.sihai.dubbo.provider.service.ProviderService"
                ref="providerService" registry="reg1"/>
        <dubbo:service cluster="failover" retries="2"
                       interface="com.sihai.dubbo.provider.service.ProviderService"
                       ref="providerService" protocol="rmi" registry="reg2"/>

    说明:使用registry="reg2"指定该接口使用的注册中心,同时也可以使用多个,用隔开,例如,registry="reg1,,reg2"

    消费端多注册中心引用服务

    首先,先向不同注册中心注册;

    <!--多注册中心-->
        <dubbo:registry protocol="zookeeper" id="reg1" timeout="10000" address="localhost:2181"/>
        <dubbo:registry protocol="zookeeper" id="reg2" timeout="10000" address="localhost:2182"/>
        <dubbo:registry protocol="zookeeper" id="reg3" timeout="10000" address="localhost:2183"/>
    

    其次,不同的消费端服务引用使用不同的注册中心;

    !--不同的服务使用不同的注册中心-->
        <dubbo:reference cluster="failover" retries="2" check="false" id="providerService"
                         interface="com.sihai.dubbo.provider.service.ProviderService" registry="reg1"/>
        <dubbo:reference cluster="failover" retries="2" check="false" id="providerService2"
                         interface="com.sihai.dubbo.provider.service.ProviderService" registry="reg2"/>

    说明:上面分别使用注册中心1和注册中心2。

    6.9 多版本

    不同的服务是有版本不同的,版本可以更新并且升级,同时,不同的版本之间是不可以调用的。

    <!--服务发布的配置,需要暴露的服务接口-->
        <dubbo:service cluster="failover" retries="2"
                interface="com.sihai.dubbo.provider.service.ProviderService"
                ref="providerService" registry="reg1" version="1.0.0"/>
        <dubbo:service cluster="failover" retries="2"
                       interface="com.sihai.dubbo.provider.service.ProviderService"
                       ref="providerService" protocol="rmi" registry="reg2" version="1.0.0"/>

    加入了版本控制。

    6.10 日志管理

    dubbo 也可以将日志信息记录或者保存到文件中的。

    ① 使用accesslog输出到log4j

    <dubbo:protocol accesslog="true" name="dubbo" port="20880"/>
        <dubbo:protocol accesslog="true" name="rmi" port="1099" />

    ② 输出到文件

    <dubbo:protocol accesslog="http://localhost/log.txt" name="dubbo" port="20880"/>
        <dubbo:protocol accesslog="http://localhost/log2.txt" name="rmi" port="1099" />

    七 总结

    这篇文章就到这里了,主要讲了一下几个内容
    1、为什么需要dubbo
    2、dubbo架构简析
    3、dubbo入门
    4、zookeeper注册中心加入dubbo
    5、dubbo多种配置方式(xml、api、注解)
    6、常用场景介绍

    参考:https://segmentfault.com/a/1190000019896723

  • 相关阅读:
    天地图专题六:复杂操作,天地图上标注点的连线以及模拟点击事件
    天地图专题五:在天地图上绘制电子区域并保存数据
    天地图专题四:在天地图上显示运行轨迹
    天地图专题三:根据标注点的范围确定天地图的中心点和缩放级别
    天地图专题二:在天地图上循环显示标注点以及悬停显示信息窗口
    天地图专题一:加载天地图
    从百度地图批量获取中国县级以上行政区划边界坐标
    【百度地图API】如何获取行政区域的边界? (转载)
    高德地图api之location定位
    url中的空格
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/15496851.html
Copyright © 2011-2022 走看看