文章目录
前言
文章讲解spring如何集成dubbo,以及dubbo Api 方式集成和常用配置
一、spring 自定义标签解析过程:
1、spring初始化容器时,创建BeanFactory对象后会调用loadBeanDefinitions加载配置文件中的信息
2、从root节点解析出命名空间,再从 META-INF/spring.schemas 文件中找到对应的命名空间描述规则文件dubbo.xsd,检查xml是否正确
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210317142459228.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyMTI5Mzcx,size_16,color_FFFFFF,t_70
3、后续在DefaultBeanDefinitionDocumentReader类的parseBeanDefinitions
parseDefaultElement(ele, delegate);// 处理默认命名空间节点,例如: <bean id="test" class="" />
parseCustomElement(ele);// 1.2 自定义命名空间节点的处理
String namespaceUri = getNamespaceURI(ele);//获取xml文件命名空间如: http://www.springframework.org/schema/beans
NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
// 从所有类路径资源(META-INF/spring.handlers)加载命令空间和解析器配置,然后实例化解析器,调用init方法初始化返回
handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));//使用解析器解析节点
二、dubbo的配置文件处理:
1、dubbo.jar下的META-INF/spring.handlers中有:
三、spring容器在实例化ReferenceBean 时、进行服务引用:
四、spring容器初始化后通知ServiceBean 进行服务暴露:
五、综上所述dubbo的流程可以简化为:
ApplicationConfig appConfig = new ApplicationConfig(name);//当前应用配置 相当于<dubbo:application name=“app”/>
RegistryConfig registry = new RegistryConfig(); //注册中心配置 相当于<dubbo:registry protocol=“zookeeper” > address=“172.0.0.1:2181”/>
registry.setAddress(“127.0.0.1:2181”);
registry.setProtocol(“zookerper”);
ProtocolConfig protocol = new ProtocolConfig(); //相当于<dubbo:protocol name=“dubbo” port=“20885”/ >
protocol.setName(“dubbo”);
protocol.setPort(12345);
ServiceConfig serviceConfig = new ServiceConfig(); //相当于<dubbo:service interface=“服务接口名” ref=“接口实现类” />
serviceConfig.setInterface(XxxService.class);
serviceConfig.setRef(XxxService);
serviceConfig.setApplication(appConfig);
serviceConfig.setRegistry(registryConfig);
serviceConfig.setProtocol(protocolConfig);
serviceConfig.export();//服务暴露
ReferenceConfig referenceConfig=new ReferenceConfig();//相当于<dubbo:reference interface=“服务接口名”/>
referenceConfig.setApplication(applicationConfig);
referenceConfig.setRegistry(registryConfig);
referenceConfig.setInterface(XxxService.class);
XxxService xxxService = referenceConfig.get()//服务引用、并得到对应的invoker对象,用于rpc调用
六:为了方便后续讲解原理对各种config配置对象及其参数的理解;这里整理了dubbo常用配置详解:
1、<dubbo:application name="用于注册中心标志当前应用名称,必填" organization=“用于注册中期区分组织机构,可选”
owner=“负责人邮箱用于服务治理,可选” environment=“应用环境用于开发测试功能限制条件,可选”/>
说明:应用信息配置,用于配置当前应用信息,不管该应用是提供者还是消费者
2、<dubbo:registry address=“注册中心地址,同集群内的多地址用:ip:port,ip:port,不同集群的注册中心,请配置多个<dubbo:registry>标签,必填”
protocol=“注册中心通信协议,zookeeper,redis可选,默认dubbo”
username=“注册中心登录用户名,可选” password=“注册中心登录密码,可选”
id="代表这个注册中心的bean,多个注册中心的时候会在service/reference中指定,可选"
timeout=“注册中心请求超时时间,可选”
check="boolean值,控制注册中心不存在是否报错,可选
register=“boolean值,控制是否想注册中心注册,但是可以订阅,可选”
subscribe=“boolean值,控制是否向注册中心订阅,,但是可以注册,可选”
file=“使用文件缓存注册中心地址列表及服务提供者列表,应用重启时将基于此文件恢复,可选”
file="${HOME}/.dubbo/dubbo_registry_ai_match_service.cache" ${HOME}在linux系统代表软件路径,window没有所以本地启动有这个会报错/>
说明:代表注册中心配置,向注册中心注册,用于配置连接注册中心相关信息,如果有多个不同的注册中心,
可以声明多个<dubbo:registry>标签,并在<dubbo:service>或<dubbo:reference>的registry属性指定使用的注册中心id。
3、<dubbo:protocol name=“协议名称,必填dubbo/http/rest” ,port="缺省默认20880,服务提供端口,可选"
accepts=“服务提供方最大可接受连接数,可选”
serialization=“协议序列化方式,默认hessian2,可选” charset=“UTF-8序列化编码,可选”
register=“boolean,该协议的服务是否注册到注册中心,可选”
server=“netty、mina、grizzly等NIO通信框架默认netty”/>
代表的是如何通信的封装、还有参数如:threads/dispatcher all/threadpool /codec指定接收到信息后如何解码,分配到什么线程池、用多少线程进行处理消息
说明:服务提供者协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。,
如果需要支持多协议,可以声明多个<dubbo:protocol>标签,并在<dubbo:service>中通过protocol属性指定使用的协议。
适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议、默认的是dubbo长链接、还有hessian、rmi、thrift、redis、http等协议
4、<dubbo:service interface=“服务接口名,必填” ref=“服务对象实现引用”,必填
version=“标志服务版本,可选”
delay=“延迟注册服务时间(毫秒),-1表示spring容器始化完成时暴露服务,可选”
timeout=“远程服务调用超时时间(毫秒),可选”
loadbalance=“负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用,可选”
async=“是否缺省异步执行,不可靠异步,只是忽略返回值,不阻塞执行线程”
owner=“服务负责人邮箱,用于服务治理,可选”
protocol=“使用指定的协议暴露服务,在多协议时使用,值为<dubbo:protocol>的id属性,多个协议ID用逗号分隔,可选”
proxy=“默认javassist,代理ref的invoker类用什么技术实现;可选jdk”,
scope="控制服务暴露到本地还是远程,默认空,都暴露;可以为remote/local/none都不暴露",
registry=“向多个注册中心注册时用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,”
registry=“booealn值如果不想将该服务注册到任何registry,可选/>
说明:服务提供者暴露服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。
5、<dubbo:reference interface=“服务接口名,必填”,id="服务引用BeanId,必填”
version=“服务版本,与服务提供者的版本一致,可选”
timeout=“服务方法调用超时时间(毫秒)”
retries=“远程服务调用重试次数,不包括第一次调用,不需要重试请设为0”
check=“启动时检查提供者是否存在,true报错,false忽略,可选”
url=“点对点直连服务提供者地址,将绕过注册中心,可选dubbo://127.0.0.1:28050”
registry=“stirng值,从指定注册中心注册获取服务列表,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,可选”
loadbalance="consistenthash"指定负载均衡策略/>
说明:服务消费者引用服务配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心
6、<dubbo:monitor address=“监控中心服务器地址,格式:ip:port,调用信息会发送到监控中心(1)如配置为address="10.20.130.230:12080", 则为使用logstat监控
(2)如未添加该配置,或者address="N/A", 则会去加载comsat.xml, 如果找到,就使用comsat监控;如果没找到,就不做监控” />
7、<dubbo:provider proxy=“JDK”指定invoker代理对象的生成使用JDK字节码生成技术还是javassist;默认javassist />
说明:服务提供者缺省值配置,该标签为<dubbo:service>和<dubbo:protocol>标签的缺省值设置。
8、<dubbo:consumer/>
说明:服务消费者缺省值配置,该标签为<dubbo:reference>标签的缺省值设置
9、<dubbo:service interface="com.callback.CallbackService" ref="callbackService" connections="1" callbacks="1000">
<dubbo:method name="addListener">细分到方法
<dubbo:argument index="1" callback="true" />服务回调
</dubbo:method>
</dubbo:service>
七、zk上注册的节点:
zk上的节点路径格式为: /{rootpath}/{category}/节点协议://ip:port/interfaceName?各种参数……
rootpath 默认为 dubbo
category 有:providers、consumers、configurators、routers
总结
dubbo根据spring扩展的自定义命名空间,定义了自己配置文件的处理,然后使用DubboNameSpaceHandler生成各种配置文件对象,其中服务暴露以ServiceBean为入口,服务引用以ReferenceBean为入口,启动dubbo服务;