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

dubbo源码阅读之Provider初始化

阅读更多

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

 

 

未完待续。。。。。。。。。。。。

  • 大小: 2.2 KB
  • 大小: 76 KB
  • 描述: zoknode例子
  • 大小: 13.8 KB
分享到:
评论

相关推荐

    dubbo源码解析2

    - **6.2.2.3 Main**:主入口,初始化Spring容器并加载所有的bean。 ##### 6.3 Extension机制 - **6.3.1 JavaSPI**:SPI(Service Provider Interface)是一种服务提供者接口机制,允许第三方扩展实现。 - **6.3.2...

    dubbo2.0-源码阅读

    在深入理解Dubbo源码之前,需要掌握一系列基础知识,这将有助于更好地理解Dubbo的设计与实现。 1. **Java语言编程**:熟悉Java语言的基本语法和面向对象特性,对于理解Dubbo中的各种类、接口以及方法非常重要。 2. ...

    dubbo-provider.zip

    "dubbo-provider.zip"这个压缩包,显然包含了与Dubbo服务提供者相关的源码或者配置文件,是学习和实践Dubbo服务提供者功能的良好资源。 首先,我们要理解什么是Dubbo服务提供者。在分布式系统中,服务提供者是提供...

    dubbo源码解析2.01.pdf

    - **处理事件**:在Bean的生命周期中触发不同的事件,例如初始化前、初始化后等。 - **主入口**:`SpringApplication.run()`方法作为启动Spring应用的入口点。 - **Extension机制** - **Java SPI**:Dubbo使用...

    dubbo教程视频源码

    - **Bootstrap**:初始化 Dubbo 的上下文环境。 - **ServiceConfig**:服务提供者的配置信息。 - **ReferenceConfig**:服务消费者的配置信息。 - **Registry**:服务注册中心,负责服务的注册和发现。 - **Cluster*...

    dubbo源码下载

    《深入剖析Dubbo源码:探索2.5.9版本的奥秘》 在软件开发领域,理解并掌握开源框架的源码对于提升技术能力、优化应用性能具有至关重要的作用。今天,我们将聚焦于分布式服务框架Dubbo,通过下载并研究其2.5.9版本的...

    dubbo 配置 loadbalance 不生效?撸一把源码(csdn)————程序.pdf

    `initLoadBalance`方法会根据invoker列表和invocation来初始化负载均衡器,它会通过`ExtensionLoader`获取指定方法的`loadbalance`策略。`getExtensionLoader`是Dubbo的SPI(Service Provider Interface)机制,用于...

    Dubbo阅读笔记

    通过阅读和分析源码,我们可以更深入地理解其内部机制,以便更好地应用和扩展Dubbo,满足各种复杂的分布式系统需求。在实际项目中,结合注册中心、监控系统以及服务治理策略,Dubbo能够帮助开发者构建高可用、可扩展...

    Dubbo-Demo

    - **Consumer.java**:服务消费者的启动类,初始化并启动服务消费者,通过Dubbo的API调用服务提供者。 【标签】"Dubbo zookeeper"表明项目中使用了Zookeeper作为注册中心。Zookeeper是一个分布式的,开放源码的...

    DUBBO本地搭建及小案例

    - `initLimit=10`:初始化阶段可以接受的时间片数。 - `syncLimit=5`:发送请求和接收确认之间可以接受的时间片数。 - `dataDir=D:\\zookeeper-3.4.5\\data`:快照存储目录。 - `dataLogDir=D:\\zookeeper-3.4.5...

    SpringbootDubbo源码

    SpringBoot以其便捷的启动和管理方式,简化了Spring应用的初始化和配置过程,而Dubbo则是一款高效的远程服务调用框架,广泛用于服务治理和服务间通信。在本项目中,我们将深入探讨SpringBoot与Dubbo的整合,以及如何...

    Dubbo龙果学院简易版支付项目源码

    4. **数据库脚本**:为了初始化数据库,项目应该包含SQL脚本,用于创建支付相关的表,比如订单表、交易状态表等。 5. **测试用例**:为了确保支付功能的正确性,通常会包含单元测试或集成测试代码。 6. **日志和...

    provider——consumer 程序源码.zip

    【标题】"provider——consumer 程序源码"指的是一个使用Java开发的分布式服务框架Dubbo中的核心组件——提供者(Provider)和消费者(Consumer)的源代码。Dubbo是阿里巴巴开源的一个高性能、轻量级的服务治理框架...

    使用Dubbo进行规模服务化前的工程结构优化--源码.rar

    8. **Spring/Spring Boot集成**:结合Spring进行服务的配置和管理,利用Spring Boot简化初始化和配置过程。 9. **RESTful API设计**:Web服务接口遵循RESTful原则,提高接口的易用性和可维护性。 10. **测试与监控**...

    dubbo核心原理解析.pdf

    雷神对dubbo2.x版本的源码进行了刨析,这意味着对于学习Dubbo源码来说,可以通过阅读相关的源码部分来深入了解其内部工作机制。这通常包括了解服务暴露的具体实现细节,以及服务引用、网络通信、序列化机制、服务...

    Dubbo支付系统源码.zip

    【Dubbo支付系统源码.zip】是一个包含使用Dubbo框架构建的支付系统源代码和相关数据库脚本的压缩包。这个系统旨在实现一个分布式、微服务化的支付处理平台,能够处理各种在线支付业务,提高系统的可扩展性和容错性。...

    ZooKeeper+dubbo+spring+springMvc+mybatis实例源码下载

    在这个项目中,spring作为基础框架,管理着整个系统的bean,负责各个组件的初始化和装配,以及提供事务管理等功能。 springMvc是Spring框架的一部分,专门用于处理Web请求。它遵循Model-View-Controller设计模式,...

    SpringBoot+Dubbo简单测试例子

    SpringBoot简化了Spring应用的初始化和配置过程,而Dubbo则是一个高性能、轻量级的服务治理框架,专注于远程调用。下面将详细阐述这两个框架以及如何将它们结合使用来实现"Hello World"项目。 **SpringBoot简介** ...

    仿Dubbo的ExtensionLoader

    在这样的工程中,开发者通常会复用和理解Dubbo源码中的ExtensionLoader工作原理,通过编写自己的代码来实现类似的功能,以支持自定义的扩展点和插件。 ExtensionLoader在Dubbo中的主要功能包括: 1. **加载器机制*...

    springMVC+spring+dubbo hello world测试项目

    项目启动时,Spring会初始化并管理所有bean,Dubbo则会启动服务提供者和消费者,通过注册中心进行服务的注册和发现。在Controller中,可以通过Autowired注解注入服务接口,然后调用其方法,实现跨服务的通信。这个...

Global site tag (gtag.js) - Google Analytics