1、dubbo provider
dubbo provider是服务提供者,在dubbo中的一个数据模型。
在soa系统中,服务若需要对外暴露,那么dubbo作为一个RPC框架是一个好的选择。
例如在一个application中,简单的配置provider.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:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="hello-world-app" /> <!-- 使用multicast广播注册中心暴露服务地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.bailei.dubbo.demo.DemoService" ref="demoService" class="com.bailei.dubbo.demo.DemoServiceImpl" version="1.0.0" timeout="5000" retries="3" async="false"> <dubbo:method name="sayHello" timeout="3000" retries="2" async="false"> </dubbo:method> <property name="test" value="test" /> </dubbo:service> <!-- <dubbo:service ref="demoService" interface="com.bailei.dubbo.demo.DemoService" ></dubbo:service> --> <!-- 和本地bean一样实现服务 --> <bean id="demoService" class="com.bailei.dubbo.demo.DemoServiceImpl" /> </beans>
就将接口DemoService对外以dubbo协议方式暴露出去了,想调用此服务的application只需要配置相应的consumer配置
consumer.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:dubbo="http://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用zookeeper广播注册中心暴露发现服务地址 --> <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"/> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="demoService" interface="com.bailei.dubbo.demo.DemoService" version="1.0.0" /> </beans>
更详细<dubbo:service>配置请参见 官方文档
-
2、我们先跑个例子
DemoService.java接口,对外暴露的接口
/** * */ package com.bailei.dubbo.demo; import java.util.Map; import com.alibaba.dubbo.config.ProtocolConfig; /** * @author bailei * */ public interface DemoService { public String sayHello(String name); public String testMethod(Map map, ProtocolConfig config) ; }
上面接口的实现类:DemoServiceImpl.java
/** * */ package com.bailei.dubbo.demo; import java.util.Map; import com.alibaba.dubbo.config.ProtocolConfig; /** * @author bailei * */ public class DemoServiceImpl implements DemoService { private String privateString; public String publicString; protected String protectedString; @Override public String sayHello(String name) { return "Hello " + name; } @Override public String testMethod(Map map, ProtocolConfig config) { // TODO Auto-generated method stub return null; } public String getPrivateString() { return privateString; } public void setPrivateString(String privateString) { this.privateString = privateString; } public String getPublicString() { return publicString; } public void setPublicString(String publicString) { this.publicString = publicString; } public String getProtectedString() { return protectedString; } public void setProtectedString(String protectedString) { this.protectedString = protectedString; } }
Provider.java 服务提供者application
package com.bailei.dubbo.demo; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * Hello world! * */ public class Provider { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "classpath:provider.xml" }); context.start(); System.in.read(); // 按任意键退出 } }
Consumer.java 消费者application
ackage com.bailei.dubbo.demo; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "classpath:consumer.xml" }); context.start(); DemoService demoService = (DemoService) context.getBean("demoService"); // 获取远程服务代理 String hello = demoService.sayHello("world"); // 执行远程方法 System.out.println(hello); // 显示调用结果 System.in.read(); } }
跑出来的结果:
将Provider启动,之后将Consumers启动,Consumer的控制台应该打印出Hello Word
实际上确实调用成功了。
这个过程实际上参与方有三个:
registry 、provider、consumer
官方dubbo架构图
上图中的Monitor暂时没有用到。
图中Registry是注册中心,本文中使用的zookeeper,dubbo支持多种注册中心。
包含Provider的Container本文中是java application。provider是提供服务方,在启动时,连接到注册中心,将服务相关信息以某种格式(dubbo自定义模型URL)存放在注册中心。下图有zookeeper存放节点的具体内容。
consumer是服务消费方,以长连接到注册中心后,订阅需要的服务,如com.bailei.dubbo.demo.DemoService。通过这个在zookeeper节点中拿到具体的providers下面的信息(URL),完成服务的订阅。
当provider有更新时,会发送给注册中心,注册中心会及时将更新推送给consumer。
具体调用过程:消费方发起远程调用时,首先应该拿到调用接口提供方的相关信息,就像http请求,起码得知道ip和端口啊。从注册中心拿到的信息可以找到提供者providers信息。
里面具体是这样子的:(经过URLDecode)
dubbo://192.168.144.104:20880/com.bailei.dubbo.demo.DemoService?any
host=true&application=hello-world-app&class=com.bailei.dubbo.demo.Demo
ServiceImpl&dubbo=2.0.0&generic=false&interface=com.bailei.dubbo.dem
o.DemoService&methods=sayHello,testMethod&pid=5648&retries=3&rev
ision=1.0.0&sayHello.retries=2&sayHello.timeout=3000&side=provider
&timeout=5000×tamp=1442937194957&version=1.0.0
以dubbo开头说明使用的是dubbo协议作为rpc protocol,后面的博客会讲到。
可以发现provider.xml配置的一些信息,都以url形式存放起来了。
消费方可以通过接口查找到这样的信息,然后由这样的信息调用到具体的服务提供方com.bailei.dubbo.demo.DemoService,中间的细节,后面的博客会讲到。
-
3、Provider如何初始化的
3.1、基于Spring的配置
从provider.xml元素标签可知,dubbo有自己的spring扩展。在dubbo源码项目中:
dubbo-config-spring META-INF/dubbo.xsd、spring.handlers、spring.schemas。这是标准的自定义spring配置三件套啊。
spring.handlers内容如下:
http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler
这个类扩展于spring的NamespaceHandlerSupport,省略了import
/** * DubboNamespaceHandler * * @author william.liangf * @export */ public class DubboNamespaceHandler extends NamespaceHandlerSupport { static { Version.checkDuplicate(DubboNamespaceHandler.class); } public void init() { registerBeanDefinitionParser("application", new DubboBeanDefinitionParser(ApplicationConfig.class, true)); registerBeanDefinitionParser("module", new DubboBeanDefinitionParser(ModuleConfig.class, true)); registerBeanDefinitionParser("registry", new DubboBeanDefinitionParser(RegistryConfig.class, true)); registerBeanDefinitionParser("monitor", new DubboBeanDefinitionParser(MonitorConfig.class, true)); registerBeanDefinitionParser("provider", new DubboBeanDefinitionParser(ProviderConfig.class, true)); registerBeanDefinitionParser("consumer", new DubboBeanDefinitionParser(ConsumerConfig.class, true)); registerBeanDefinitionParser("protocol", new DubboBeanDefinitionParser(ProtocolConfig.class, true)); registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true)); registerBeanDefinitionParser("reference", new DubboBeanDefinitionParser(ReferenceBean.class, false)); registerBeanDefinitionParser("annotation", new DubboBeanDefinitionParser(AnnotationBean.class, true)); } }
spring解析xml配置时,遇到自定义命名空间元素,会先去加载spring.handlers文件,获取到自定义命名空间解析处理的类,通过classloader加载实例化
,DubboNamespaceHandler初始化时,注册需要自己解析的元素名及对应的类名。
provider初始化,重点初始化两个类,数据模型类:
1、ProviderConfig
2、ServiceBean
未完待续。。。。。。。。。。。。
相关推荐
- **6.2.2.3 Main**:主入口,初始化Spring容器并加载所有的bean。 ##### 6.3 Extension机制 - **6.3.1 JavaSPI**:SPI(Service Provider Interface)是一种服务提供者接口机制,允许第三方扩展实现。 - **6.3.2...
在深入理解Dubbo源码之前,需要掌握一系列基础知识,这将有助于更好地理解Dubbo的设计与实现。 1. **Java语言编程**:熟悉Java语言的基本语法和面向对象特性,对于理解Dubbo中的各种类、接口以及方法非常重要。 2. ...
"dubbo-provider.zip"这个压缩包,显然包含了与Dubbo服务提供者相关的源码或者配置文件,是学习和实践Dubbo服务提供者功能的良好资源。 首先,我们要理解什么是Dubbo服务提供者。在分布式系统中,服务提供者是提供...
- **处理事件**:在Bean的生命周期中触发不同的事件,例如初始化前、初始化后等。 - **主入口**:`SpringApplication.run()`方法作为启动Spring应用的入口点。 - **Extension机制** - **Java SPI**:Dubbo使用...
- **Bootstrap**:初始化 Dubbo 的上下文环境。 - **ServiceConfig**:服务提供者的配置信息。 - **ReferenceConfig**:服务消费者的配置信息。 - **Registry**:服务注册中心,负责服务的注册和发现。 - **Cluster*...
《深入剖析Dubbo源码:探索2.5.9版本的奥秘》 在软件开发领域,理解并掌握开源框架的源码对于提升技术能力、优化应用性能具有至关重要的作用。今天,我们将聚焦于分布式服务框架Dubbo,通过下载并研究其2.5.9版本的...
`initLoadBalance`方法会根据invoker列表和invocation来初始化负载均衡器,它会通过`ExtensionLoader`获取指定方法的`loadbalance`策略。`getExtensionLoader`是Dubbo的SPI(Service Provider Interface)机制,用于...
通过阅读和分析源码,我们可以更深入地理解其内部机制,以便更好地应用和扩展Dubbo,满足各种复杂的分布式系统需求。在实际项目中,结合注册中心、监控系统以及服务治理策略,Dubbo能够帮助开发者构建高可用、可扩展...
- **Consumer.java**:服务消费者的启动类,初始化并启动服务消费者,通过Dubbo的API调用服务提供者。 【标签】"Dubbo zookeeper"表明项目中使用了Zookeeper作为注册中心。Zookeeper是一个分布式的,开放源码的...
- `initLimit=10`:初始化阶段可以接受的时间片数。 - `syncLimit=5`:发送请求和接收确认之间可以接受的时间片数。 - `dataDir=D:\\zookeeper-3.4.5\\data`:快照存储目录。 - `dataLogDir=D:\\zookeeper-3.4.5...
SpringBoot以其便捷的启动和管理方式,简化了Spring应用的初始化和配置过程,而Dubbo则是一款高效的远程服务调用框架,广泛用于服务治理和服务间通信。在本项目中,我们将深入探讨SpringBoot与Dubbo的整合,以及如何...
4. **数据库脚本**:为了初始化数据库,项目应该包含SQL脚本,用于创建支付相关的表,比如订单表、交易状态表等。 5. **测试用例**:为了确保支付功能的正确性,通常会包含单元测试或集成测试代码。 6. **日志和...
【标题】"provider——consumer 程序源码"指的是一个使用Java开发的分布式服务框架Dubbo中的核心组件——提供者(Provider)和消费者(Consumer)的源代码。Dubbo是阿里巴巴开源的一个高性能、轻量级的服务治理框架...
8. **Spring/Spring Boot集成**:结合Spring进行服务的配置和管理,利用Spring Boot简化初始化和配置过程。 9. **RESTful API设计**:Web服务接口遵循RESTful原则,提高接口的易用性和可维护性。 10. **测试与监控**...
雷神对dubbo2.x版本的源码进行了刨析,这意味着对于学习Dubbo源码来说,可以通过阅读相关的源码部分来深入了解其内部工作机制。这通常包括了解服务暴露的具体实现细节,以及服务引用、网络通信、序列化机制、服务...
【Dubbo支付系统源码.zip】是一个包含使用Dubbo框架构建的支付系统源代码和相关数据库脚本的压缩包。这个系统旨在实现一个分布式、微服务化的支付处理平台,能够处理各种在线支付业务,提高系统的可扩展性和容错性。...
在这个项目中,spring作为基础框架,管理着整个系统的bean,负责各个组件的初始化和装配,以及提供事务管理等功能。 springMvc是Spring框架的一部分,专门用于处理Web请求。它遵循Model-View-Controller设计模式,...
SpringBoot简化了Spring应用的初始化和配置过程,而Dubbo则是一个高性能、轻量级的服务治理框架,专注于远程调用。下面将详细阐述这两个框架以及如何将它们结合使用来实现"Hello World"项目。 **SpringBoot简介** ...
在这样的工程中,开发者通常会复用和理解Dubbo源码中的ExtensionLoader工作原理,通过编写自己的代码来实现类似的功能,以支持自定义的扩展点和插件。 ExtensionLoader在Dubbo中的主要功能包括: 1. **加载器机制*...
项目启动时,Spring会初始化并管理所有bean,Dubbo则会启动服务提供者和消费者,通过注册中心进行服务的注册和发现。在Controller中,可以通过Autowired注解注入服务接口,然后调用其方法,实现跨服务的通信。这个...