RSF 分布式 RPC 服务信息的暴露

Wesley13
• 阅读 567

    在上一篇 Blog 文中,我们了解到 RSF 的整体设计一共是分了 9 个层次。这一篇 Blog 我们来专门介绍 RSF 是如何将服务发布出去的。我们简称服务暴露。

什么是服务暴露?

    让我们先来看一张图,直观的感受到服务暴露的具体意义。

RSF 分布式 RPC 服务信息的暴露

    首先讲一下什么是服务暴漏,服务暴露简单地讲就是把服务接口信息收集起来然后加以管理。对于服务提供者(Provider)来说,当有服务调用请求进来时可以快速的找到服务对象并加以调用。而对于服务消费者(Customer)来说,服务暴露则可以为发起服务调用时提供充足 RPC 请求信息。

服务信息定义

    现在我们知道了什么是服务暴露,接下来我们探一探 RSF 对于服务是如何进行描述的。

    RSF 的服务信息,是由 RsfBindInfo 接口进行最高级别的抽象。这个接口继承自 Hasor 的 BindInfo,下面还有 3个子类。先上一张类图加一说明。

RSF 分布式 RPC 服务信息的暴露

    父接口就不多说了,目前来说无外乎就是公用方法。以后会在 Hasor 的底层上进行打通。下面三个子类各有个的作用,这个需要介绍一下。

    首先 RsfBindInfoWrap 子类,它就像名字里的 Wrap 所表达的一样,他就是一个包装类。里面什么都没干。这个类的作用是,当我们想要扩展 RsfBindInfo 并增加一些属性时。我们不需要去修改底层的实现类,只需要继承包装类并加上自己的转有属性就可以。---- 这是典型的装饰模式的应用

    其次 ServiceDomain 类,这个类是一个领域模型 Bean 在这里保存了大量的属性信息,RsfBindInfo 接口中所表达的所有属性,在这个类里都能找到它们的身影。下面这张图显示了,这个类都定义了哪些属性。

RSF 分布式 RPC 服务信息的暴露

    最后 ServiceDefine 这个类比较特殊,大家或许觉得。服务的所有信息在上面 ServiceDomain 类中已经定义好了,那么 ServiceDefine 究竟是什么作用呢?

    我们先进去一探究竟,下面这个类是 ServiceDefine 的节选。

RSF 分布式 RPC 服务信息的暴露

    大家可以看到,它是通过装饰模式扩展了 RsfBindInfoWrap 并定义了一些自己的属性。这些属性里面我们看到。和 ServiceDomain 不同,ServiceDomain 类中定义的都是服务的基本信息。而这里的属性都是服务运行调用时紧密相关的一些数据。

    例如:filterList,这个属性里保存了服务的定义的所有私有 RsfFilter,而 customerProvider 属性我们可以通过它获取服务对象。此外 oriFlowControl 表示了服务的流控规则。

服务注册

    服务注册的目的是为了,让当有服务消费者想要消费服务的时候可以有信息可以查询。这就需要引入注册中心的角色。下面图中表示了 RSF 中注册中心的地位。

RSF 分布式 RPC 服务信息的暴露

    在 RSF  中,注册中心是一个独立的功能。并且位于“net.hasor.rsf.center”包下。前面在服务信息定义小节已经明确服务信息所包含的信息,现在就开看看注册中心对于服务信息的类图关系。

RSF 分布式 RPC 服务信息的暴露

    从类图中也可以看到,RSF 的注册中心对于服务定义的描述十分直接。一个基类另外两个字类一个表示服务提供者,另外一个表示为服务消费者。接下来我们来看一看 RSF 注册中心是如何启动的。

    注册中心的运行分为 客户端 和 服务端。

    客户端:客户端负责收集 RSF 的所有服务信息,并形成上面两个对应的注册中心 Bean 。而服务端负责收集并管理这些 Bean。

    在 RSF 中注册中心客户端的启动入口是“net.hasor.rsf.center.client.RsfCenterModule”,Center 服务端启动入口为“net.hasor.rsf.center.server.bootstrap.RsfCenterFrameworkModule”。

    有兴趣的同学可以更佳深入的去分析里面的实现逻辑。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
SpringBoot开发案例之整合Dubbo提供者(二)
!00.jpg(https://blog.52itstyle.com/usr/uploads/2017/07/1329278006.jpg)大家有没有注意到,上一篇中提供者,暴露接口的方式?混搭。springboot本身接口实现使用了注解的方式,而Dubbo暴露接口使用的是配置文件的实现方式,即如下:代码importorg.s
Easter79 Easter79
3年前
SpringBoot开发案例之整合Dubbo提供者(二)
!00.jpg(https://blog.52itstyle.com/usr/uploads/2017/07/1329278006.jpg)大家有没有注意到,上一篇中提供者,暴露接口的方式?混搭。springboot本身接口实现使用了注解的方式,而Dubbo暴露接口使用的是配置文件的实现方式,即如下:代码importorg.s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这