惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园_首页
M
MIT News - Artificial intelligence
月光博客
月光博客
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
The Cloudflare Blog
D
Docker
阮一峰的网络日志
阮一峰的网络日志
L
LangChain Blog
Engineering at Meta
Engineering at Meta
Last Week in AI
Last Week in AI
Vercel News
Vercel News
MyScale Blog
MyScale Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Martin Fowler
Martin Fowler
U
Unit 42
Stack Overflow Blog
Stack Overflow Blog
A
About on SuperTechFans
The Register - Security
The Register - Security
B
Blog
Recorded Future
Recorded Future
J
Java Code Geeks
Recent Announcements
Recent Announcements
Microsoft Security Blog
Microsoft Security Blog
H
Help Net Security
F
Fortinet All Blogs
B
Blog RSS Feed
Project Zero
Project Zero
The Hacker News
The Hacker News
T
Threatpost
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 热门话题
Jina AI
Jina AI
宝玉的分享
宝玉的分享
云风的 BLOG
云风的 BLOG
AWS News Blog
AWS News Blog
G
Google Developers Blog
GbyAI
GbyAI
S
Securelist
T
Tenable Blog
博客园 - 【当耐特】
Security Latest
Security Latest
人人都是产品经理
人人都是产品经理
T
Tor Project blog
Latest news
Latest news
P
Proofpoint News Feed
T
The Blog of Author Tim Ferriss

博客园 - xhan

提交给mysql java驱动的优化下个版本要发布了^_^ java 可伸缩阻塞队列实现 java mysql大数据量批量插入与流式读取分析 innodb next-key lock引发的死锁 java开源项目jremoting largest remainder method java impl 数据库单元测试 元数据编程实战_使用Emit运行时生成Protobuf编码类 发布个c#版的HandlerSocket客户端类库 redis入门系列文章广告贴 九 redis学习笔记之虚拟内存 八 redis学习笔记之主从复制 七 redis学习笔记之持久化 六 redis学习笔记之发布订阅 五 redis学习笔记之pipeline 四 redis学习笔记之事务 三 redis学习笔记之排序 二 redis学习笔记之数据类型 - xhan - 博客园 一 redis学习笔记之环境搭建
jremoting的功能扩展点
xhan · 2014-02-27 · via 博客园 - xhan

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>