zoukankan      html  css  js  c++  java
  • Dubbo有意思的特性介绍

    Duboo 不单让我们可以像使用本地服务一样的使用远程服务,还设计了很多特性来满足我们平时开发时常见的场景,省却了我们不少麻烦,真是一款有良心的框架,下面针对这些场景和解决方案来具体解释下:

    1、接口与参数都可以加一些验证,DUBBO自带了

    2、Dubbo提供声明式缓存,以减少用户加缓存的工作量

    <dubbo:reference interface="com.foo.BarService" cache="lru" />

    <dubbo:reference interface="com.foo.BarService">  

      <dubbo:method name="findBar" cache="lru" />

    </dubbo:reference>

    3、隐式传参,由消费方设置,提供方获取

    RpcContext.getContext().setAttachment("index", "1"); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用

    String index = RpcContext.getContext().getAttachment("index"); // 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用

    4、异步调用,基于NIO的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。

    <dubbo:reference id="fooService" interface="com.alibaba.foo.FooService">

        <dubbo:method name="findFoo" async="true" />

    </dubbo:reference>

    fooService.findFoo(fooId); // 此调用会立即返回null

    Future<Foo> fooFuture = RpcContext.getContext().getFuture();// 拿到调用的Future引用,当结果返回后,会被通知和设置到此Future

    。 。。。。。//可进行多个类似上面的调用,相当于并发多个调用了

    Foo foo = fooFuture.get(); // 如果foo已返回,直接拿到返回值,否则线程wait住,等待foo返回后,线程会被notify唤醒

    。 。。。。。//都在等待各自结果的返回,以最长时间作为共需要的时间

    如果你只是想异步,完全忽略返回值,可以配置return="false",以减少Future对象的创建和管理成本:

    <dubbo:method name="findFoo" async="true" return="false" />

    5、从 dubbo 2.2.0 开始,每个服务默认都会在本地暴露;在引用服务的时候,默认优先引用本地服务;如果希望引用远程服务可以使用一下配置强制引用远程服务。

    <dubbo:reference ... scope="remote" />

    6、本地存根,远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做ThreadLocal缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在API中带上Stub,客户端生成Proxy实,会把Proxy通过构造函数传给Stub,然后把Stub暴露组给用户,Stub可以决定要不要去调Proxy。

    <dubbo:service interface="com.foo.BarService" stub="true" />

    com.foo.BarService

    com.foo.BarServiceStub // 在API旁边放一个Stub实现,它实现BarService接口,并有一个传入远程BarService实例的构造函数

    BarServiceStub implements BarService public (BarService barService) ,代理模式

    7、本地伪装,服务提供方在客户端执行容错逻辑,因经常需要在出现RpcException(比如网络失败,超时等)时进行容错,Mock就可以不依赖RpcException,因为它的约定就是只有出现RpcException时才执行,如果用Stub,可能就需要捕获并依赖RpcException类 <dubbo:service interface="com.foo.BarService" mock="true" />

    com.foo.BarService

    com.foo.BarServiceMock // 在API旁边放一个Mock实现,它实现BarService接口,并有一个无参构造函数

    public String sayHello(String name) {     

       // 你可以伪造容错数据,此方法只在出现RpcException时被执行       

      return "容错数据";   

    }

    如果服务的消费方经常需要try-catch捕获异常,且想简单的忽略异常,可改为Mock实现,节约代码

    <dubbo:service interface="com.foo.BarService" mock="return null" />

    8、延迟暴露,如果你的服务需要Warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露。

    <dubbo:service delay="5000" />

    9、并发控制,限制服务器端或客户端并发执行(或占用线程池线程数)不能超过10个

    <dubbo:service interface="com.foo.BarService" executes="10" />

    如果<dubbo:service>和<dubbo:reference>都配了actives,<dubbo:reference>优先

    Load Balance均衡:

    配置服务的客户端的loadbalance属性为leastactive,此Loadbalance会调用并发数最小的Provider

    10、粘滞连接,用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。

    <dubbo:protocol name="dubbo" sticky="true" />

    11、令牌验证,当服务的权限改变,由注册中心改变授权,不需修改服务代码 在提供者上设置

    <dubbo:provider interface="com.foo.BarService" token="true" />//也token="123456" ,相当于密码

    也可也服务级别设置

    <dubbo:service interface="com.foo.BarService" token="true" />

  • 相关阅读:
    最短路计数
    轻拍牛头(类埃式筛)
    子序列(尺取模板题)
    状压dp(洛谷:互不侵犯)
    刷题-力扣-73. 矩阵置零
    刷题-力扣-150. 逆波兰表达式求值
    刷题-力扣-300. 最长递增子序列
    刷题-力扣-1576. 替换所有的问号
    刷题-力扣-54. 螺旋矩阵
    刷题-力扣-705. 设计哈希集合
  • 原文地址:https://www.cnblogs.com/ptw-share/p/6914240.html
Copyright © 2011-2022 走看看