shell HTML5 Python google 开源 Ubuntu wordpress 微软 程序员 mysql linux命令 php Windows nginx java Android apache centos Firefox linux

Dubbo常用功能解析

一般的远程访问

一般的远程访问设计4个角色。服务提供者,服务的实际逻辑的执行者;服务消费者,也就是调用远程服务的人;注册中心,服务消费者不直接和服务提供者打交道,而是通过注册中心做中转;监控中心,监控服务的调用情况,失败情况,性能瓶颈等。服务的调用过程如下图所示:

实现角度上看,服务提供者和消费者,是使用了代理模式实现的,结合Javassist框架。注册中心在两者中间,充当一个代理和封装的角色,也就是说,消费者和提供者不再直接通信,而是通过注册中心通信。

异步调用

首先,IO方式默认使用Netty的NIO模式进行远程通信,基于NIO的非阻塞实现并行调用,这样做客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小。

异步调用在这里并没有什么神奇的地方,只是一种编程模式,它的实现方式和Executor框架的实现方式差不多,简单来说就是使用一个标记位来标记子线程是否已经处理完毕,如果还没有处理完毕,主线程就阻塞等待,直到子线程处理完毕,这样主线程就可以得到子线程的处理结果。

结果缓存

结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用户加缓存的工作量。默认结果缓存处于关闭状态,开启结果缓存可以用如下的配置(消费端):

<dubbo:reference id="cacheService" interface="com.alibaba.dubbo.examples.cache.api.CacheService" cache="true" />

使用结果缓存的服务方法必须是幂等的,也就是说,相同的输入参数返回相同的结果,参数第一次计算缓存结果,下一次相同参数传入时直接返回结果。缓存策略有三种:

1、LruCache,lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。

2、ThreadLocalCache,threadlocal 当前线程缓存,比如一个页面渲染,用到很多portal,每个portal都要去查用户信息,通过线程缓存,可以减少这种多余访问。

3、JCache,jcache 与JSR107集成,可以桥接各种缓存实现。

除此之外,用户还可以自定义扩展缓存。

回调

回调方式与调用本地callback或listener相同,只需要在Spring的配置文件中声明哪个参数是callback类型即可,Dubbo将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑。

基于长连接的缘故,这种远程调用方式是比较消耗网络资源的,所以需要有所限制,用户可以配置连接数来限制消费端。

分组聚合

按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。

通常以List为返回值,在服务端会自动将各个服务的结果进行合并再将结果返回给消费端。

memcache,redis

对memcache和redis的代理,经过配置之后,就可以把对他们的操作变成对Map的操作,屏蔽ip,端口还有连接这样的细节。还可以利用Dubbo已有的功能,对相关的远程操作进行优化。

配置相当简单:

<!-- Memcache -->
<dubbo:reference id="cache" interface="JAVA.util.Map" url="memcached://10.20.153.10:11211" />

<!-- Redis -->
<dubbo:reference id="store" interface="java.util.Map" url="redis://10.20.153.10:6379" />

服务版本

这相当与在服务方法上加一个后缀,服务方法多了一个层级的表示,消费者可以指定特定版本,也可以随机使用版本。

延伸阅读

评论