• jremoting的功能扩展点


    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>
  • 相关阅读:
    第四章 分布式扩展
    第三章 2.性能压测,容量问题
    第三章 1.云部署,打包上传
    MySQL语法大全
    Python随手记
    Python操作Mysql中文乱码问题
    Python基础函数
    破解电信校园网路由限制
    ThinkPHP扩展函数的三个方法
    $_SERVERS预定义变量
  • 原文地址:https://www.cnblogs.com/xhan/p/3572486.html
Copyright © 2020-2023  润新知