zoukankan      html  css  js  c++  java
  • Dubbo阅读笔记——高级功能

    事件处理线程说明

    • 如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度。
    • 但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求。
    • 如果用IO线程处理事件,又在事件处理过程中发起新的IO请求,比如在连接事件中发起登录请求,会报“可能引发死锁”异常,但不会真死锁。
    • Dispatcher
      • all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。
      • direct 所有消息都不派发到线程池,全部在IO线程上直接执行。
      • message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。
      • execution 只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。
      • connection 在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。
    • ThreadPool
      • fixed 固定大小线程池,启动时建立线程,不关闭,一直持有。(缺省)
      • cached 缓存线程池,空闲一分钟自动删除,需要时重建。
      • limited 可伸缩线程池,但池中的线程数只会增长不会收缩。(为避免收缩时突然来了大流量引起的性能问题)。

      配置如:

    <dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />

    不经过注册中心直接获取服务

    在开发及测试环境下,经常需要绕过注册中心,只测试指定服务提供者,这时候可能需要点对点直连, 
    点对点直联方式,将以服务接口为单位,忽略注册中心的提供者列表, 
    A接口配置点对点,不影响B接口从注册中心获取列表。

    (1) 如果是线上需求需要点对点,可在<dubbo:reference>中配置url指向提供者,将绕过注册中心,多个地址用分号隔开,配置如下:(1.0.6及以上版本支持)

    <dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService"url="dubbo://localhost:20890" />

    (2) 在JVM启动参数中加入-D参数映射服务地址(只应在测试阶段使用,请不要在线上这样使用),如: 
    (key为服务名,value为服务提供者url,此配置优先级最高,1.0.15及以上版本支持)

    java -Dcom.alibaba.xxx.XxxService=dubbo://localhost:20890

    (3) 如果服务比较多,也可以用文件映射(只应在测试阶段使用,请不要在线上这样使用),如: 
    (用-Ddubbo.resolve.file指定映射文件路径,此配置优先级高于<dubbo:reference>中的配置,1.0.15及以上版本支持) 
    (2.0以上版本自动加载${user.home}/dubbo-resolve.properties文件,不需要配置)

    java -Ddubbo.resolve.file=xxx.properties

    然后在映射文件xxx.properties中加入: 
    (key为服务名,value为服务提供者url)

    com.alibaba.xxx.XxxService=dubbo://localhost:20890

    只订阅服务不提供服务

    问题 
    为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。

     
    解决方案 
    可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。

    禁用注册配置:

    <dubbo:registry address="10.20.153.10:9090" register="false" />

    或者:

    <dubbo:registry address="10.20.153.10:9090?register=false" />

    只提供服务不依赖服务

    问题 
    如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务,所以需要将服务同时注册到两个注册中心,但却不能让此服务同时依赖两个注册中心的其它服务。

     
    解决方案 
    可以让服务提供者方,只注册服务到另一注册中心,而不从另一注册中心订阅服务。

    禁用订阅配置:

    <dubbo:registry id="hzRegistry" address="10.20.153.10:9090" />

    <dubbo:registry id="qdRegistry" address="10.20.141.150:9090" subscribe="false" />

    或者:

    <dubbo:registry id="hzRegistry" address="10.20.153.10:9090" />

    <dubbo:registry id="qdRegistry" address="10.20.141.150:9090?subscribe=false" />

     

    人工管理服务

    (+) (#)

     
    有时候希望人工管理服务提供者的上线和下线,此时需将注册中心标识为非动态管理模式。

    <dubbo:registry address="10.20.141.150:9090" dynamic="false" />

    或者:

    <dubbo:registry address="10.20.141.150:9090?dynamic=false" />

    服务提供者初次注册时为禁用状态,需人工启用,断线时,将不会被自动删除,需人工禁用。

    如果是一个第三方独立提供者,比如memcached等,可以直接向注册中心写入提供者地址信息,消费者正常使用: 
    (通常由脚本监控中心页面等调用)

    RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();

    Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));

    registry.register(URL.valueOf("memcached://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo"));

  • 相关阅读:
    leetcode-344-反转字符串
    leetcode-136-只出现一次的数字
    leetcode-350- 两个数组的交集 II
    leetcode-36-有效的数独
    leetcode-283-移动零
    leetcode-387-字符串中的第一个唯一字符
    leetcode-242-有效的字母异位词
    HDU 2612
    Codeforces 1090B
    Codeforces 1090D
  • 原文地址:https://www.cnblogs.com/tiancai/p/9599252.html
Copyright © 2011-2022 走看看