`
nepxion
  • 浏览: 38255 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(四) Nepxion-Thunder分布式RPC集成框架 - 扫描框架

阅读更多

Nepxion-Thunder(QQ 群 471164539)发布在https://github.com/Nepxion/

 

Thunder的扫描框架是采用Spring自定义标签扫描来初始化的

1. 定义名称空间


  • 定义thunder-1.0.xsd,通过xsd文件进行对Spring配置文件节点的定义,规范对服务端/调用端XML格式
  • 定义spring.schemas,实现对thunder-1.0.xsd的引用
    http\://www.nepxion.com/schema/thunder/thunder-1.0.xsd=com/nepxion/thunder/thunder-1.0.xsd
  • 定义spring.handlers,定义对Spring扫描线程的入口
    http\://www.nepxion.com/schema/thunder=com.nepxion.thunder.framework.ThunderNamespaceHandlerSupport
  • 服务端/调用端XML格式的名称空间为
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:aop="http://www.springframework.org/schema/aop" 
    	xmlns:tx="http://www.springframework.org/schema/tx"
    	xmlns:mvc="http://www.springframework.org/schema/mvc"
    	xmlns:thunder="http://www.nepxion.com/schema/thunder"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
               http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
               http://www.nepxion.com/schema/thunder http://www.nepxion.com/schema/thunder/thunder-1.0.xsd">
    
    </beans>

2. Spring自定义扫描线程

 
    Spring扫描线程的过程是,先依次初始化全部的BeanDefinitionParser,再依次初始化全部的FactoryBean,所以怎么初始化有点讲究

  •  入口:ThunderNamespaceHandlerSupport.java,注册BeanDefinitionParser
    public class ThunderNamespaceHandlerSupport extends NamespaceHandlerSupport {
        @Override
        public void init() {
            ThunderProperties properties = ThunderPropertiesManager.getProperties();
                    
            CacheContainer cacheContainer = new CacheContainer();
            ExecutorContainer executorContainer = new ExecutorContainer();
            
            ThunderDelegate delegate = new ThunderDelegateImpl();
            delegate.setProperties(properties);
            delegate.setCacheContainer(cacheContainer);
            delegate.setExecutorContainer(executorContainer);
    
            registerBeanDefinitionParser(ThunderConstants.APPLICATION_ELEMENT_NAME, new ApplicationBeanDefinitionParser(delegate));
            registerBeanDefinitionParser(ThunderConstants.REGISTRY_ELEMENT_NAME, new RegistryBeanDefinitionParser(delegate));
            registerBeanDefinitionParser(ThunderConstants.PROTOCOL_ELEMENT_NAME, new ProtocolBeanDefinitionParser(delegate));
            registerBeanDefinitionParser(ThunderConstants.STRATEGY_ELEMENT_NAME, new StrategyBeanDefinitionParser(delegate));
            registerBeanDefinitionParser(ThunderConstants.MONITOR_ELEMENT_NAME, new MonitorBeanDefinitionParser(delegate));
            registerBeanDefinitionParser(ThunderConstants.SERVICE_ELEMENT_NAME, new ServiceBeanDefinitionParser(delegate));
            registerBeanDefinitionParser(ThunderConstants.REFERENCE_ELEMENT_NAME, new ReferenceBeanDefinitionParser(delegate));
            registerBeanDefinitionParser(ThunderConstants.METHOD_ELEMENT_NAME, new MethodBeanDefinitionParser(delegate));
        }
    }
  • BeanDefinitionParser,下列BeanDefinitionParser都继承于AbstractExtensionBeanDefinitionParser.java
    1)ApplicationBeanDefinitionParser.java - 实现对<thunder:application id="application"...>节点的解析,创建ApplicationEntity放入缓存,初始化ApplicationFactoryBean
    2)RegistryBeanDefinitionParser.java - 实现对<thunder:registry id="registry"...>节点的解析,创建RegistryEntity放入缓存,创建RegistryInitializer和RegistryExecutor(注册中心),初始化RegistryFactoryBean
    3)ProtocolBeanDefinitionParser.java - 实现对<thunder:protocol id="protocol"...>节点的解析,创建ProtocolEntity放入缓存(如果是Hessian,则要创建WebServiceEntity放入缓存;如果是MQ,则要创建MQEntity放入缓存),设置反射调用规则,初始化ProtocolFactoryBean
    4)StrategyBeanDefinitionParser.java - 实现对<thunder:strategy id="strategy"...>节点的解析,创建StrategyEntity(包含LoadBalanceType等信息)放入缓存,创建LoadBalanceExecutor(负载均衡)和ConsistencyExecutor(同步中心),初始化StrategyFactoryBean
    5)MonitorBeanDefinitionParser.java - 实现对<thunder:monitor id="monitor"...>节点的解析,创建MonitorEntity放入缓存,创建MonitorExecutor(监控中心),初始化MonitorFactoryBean
    6)ServiceBeanDefinitionParser.java - 实现对<thunder:service...>节点的解析,创建ServiceEntity放入缓存,创建ServerExecutor和ServerHandlerAdapter(服务提供者类),SecurityExecutor(服务端安全控制中心),初始化ServiceFactoryBean
    7)ReferenceBeanDefinitionParser.java - 实现对<thunder:reference...>节点的解析,创建ReferenceEntity放入缓存,创建ClientExecutor,ClientHandlerAdapter和ClientInterceptorAdapter(服务调用者类), 初始化ReferenceFactoryBean
    8)MethodBeanDefinitionParser.java - 实现对<thunder:method...>节点的解析,初始化MethodEntity
  • FactoryBean,下列FactoryBean都继承于AbstractFactoryBean.java
    1)ApplicationFactoryBean.java - 空实现
    2)RegistryFactoryBean.java - 实现和注册中心连接,初始化连接注册中心,注册和获取远程配置,初始化一些工厂类,注册和监听ApplicationConfig,注册重连监听
    3)ProtocolFactoryBean.java - 空实现
    4)StrategyFactoryBean.java - 空实现
    5)MonitorFactoryBean.java - 实现从注册中心获取监控中心URL列表,监听监控中心上下线
    6)ServiceFactoryBean.java - 缓存服务(ServiceEntity),启动服务端,注册服务端上线,注册和监听ServiceConfig,初始化限流等
    7)ReferenceFactoryBean.java - 缓存调用(ReferenceEntity),从注册中心获取服务列表来启动调用端,注册调用端上线,注册和监听ReferenceConfig,监听服务上下线,创建动态调用的代理对象

3. Spring Xml格式介绍

  • 定义服务方配置,一般命名为xxx-server-context.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:thunder="http://www.nepxion.com/schema/thunder"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
               http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
               http://www.nepxion.com/schema/thunder http://www.nepxion.com/schema/thunder/thunder-1.0.xsd">
           
        <!-- 应用配置,配置所属应用,组和集群,port端口一定要配置,(host一般缺省为localhost) ,对于host和port也可以用-DThunderHost,-DThunderPort通过命令行配置,也可以用System.setProperty方式设置 -->
        <thunder:application id="application" application="APP-IOS" group="MY_GROUP" cluster="serverCluster" port="5010"/>
       
        <!-- 注册中心配置,可选值:zookeeper(可配置多个地址,用逗号隔开,例如192.168.0.1:2181,192.168.0.2:2181),可以通过-DThunderRegistryAddress通过命令行配置,也可以用System.setProperty方式设置 -->
        <!-- config可选值为remote,local。如果启动远程配置,同时也存在本地配置,远程配置将覆盖本地配置 -->
        <thunder:registry id="registry" type="zookeeper" address="localhost:2181" config="remote"/>
    
        <!-- 协议配置,可选值:netty,hessian,kafka,activemq,tibco -->
        <thunder:protocol id="protocol" type="netty"/>
       
        <!-- 策略配置,负载均衡(loadbalance),可选值:consistentHash(一致性Hash,Ketama算法,参考MemCache源码),roundRobin(权重轮循),random(随机轮循),该项不支持MQ(删除该项)-->
        <thunder:strategy id="strategy" loadbalance="consistentHash"/>
    
        <!-- 监控配置,可选值:logService(利用Splunk做日志监控收集),cacheService(利用Redis缓存做日志监控收集),webService(利用webService平台做监控数据接收),可以单个,也可以多个组合使用,该项不支持hessian(删除该项)-->
        <thunder:monitor id="monitor" type="logService,cacheService"/>
       
        <!-- 服务配置,接口名和实例。一旦配置该节点,thunder启动,即作为服务提供方 -->
        <!-- 当Protocol为MQ时,可以指定MQ服务器,例如server="activeMQ-1",名称为MQ的配置名 -->
        <thunder:service id="echoServiceImpl" interface="com.nepxion.thunder.service.EchoService" ref="_echoServiceImpl"/>
        
        <!-- 异常的EventBus事件发布拦截 -->
        <bean id="eventInterceptor" class="com.nepxion.thunder.service.ServiceEventInterceptor"/>
    </beans>
  • 定义调用方方配置,一般命名为xxx-client-context.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:thunder="http://www.nepxion.com/schema/thunder"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
               http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
               http://www.nepxion.com/schema/thunder http://www.nepxion.com/schema/thunder/thunder-1.0.xsd">
       
        <thunder:application id="application" application="APP-IOS" group="MY_GROUP" cluster="clientCluster" port="6010"/>
       
        <thunder:registry id="registry" type="zookeeper" address="localhost:2181" config="remote"/>
    
        <thunder:protocol id="protocol" type="netty"/>
       
        <thunder:strategy id="strategy" loadbalance="consistentHash"/>
    
        <thunder:monitor id="monitor" type="logService,cacheService"/>
    
        <!-- 引用配置,接口名。一旦配置该节点,thunder启动,即作为服务调用方 -->
        <!-- 如果在一个XML里面,既有thunder:service,也有thunder:reference,那它既是服务提供方,又是服务调用方 -->
        <!-- 当Protocol为MQ时,可以指定MQ服务器,例如server="activeMQ-1",名称为MQ的配置名 -->
        <thunder:reference id="echoService" interface="com.nepxion.thunder.service.EchoService">
            <!-- 方法配置,可选参数如下: -->
            <!-- method即方法名 -->
            <!-- traceIdIndex即把方法第几个参数作为全局跟踪Id,它的用处是作为调用链分析。如果不配置该值,默认为第一个参数为traceId -->
            <!-- parameterTypes即参数类型,不配置,默认为无参 -->
            <!-- async即同步或者异步方法,值为true,false,不配置,默认为true,即异步方法 -->
            <!-- timeout即超时毫秒值,如果async=true,不能出现该项;在async=false,如果不配置该值,同步默认为30000毫秒,异步超时默认为60000 -->
            <!-- broadcast即异步广播方式,值为true,false,如果async=false,不能出现该项,不配置,默认值为false -->
            <!-- callback即异步回调接口,如果async=false,不能出现该项,即同步方法不支持回调;如果async=true,没有该项,服务端只会处理,不会返回callback结果;如果broadcast=true,不能出现该项,即广播方法不支持回调 -->
            <!-- callback支持链式调用,当定义成callback="promise"的时候,就采用链式调用,业务端就不必实现回调接口 -->
            <thunder:method method="getEcho" traceIdIndex="0" parameterTypes="java.lang.String" async="false"/>
        </thunder:reference>
        
        <!-- 异常的EventBus事件发布拦截 -->
        <bean id="eventInterceptor" class="com.nepxion.thunder.service.ServiceEventInterceptor"/>
    </beans>
        框架提供更为简便的全局配置方式
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:thunder="http://www.nepxion.com/schema/thunder"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
               http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
               http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
               http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
               http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
               http://www.nepxion.com/schema/thunder http://www.nepxion.com/schema/thunder/thunder-1.0.xsd">
    
        <!-- 如果接口下所有的方法调用方式一致,那么不需要在具体每个方法上做配置,需要配置在reference节点 -->
        <!-- 如果接口下所有的方法并不是多态方式存在,即不存在同名方法,可以省略一切方法的配置;如果存在同名方法,必须通过parameterTypes参数做区分 -->
        <!-- 如果接口下希望大多数方法遵照全局配置,而某个方法需要特殊配置,例如5个方法里面4个是同步调用,1个是异步调用,那就具体配置那个方法即可,其它方法配置可省略 -->
        <thunder:reference id="echoService" interface="com.nepxion.thunder.service.EchoService" async="false" timeout="15000".../>
    </beans>
  • 大小: 4.7 KB
  • 大小: 18.2 KB
分享到:
评论

相关推荐

    基于Java的Thunder分布式RPC框架设计源码

    Nepxion Thunder是一个基于Java的分布式RPC框架,集成了Netty、Hessian、Kafka、ActiveMQ、Tibco、Zookeeper、Redis、Spring Web MVC、Spring Boot和Docker等技术。它支持多协议、多组件和多序列化,为开发者提供了...

    协程式驱动框架Nepxion-Coroutine.zip

    Coroutine是基于Kilim/Promise JDeferred的协程式驱动框架,基于Apache Zookeeper的分布式规则存储和动态规则变更通知。 主要特性: 1. 基于微服务框架理念设计 2. 支持同步/异步调用 3. 支持串行/并行调用 4....

    Thunder::high_voltage: Nepxion Thunder is a distribution RPC framework based on Netty + Hessian + Kafka + ActiveMQ + Tibco + Zookeeper + Redis + Spring Web MVC + Spring Boot + Docker 多协议、多组件、多序列化的分布式RPC调用框架

    Nepxion Thunder是一款基于Netty + Hessian + Kafka + ActiveMQ + Tibco + Zookeeper(Curator Framework) + Redis + FST + Spring + Spring Web MVC + Spring Boot + Docker分布式RPC调用框架。架构思想主要是来自...

    yinheli/docker-thunder-xware:latest 镜像打包下载

    yinheli/docker-thunder-xware:latest 镜像打包下载 群晖 NAS DSM 系统,只要三步使用 Docker 安装迅雷远程下载

    Go-Thunder⚡️一个Go框架用于快速构建强大的graphql服务

    在压缩包"thunder-master"中,包含了Thunder框架的源码和其他相关资源。开发者可以通过查看源码,了解其内部实现原理,也可以直接使用它来快速搭建自己的GraphQL服务。在实际开发过程中,结合Go语言的标准库和第三方...

    基于Kilim、Promise JDeferred、Zookeeper和Spring Boot的协程分布式调用聚合框架设计源码

    该项目是一款基于Kilim、Promise JDeferred、Zookeeper和Spring Boot技术的协程驱动分布式...该框架支持Nepxion Thunder、Dubbo和Motan等RPC调用的集成,并通过规则配置实现调用聚合,适用于构建高性能的分布式系统。

    wine-thunder_0.6-2_all.deb

    wine-thunder_0.6-2_all.deb用于在linux系统下,使用wine直接按装的迅雷软件,实现高速下载,在ubunut,fedora等linux版本中,实现直接点击安装

    开源项目-omeid-thunder.zip

    "thunder-master"这个压缩包子文件名可能代表项目的主分支或主代码库,这在Git等版本控制系统中很常见,"master"通常指的是默认分支,存放着项目的最新稳定版本。解压后,用户可以访问到项目的源代码、文档、构建...

    Go-Thunder是BoltDB的交互式Shell

    Go-Thunder是一个基于BoltDB数据库的交互式Shell工具,主要设计用于方便地与BoltDB数据库进行交互,提供了一种命令行界面来操作和管理数据。BoltDB本身是Go语言实现的一个轻量级、文件存储的键值对数据库,它以其...

    A10-Thunder_1030S方案白皮书.pdf

    A10-Thunder_1030S方案白皮书.pdf

    home-work-thunder

    【压缩包子文件的文件名称列表】"thunder-oms" 这个文件名可能代表“Thunder Operation Management System”(迅雷运营管理系统),或者是一种特定的模块或服务。它可能包含了项目的源代码、配置文件、测试脚本等,...

    系统工具-文件下载-thunder_3.4.0.4338.zip

    标题中的“系统工具-文件下载-thunder_3.4.0.4338.zip”表明这是一款系统工具,具体来说是与文件下载相关的。这里的“thunder”很可能指的是迅雷,一个在中国广为人知的下载管理软件。版本号“3.4.0.4338”指示这是...

    A10-Thunder_6430S方案白皮书.pdf

    A10-Thunder_6430S方案白皮书.pdf

    开源项目-muesli-thunder.zip

    在使用Thunder时,用户应首先下载并解压“muesli-thunder.zip”文件,得到“thunder-master”目录。然后按照项目提供的安装指南编译并安装Thunder,最后通过命令行启动Thunder,开始探索和操作BoltDB数据库。对于...

    docker-thunder-xware:Docker雷鸣般的倒塌

    docker pull yinheli/docker-thunder-xware:latest 创建一个下载目录. 用于挂载卷 mkdir data 运行 docker run -d \ --name=xware \ --net=host \ -v $(pwd)/data:/app/TDDOWNLOAD \ yinheli/docker-thunder-...

    3D-Thunder-Lightning.zip

    3D-Thunder-Lightning.zip,受航母指令启发的开源未来动作飞行模拟器游戏,3D建模使用专门的软件来创建物理对象的数字模型。它是3D计算机图形的一个方面,用于视频游戏,3D打印和VR,以及其他应用程序。

    A10-Thunder_930方案白皮书.pdf

    A10 Thunder 930方案白皮书 A10 Thunder 930是A10 Networks公司推出的统一应用服务网关(UASG),采用64位系统、1U硬件,提供了极具性价比的解决方案。该设备基于A10极具扩展性的灵活高级核心操作系统(ACOS)架构...

    系统工具-文件下载-Thunderbird91.0b4.zip

    Thunderbird91.0b4是该软件的一个版本,其中“91.0b4”表示的是版本号,其中“b4”代表Beta 4,即这一版本是公开测试版的第四个版本,通常在正式版发布之前,用于测试和修复潜在问题。 Thunderbird的核心特点包括...

    A10-Thunder-5430S方案白皮书

    《A10 Thunder 5430S方案白皮书》是针对A10 Networks公司推出的Thunder 5430S高性能负载均衡解决方案的一份详细技术文档。在IT行业中,负载均衡是一项至关重要的技术,它确保了网络服务的高可用性和性能优化。A10 ...

    Android代码-Thunder

    Thunder Android OkHttp util package let response callback at MainThread(UIThread), also it‘s lifecycle safety. ⚠️ Thunder‘s code is based on SugarTask(Very nice code

Global site tag (gtag.js) - Google Analytics