1  InvokeFilter,实现此接口 可以在consumer端 与provider端的调用过程中拦截住请求调用。

已经实现的InvokeFilter包括

RetryInvokeFilter:实现失败重试功能,当然需要provider端对应方法保证幂等性(吐槽下dubbo,dubbo的failover就是用重试来实现的,如果服务提供方不能安全重试会出问题的,所以一般dubbo reties都设置为0,也就是说关闭了failover)

ClusterInvokeFilter:实现jremoting的failover功能,这里对dubbo的实现多了改进把retry与failover两个概念区分对待 。failover是在明确知道对方没有收到请求才换其他provider重试。 其中包括(建立连接失败,发送网络请求包失败,provider 服务器线程池慢明确返回server busy,或者服务不可用

后续的限流(TpsInvokeFilter), 统计监控,日志都可以用拦截机制实现。可以拦截同步调用,也可以拦截异步调用

public interface InvokeFilter {

    InvokeFilter getNext();

    void setNext(InvokeFilter next);

    void setPrev(InvokeFilter prev);

    InvokeFilter getPrev();

    Object invoke(Invoke invoke);

    Object beginInvoke(Invoke invoke);

    void endInvoke(Invoke invoke, Object result);

}

另一个扩展点事注册中心Registry

public interface Registry {
void start();
void close(); List<ServiceProvider> getProviders(Invoke invoke); Map<String, ServiceProvider> getLocalProviders(); String getGlobalConfig(String fileName);
String getAppConfig(String appName, String fileName);
String getServiceConfig(String serviceName, String fileName); void publish(ServiceProvider provider);
void unpublish(ServiceProvider provider);
void subscribe(ServiceConsumer consumer);
void unsubscribe(ServiceConsumer consumer); void addListener(RegistryListener listener);
} public interface RegistryListener {
void onEvent(RegistryEvent event);
} public class RegistryEvent {
public enum EventType {
PROVIDERS_CHANGED,
GLOBAL_CONFIG_CHANGED,
APP_CONFIG_CHANGED,
SERVICE_CONFIG_CHANGED,
RECOVER
} private EventType type;
private String appName;
private String serviceName;
private String fileName;
private String newContent; private List<ServiceProvider> newProviders;
private String serviceId; //.....省略get,set
}

此处可以对注册中心进行包装。拦截住注册中心的发布,订阅 ,获取可用provider列表,实现服务的分组,路由,权重,缓存

这里采用了 装饰器与观察者的组合模式来来处理注册中心的逻辑

首先在最原始的zookeeperRegistry上包装上CacheRegistryWrapper实现动态配置 ,服务可用列表的本地缓存。通过监听注册中心的change事件来刷新缓存

然后再外层包装上分组,路由,权重等功能 每个包装器内部都尽量缓存计算结果,并通过监听器来获取最新配置刷新缓存

具体实现参考:

    <bean id="registry" class="com.github.jremoting.route.RouteRegistryWrapper">
<constructor-arg>
<bean class="com.github.jremoting.group.GroupRegistryWrapper">
<constructor-arg>
<bean class="com.github.jremoting.registry.CacheRegistryWrapper">
<constructor-arg>
<bean class="com.github.jremoting.registry.ZookeeperRegistry">
<constructor-arg name="zookeeperConnectionString" value="127.0.0.1:2181" />
</bean>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</constructor-arg>
</bean>

最新文章

  1. Bootstrap学习(1)
  2. Linux用户和组的管理操作
  3. ArrayList实现源码分析
  4. Servlet跳转方式
  5. jsp页面编译成Servlet类文件
  6. 让项目管理理论&ldquo;落地&rdquo;&mdash;&mdash;读《IT项目经理成长手记》有感
  7. puppet中anchor的作用
  8. 6.PHP 教程_PHP数据类型
  9. Thrift对多接口服务的支持
  10. IIS7和Tomcat7整合,即IIS7和Tomcat共用80端口
  11. IT项目角色标准定义
  12. Django_生产环境静态文件配置
  13. powershell 函数, foreach中格式化
  14. apach ab 安装时的错误
  15. 大神们都在用的两个国外的免费离线下载:Rain&amp;amp; LoadBT
  16. Dotnetbar中如何让LabelX自动换行
  17. Could not resolve all files for configuration;Andriod在build.gradle添加compile files()报错
  18. maven3 学习
  19. Scala之集合Collection
  20. 最大流Dinic算法模板(pascal)

热门文章

  1. C#之设计模式之六大原则
  2. linux 异步信号的同步处理方式
  3. Qt 随机数
  4. 解决nginx启动时域名解析失败而导致服务启动失败的问题
  5. Date类型之组件方法
  6. POJ 3268 Silver Cow Party 最短路径+矩阵转换
  7. linux查看某个目录下有哪些文件的命令
  8. FileSync plugin for Eclipse 安装注意事项 Eclipse文件同步插件
  9. 关于Linux服务器磁盘空间占满问题的解决方法
  10. python中获取当前路径并添加到系统路径