在上一篇 Blog 文中,我们了解到 RSF 的整体设计一共是分了 9 个层次。这一篇 Blog 我们来专门介绍 RSF 是如何将服务发布出去的。我们简称服务暴露。
什么是服务暴露?
让我们先来看一张图,直观的感受到服务暴露的具体意义。
首先讲一下什么是服务暴漏,服务暴露简单地讲就是把服务接口信息收集起来然后加以管理。对于服务提供者(Provider)来说,当有服务调用请求进来时可以快速的找到服务对象并加以调用。而对于服务消费者(Customer)来说,服务暴露则可以为发起服务调用时提供充足 RPC 请求信息。
服务信息定义
现在我们知道了什么是服务暴露,接下来我们探一探 RSF 对于服务是如何进行描述的。
RSF 的服务信息,是由 RsfBindInfo 接口进行最高级别的抽象。这个接口继承自 Hasor 的 BindInfo,下面还有 3个子类。先上一张类图加一说明。
父接口就不多说了,目前来说无外乎就是公用方法。以后会在 Hasor 的底层上进行打通。下面三个子类各有个的作用,这个需要介绍一下。
首先 RsfBindInfoWrap 子类,它就像名字里的 Wrap 所表达的一样,他就是一个包装类。里面什么都没干。这个类的作用是,当我们想要扩展 RsfBindInfo 并增加一些属性时。我们不需要去修改底层的实现类,只需要继承包装类并加上自己的转有属性就可以。---- 这是典型的装饰模式的应用。
其次 ServiceDomain 类,这个类是一个领域模型 Bean 在这里保存了大量的属性信息,RsfBindInfo 接口中所表达的所有属性,在这个类里都能找到它们的身影。下面这张图显示了,这个类都定义了哪些属性。
最后 ServiceDefine 这个类比较特殊,大家或许觉得。服务的所有信息在上面 ServiceDomain 类中已经定义好了,那么 ServiceDefine 究竟是什么作用呢?
我们先进去一探究竟,下面这个类是 ServiceDefine 的节选。
大家可以看到,它是通过装饰模式扩展了 RsfBindInfoWrap 并定义了一些自己的属性。这些属性里面我们看到。和 ServiceDomain 不同,ServiceDomain 类中定义的都是服务的基本信息。而这里的属性都是服务运行调用时紧密相关的一些数据。
例如:filterList,这个属性里保存了服务的定义的所有私有 RsfFilter,而 customerProvider 属性我们可以通过它获取服务对象。此外 oriFlowControl 表示了服务的流控规则。
服务注册
服务注册的目的是为了,让当有服务消费者想要消费服务的时候可以有信息可以查询。这就需要引入注册中心的角色。下面图中表示了 RSF 中注册中心的地位。
在 RSF 中,注册中心是一个独立的功能。并且位于“net.hasor.rsf.center”包下。前面在服务信息定义小节已经明确服务信息所包含的信息,现在就开看看注册中心对于服务信息的类图关系。
从类图中也可以看到,RSF 的注册中心对于服务定义的描述十分直接。一个基类另外两个字类一个表示服务提供者,另外一个表示为服务消费者。接下来我们来看一看 RSF 注册中心是如何启动的。
注册中心的运行分为 客户端 和 服务端。
客户端:客户端负责收集 RSF 的所有服务信息,并形成上面两个对应的注册中心 Bean 。而服务端负责收集并管理这些 Bean。
在 RSF 中注册中心客户端的启动入口是“net.hasor.rsf.center.client.RsfCenterModule”,Center 服务端启动入口为“net.hasor.rsf.center.server.bootstrap.RsfCenterFrameworkModule”。
有兴趣的同学可以更佳深入的去分析里面的实现逻辑。