使用microconfig.io轻松管理微服务配置

微服务开发和后续操作中的主要问题之一是对其实例的能力和准确的调整。 我认为,新的microconfig.io框架可以提供帮助。 它使您可以优雅地解决一些设置应用程序的例行任务。

如果您有很多微服务,并且每个微服务都带有自己的文件/设置文件,那么它们中的一个可能会出错,而如果没有适当的灵活性和日志记录系统,则可能很难捕获。 框架自行设置的主要任务是最小化重复的实例设置,从而减少添加错误的可能性。

让我们来看一个例子。 假设有一个带有yaml配置文件的简单应用程序。 它可以是任何语言的任何微服务。 让我们看看如何将框架应用于此服务。

但是首先,为了方便起见,我们将在Idea IDE中创建一个空项目,方法是先在其中安装microconfig.io插件:

图片

我们配置了插件启动配置,您可以使用默认配置,如上面的屏幕截图所示。

我们的服务称为订单,然后在一个新项目中,我们将创建一个类似的结构:



在带有服务名称的文件夹中,我们放置了配置文件application.yaml 。 所有微服务都是在某种环境中启动的,因此,除了创建服务本身的配置之外,还必须描述环境本身:为此,创建envs文件夹并向其中添加一个具有我们工作环境名称的文件。 因此,该框架将在开发环境中为服务创建配置文件,因为此参数是在插件的设置中设置的。

dev.yaml文件的结构将非常简单:

mainorder: components: - order 

该框架适用于分组在一起的配置。 对于我们的服务,请为主要订单组选择一个名称。 框架在环境文件中找到每个这样的应用程序组,并为在相应文件夹中找到的所有应用程序创建配置。

订购服务设置文件本身中,到目前为止,我们仅指示一个参数:

 spring.application.name: order 

现在运行插件,它将根据属性中指定的路径为我们生成所需的服务配置:



您只需安装框架的分发工具包并从命令行运行它,而无需安装插件。
该解决方案适合在构建服务器上使用。

值得注意的是,该框架完全理解了属性语法,即可以在yaml配置中一起使用的普通属性文件。

再增加一项支付服务,同时使现有服务复杂化。
按顺序

 eureka: instance.preferIpAddress: true client: serviceUrl: defaultZone: http://192.89.89.111:6782/eureka/ server.port: 9999 spring.application.name: order db.url: 192.168.0.100 

付款方式

 eureka: instance.preferIpAddress: true client: serviceUrl: defaultZone: http://192.89.89.111:6782/eureka/ server.port: 9998 spring.application.name: payments db.url: 192.168.0.100 

这些配置的主要问题是服务设置中存在大量复制粘贴。 让我们看看该框架如何帮助摆脱它。 让我们从最显而易见的开始-每个微服务的描述中都存在eureka配置。 使用设置文件创建一个新目录,并向其中添加新配置:



在我们的每个项目中,我们现在将添加行#include eureka

该框架将自动找到eureka配置并将其复制到服务配置文件,而不会创建单独的eureka配置,因为我们不会在dev.yaml环境文件中指定它。 服务订单

 #include eureka server.port: 9999 spring.application.name: order db.url: 192.168.0.100 

通过将导入行更改为#include eureka,oracle,我们还可以在单​​独的配置中进行数据库设置。

值得注意的是,在框架配置文件的重新生成过程中,每次更改都会由框架监视,并放置在主配置文件旁边的特殊文件中。 他的日志中的条目如下所示:“存储的1属性更改为order / diff-application.yaml ”。 这使您可以快速检测大型配置文件中的更改。

删除配置的公共部分将使您摆脱许多不必要的复制粘贴,但又不允许您灵活地为各种环境创建配置-我们服务的端点是唯一的且经过硬编码,这很不好。 让我们尝试将其删除。

一个好的解决方案是将所有端点保持在其他端点可以引用的一种配置中。 为此,已将对占位符的支持引入了框架。 这是eureka配置文件的更改方式:

  client: serviceUrl: defaultZone: http://${endpoints@eurekaip}:6782/eureka/ 

现在让我们看看这个占位符是如何工作的。 系统找到一个名为终结点的组件,并在其中寻找eurekaip ,然后将其替换为我们的配置。 但是不同的环境呢? 为此,请以下类型application.dev.yaml的 端点中创建设置文件。 该框架通过文件扩展名独立地决定此配置所属的环境并加载该环境:



开发文件的内容:

 eurekaip: 192.89.89.111 dbip: 192.168.0.100 

我们可以为我们的服务端口创建相同的配置:

 server.port: ${ports@order}. 

所有重要的设置都在一个位置,从而减少了由于配置文件中分散的参数而导致错误的可能性。

该框架提供了许多现成的占位符,例如,您可以获取配置文件所在的目录的名称并为其分配:

 #include eureka, oracle server.port: ${ports@order} spring.application.name: ${this@name} 

因此,无需在配置中另外指定应用程序的名称,并且还可以将其移动到公共模块,例如,移至同一eureka:

 client: serviceUrl: defaultZone: http://${endpoints@eurekaip}:6782/eureka/ spring.application.name: ${this@name} 

订单配置文件将减少为一行:

 #include eureka, oracle server.port: ${ports@order} 

如果我们不需要父配置的任何设置,则可以在我们的配置中指定它,并将在生成过程中应用它。 也就是说,如果由于某种原因我们需要订购服务的唯一名称,只需保留spring.application.name参数即可。

假设您需要向服务添加自定义日志记录设置,这些设置存储在单独的文件中,例如logback.xml 。 为它创建一个单独的设置组:



在基本配置中,我们将使用@ConfigDir 占位符指示所需位置的日志设置文件的框架:

 microconfig.template.logback.fromFile: ${logback@configDir}/logback.xml 

logback.xml文件中, 我们配置标准附加程序,这些附加程序又可以包含占位符,框架将在生成配置时对其进行更改,例如:

 <file>logs/${this@name}.log</file> 

在服务配置中添加logback导入,我们自动获取每个服务的配置日志记录:

 #include eureka, oracle, logback server.port: ${ports@order} 

是时候更详细地了解所有可用的框架占位符了:

$ {this @ env} -返回当前环境的名称。
$ {... @名称} -返回组件的名称。
$ {... @ configDir} -返回组件的config目录的完整路径。
$ {... @ resultDir} -返回组件目标目录的完整路径(接收的文件将放置在此目录中)。
$ {this @ configRoot} -返回配置存储根目录的完整路径。

系统还允许您获取环境变量,例如,java的路径:
$ {env @ JAVA_HOME}
或者,由于该框架是用JAVA编写的,因此我们可以使用类似于下面的结构来获取类似于调用System :: getProperty的系统变量:
${system@os.name}
值得一提的是对Spring EL扩展语言的支持。 在配置中,类似的表达式适用:

 connection.timeoutInMs: #{5 * 60 * 1000} datasource.maximum-pool-size: #{${this@datasource.minimum-pool-size} + 10} 

并且您可以使用#var表达式在配置文件中使用局部变量:

 #var feedRoot: ${system@user.home}/feed folder: root: ${this@feedRoot} success: ${this@feedRoot}/archive error: ${this@feedRoot}/error 

因此,该框架是用于微服务的精细和灵活配置的相当强大的工具。 该框架完美地执行了其主要任务-消除设置中的复制粘贴,合并设置,从而最大程度地减少可能的错误,同时使组合配置和针对不同环境的更改变得容易。

如果您对此框架感兴趣,建议您访问其官方页面并阅读完整的文档 ,或在此处深入研究源代码。

Source: https://habr.com/ru/post/zh-CN473078/


All Articles