美文网首页
07-dubbo服务端如何暴露服务

07-dubbo服务端如何暴露服务

作者: cjxz | 来源:发表于2019-03-13 13:54 被阅读0次

在第一篇dubbo入门demo中我们在服务端暴露服务的配置如下:

<?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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">


<!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="order" />

    <!-- 使用multicast广播注册中心暴露服务地址 -->
    <dubbo:registry address="N/A"/>

    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service interface="com.order.OrderService" ref="orderService"/>

    <!-- 和本地bean一样实现服务 -->
    <bean id="orderService" class="com.order.OrderServiceImpl"/>
</beans>

上面的每一项配置项都非常非常重要后面我们慢慢分析。先来分析一下<dubbo:service interface="com.order.OrderService" ref="orderService"/>这个表示服务端将要暴露OrderService这个服务想要知道服务端如何暴露服务的需要扎实的Spring基础。我们配置的dubbo服务都是直接嵌入到Spring上下文里面,所以肯定有个东西来衔接dubbo和Spring。从命名空间入手,可以看到我们的dubbo都是使用自己的命名空间。具体Spring自定义命名空间可以参考我的Spring源码系列文章

public class DubboNamespaceHandler extends NamespaceHandlerSupport {

    static {
        Version.checkDuplicate(DubboNamespaceHandler.class);
    }

    @Override
    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 AnnotationBeanDefinitionParser());
    }
}

上面就是dubbo的所有命名空间。我们是分析暴露服务,所以直接看registerBeanDefinitionParser("service", new DubboBeanDefinitionParser(ServiceBean.class, true));
在Spring容器中所有的dubbo对外暴露的服务都是ServiceBean对象,在注册的时候使用不同的id(采用的是interface作为id进行注册)进行注册不同的ServiceBean对象。在spring容器里面如果需要实例的对象是单例对象那么初始化容器的时候就会实例化。这个动作在finishBeanFactoryInitialization(beanFactory);的时候处理。让后进行实例化过程。org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons在加载容器的时候会将所有的BeanDefinition注册到DefaultListableBeanFactory里面所以可以直接获取所有的BeanDefinition数据,

image.png image.png
image.png
image.png

相关文章

  • 07-dubbo服务端如何暴露服务

    在第一篇dubbo入门demo中我们在服务端暴露服务的配置如下: 上面的每一项配置项都非常非常重要后面我们慢慢分析...

  • dubbo源码愫读(7)dubbo的protocol动态加载机制

    从前面的分析,我们知道dubbo的服务端暴露服务时,是根据配置的协议进行暴露的,可以进行多协议暴露。 (1)、按协...

  • 2.2 dubbo服务端暴露(一)

    dubbo服务端暴露的总体流程如下图所示: 首先 ServiceConfig 类拿到对外提供服务的实际类 ref(...

  • Binder 笔记

    1IPC 概念: 序列化与binder两方面 android应用层来说是客服端与服务端通信的媒介,接口是服务端暴露...

  • 服务端渲染

    一、服务端渲染需要考虑的问题 1、react 如何支持服务端渲染 import {renderToString, ...

  • 使用AIDL

    1.服务端 服务端首先要创建一个Service用来监听客户端的连接请求,然后创建一个AIDL文件,将暴露给客...

  • 2.4 dubbo服务端暴露(三)

    接上一章内容,当service的本地发布结束后进入远程发布,远程发布流程与本地发布类似将ref转为invoker然...

  • 2.3 dubbo服务端暴露(二)

    从doExportUrls()方法可以看出,dubbo支持多协议发布: 下面我们来看本地发布方法exportLoc...

  • Netty空闲检测之读空闲

    客户端与服务端通信的时候,服务端如何感知到客户端下线.客户端可以每4秒向服务端发送一个数据,服务端每5秒进行空闲检...

  • 侦测服务端(Mapping the Application)

    二、分析服务端 1、了解服务端如何接受用户的输入 (1)通过文件路径。如:REST-style URL 。 ...

网友评论

      本文标题:07-dubbo服务端如何暴露服务

      本文链接:https://www.haomeiwen.com/subject/pjydsqtx.html