dubbo原理<二> 流程入口+ 参数配置


前言

文章讲解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服务;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值