2.RPC框架的简单实现(定义自己的ldubbo命名空间)

在spring配置文件中扩展自己的xml bean配置,参考spring帮助文档的 Extensible XML authoring 部分,这里不详细说明了。

ldubbo框架服务端、客户端也基于spring配置文件
服务端bean的定义,只定义一个protocol bean和一个service bean,如下:

<ldubbo:protocol name="ldubbo"/>
<ldubbo:service interface="com.lipenglong.ldubbo.api.service.UserService" ref="userService"/>

首先要有一个协议配置,ldubbo框架我们写两个简单的实现,rmi协议和ldubbo协议。srvice暴露服务配置,要有一个interface说明暴露的是哪个接口服务,ref指向接口的实现。

客户端bean的定义,定义一个registry bean和一个reference bean,如下:

<ldubbo:registry address="127.0.0.1:30880" protocol="ldubbo"/>
<ldubbo:reference interface="com.lipenglong.ldubbo.api.service.UserService" id="userService"/>

这里客户端定义一个registry,指定服务端ip端口和使用的协议,dubbo一般使用的注册中心是zookeeper,自己实现的这个rpc demo框架简单些直接连接服务端。

约定好了服务端,客户端的配置,接下来该定义这些命名空间了。在resources目录下创建META-INF目录,创建一个ldubbo.xsd文件,定义自己的schema文件,如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.lipenglong.com/schema/ldubbo"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:beans="http://www.springframework.org/schema/beans"
            targetNamespace="http://www.lipenglong.com/schema/ldubbo"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified">
    <xsd:import namespace="http://www.springframework.org/schema/beans"/>

    <xsd:element name="protocol">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="name" type="protocol-types" use="required"/>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="protocol-types">
        <xsd:restriction base="xsd:NMTOKEN">
            <xsd:enumeration value="rmi"/>
            <xsd:enumeration value="ldubbo"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:element name="service">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="interface" type="xsd:string" use="required"/>
                    <xsd:attribute name="ref" type="xsd:string" use="required"/>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="registry">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="address" type="xsd:string" use="required"/>
                    <xsd:attribute name="protocol" type="protocol-types" use="optional"/>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="reference">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="interface" type="xsd:string" use="required"/>
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

protocol元素定义一个name属性,name属性的type是自定义的protocol-types,有rmi和ldubbo两个枚举值;
service元素的interface和ref属性都是string类型;
registry元素的address是string类型,protocol使用上面定义的protocol-types枚举类型;
reference元素定义一个string类型interface属性,这里并没有定义id,因为spring的bean默认都有id这个属性。

根据spring xml扩展的语法规则,在META-INF目录下,定义spring.handlers和spring.schemas两个文件
spring.schemas文件:

http\://www.lipenglong.com/schema/ldubbo/ldubbo.xsd=META-INF/ldubbo.xsd

spring.handers文件:

http\://www.lipenglong.com/schema/ldubbo=com.lipenglong.ldubbo.config.spring.schema.LdubboNamespaceHandler

LdubboNamespaceHandler类是解析自定义命名空间的类,下一篇详细介绍NamespaceHandler和BeanDefinitionParser的实现,如何实现自定义bean的解析并初始化到spring的容器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值