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>

 

你可能感兴趣的:(jre)