使用Ressor在Java中实现基于资源的动态服务

介绍

Ressor是一个开放资源框架,用于开发基于Java的动态服务和组件,其中业务逻辑基于某些资源数据。资源可以是任何东西-本地文件系统上的文件,GitHub存储库中的YAML配置等。
例如,考虑天气预报服务或股票市场价格提供商,它们通过HTTP端点提取新数据。如果这些服务使用过时的数据,这些服务将无用,因此它们应不断检测并重新加载。
Ressor的关键思想是隐藏与使用数据源,内容解析和动态重新加载相关的所有复杂性。它提供了一个声明性API,您可以使用它一次定义服务并用于整个应用程序运行时。
怎么运行的
Ressor会生成一个特殊的代理类,该类继承您的服务类型。在后台,此代理将所有方法调用委托给您的服务/组件的最新实例。为了创建它,它从提供的源中加载数据,使用翻译器对其进行解析,然后调用类的构造方法/工厂方法。

Ressor提供了一个声明性 API,可实现最受欢迎的源代码和文件格式。在服务实例化期间,您应该定义源,资源和转换器是什么。因此,在创建服务之后,您可以订阅进一步的资源更改。还可以使用不同的重新加载策略来支持版本控制 ,具体取决于数据源的类型。这允许仅重新加载实际更改的数据,从而节省了网络/磁盘带宽和CPU资源。
这种方法最适合IoC / DI框架,例如Spring,在上下文启动期间,您仅一次注册Bean。您也可以通过Ressor服务安全地做到这一点。在这种情况下,Ressor将隐式确保它们始终是最新的。
动态要素切换示例

定义服务

考虑您将要为您的应用程序实现一个非常简单的Feature Toggle服务。将使用存储在GitHub存储库中的简单YAML文件对其进行配置。每当通过提交到此存储库更改功能切换状态时,您的应用程序应在运行时启用/禁用给定功能。以下是数据模型:
使用Ressor在Java中实现基于资源的动态服务
非常简单-我们有一个功能名称及其当前状态。有了这个模型,我们可以实现我们的服务:
使用Ressor在Java中实现基于资源的动态服务
我们的服务将要素切换列表作为输入并构建状态图。然后,我们可以使用isEnabled 方法检查该功能是否启用 。
现在,是时候让Ressor创建服务实例并开始使用GitHub存储库中的数据为它加油了:
使用Ressor在Java中实现基于资源的动态服务
让我们逐行描述最重要的部分:
#4:声明我们希望数据采用YAML数组格式。Ressor将使用Jackson将其解析为List 。
#5:声明源将是来自远程URL的Git存储库。
#8:声明Git储存库中文件的路径。
#9:创建代理类实例,克隆Git存储库并将YAML内容转换为 FeatureToggleService构造函数。
您始终可以将源重复用于多种服务。
您可以异步实例化服务,但是在这种情况下,您需要提供一个初始实例,该实例将一直服务到第一次重新加载发生:
使用Ressor在Java中实现基于资源的动态服务
使服务可重新加载
我们希望Ressor featureToggle 仅提供最新信息。有人可以通过对GitHub存储库中的toggles.yaml文件进行更改来禁用某些功能。
这可以通过使用Ressor的简单轮询来实现:
使用Ressor在Java中实现基于资源的动态服务
它将在后台对源存储库每5秒执行git fetch命令。如果检测到任何文件更改(针对当前分支),FeatureToggleService将创建的新实例并在代理内替换该实例 。
这样, featureToggle 实例可以在应用程序启动期间例如 一次注册为Spring Bean。Ressor保证最终将包含最新数据。

服务使用

Ressor创建服务实例后,就可以在整个应用程序生命周期中的任何地方使用它:
使用Ressor在Java中实现基于资源的动态服务
您可以在此处找到完整的示例代码。您可以自己运行来尝试。还有很多其他示例。
输入
可通过Maven Central发布版本。源实现捆绑为一个单独的模块。
Java 11+
使用Ressor在Java中实现基于资源的动态服务
Java 8
使用Ressor在Java中实现基于资源的动态服务

结论

Ressor的想法非常简单:采用完整的服务实现,并使用来自给定源的转换后的数据为其加油,并在需要时隐式地重新加载它。除Git之外,Ressor还具有其他各种数据源:文件系统,HTTP,Amazon S3等。本文中未涉及更多情况和功能。
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。使用Ressor在Java中实现基于资源的动态服务