Spring Cloud 的配置服务器功能使跨系统更新微服务变得轻而易举。让我们一步一步地设置和更改属性。
使用微服务,我们创建了一个中央配置服务器,其中微服务的所有可配置参数都是编写版本控制的。中央配置服务器的好处是,如果我们更改微服务的属性,它可以即时反映该属性,而无需重新部署微服务。
在微服务时代之前,我们创建了一个属性文件来维护我们的可配置参数,因此如果我们更改参数值或添加或删除参数,我们通常需要重新启动应用程序容器。此外,考虑环境。通常,我们有 Development、Staging 和 Prod,每个都有单独的 URL 用于不同的服务,如 JMS、JNDI 等。此外,如果环境发生变化,我们需要选择正确的属性文件。例如,对于开发,我们需要加载开发属性文件。Spring 提供了 Profile 概念,其中基于传递的配置文件,Spring 加载适当的环境属性。
就像配置文件值是dev一样,它会加载所有{}-dev.properties。
但主要问题是它与代码库绑定或静态打包,所以属性文件的任何更改都意味着重新构建和重新部署应用程序,这违反了微服务原则,其中明确指出:
只需构建一次并在任何环境中部署。
因此,不知何故,我们需要一种维护所有属性的技术,如果有任何属性发生更改,它将获取更改并反映它们,而无需重新构建或重新启动应用程序。
答案是 Spring Cloud 配置服务器。
配置服务器根据服务 ID 存储每个微服务属性。我们可以通过在微服务的 bootstrap.properties 文件中为 spring.Application.name 属性提供一个唯一值来配置微服务服务 ID。
假设我有一个员工工资单微服务。我可以在 Employee Payroll bootstrap.property 文件中创建如下服务 ID。
spring.application.name = EmployeePayroll。
现在,在配置服务器中,我们有一组基于环境的 Employee Payroll 属性文件,例如
EmployeePayroll-dev.properties
EmployeePayroll-stg.properties
EmployeePayroll-prod.properties
这些是基于配置文件价值的。
请注意,属性文件名应采用以下格式。
{ServiceID}-{profile}.properties。
如果我们没有在属性文件中给出配置文件名称,那么它被认为是默认的。在这里,EmployeePayroll-dev 是服务 ID,dev/stg/prod 是我们的环境。
REST 端点:每个微服务都需要与配置服务器通信,以便它可以解析属性值,因为所有属性都存储在 thre.xml 中。配置服务器发布一个 REST 端点,微服务通过该端点进行通信,或者我们可以在浏览器中查看属性。
Actuator:如果微服务的任何属性已更改,则意味着它们已通过 Actuator refresh REST 端点进行刷新。通过这样做,我们的微服务在没有重建应用程序的情况下得到了更新。
云总线:这是可选的,但非常有用。想想我们是否需要为每个服务手动刷新执行器端点。这将是一项繁重的任务,因为一个复杂的业务领域有许多微服务。在这种情况下,云总线有助于将更新的属性推送到其所有订阅的微服务。但是要触发这个动作,我们需要手动刷新一个微服务端点。稍后我会谈到云总线。
负载均衡器:配置服务器应该是高可用的。如果我们只维护一个配置服务器框/容器,那将是单点故障。理想情况下,它应该是负载平衡的,以便我们可以运行多个配置服务器实例,并且负载平衡器池应该有一个公共地址,每个微服务都可以在其中进行通信。
配置服务器架构图(不带负载均衡和云总线)
图片标题
现在我们将使用 Spring Cloud 创建一个配置服务器。
现在点击Generate Project按钮,它将下载代码模板。
之后,我提取代码模板,然后将该项目作为 Maven 项目导入 Eclipse。
如果打开 pom.xml,它将如下所示:
xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
com.example
MicroserviceCongigServer
0.0.1-SNAPSHOT
jar
MicroserviceCongigServer
Demo project for Spring Boot
org.springframework.boot
spring-boot-starter-parent
1.5.4.RELEASE
UTF-8
UTF-8
1.8
Dalston.SR1
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-config-server
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
现在打开com.example.MicroserviceCongigServer 包下的MicroserviceConfigServerApplication.JAVA 。
在类的顶部放置一个 @EnableConfigServer注释。通过这样做,我们告诉 Spring Boot 应用程序将其视为配置服务器模块。
MicroserviceConfigServerApplication.java
package com.example.MicroserviceConfigServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableConfigServer
public class MicroserviceConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceConfigServerApplication.class, args);
现在将应用程序属性重命名为bootstrap.properties并放入以下行
server.port=9090
spring.cloud.config.server.native.searchLocations=file://${user.home}/CentralRepo/
SPRING_PROFILES_ACTIVE=native
所以配置服务器在端口 9090 上运行,我们放置本地文件系统位置,以便配置服务器从它而不是 Git 获取属性文件。我们还告诉配置服务器这是一个本机配置文件。
至此,我们都准备好运行 MicroserviceConfigServerApplication.java。现在使用http://localhost:9090/config/default/master对其进行测试,我们可以看到以下响应:
"name":"config",
"profiles":[
"default"
],
"label":null,
"version":null,
"state":null,
"propertySources":[
"name":"file:///home/shamik/centralRepo/config.properties",
"source":{
"welcome.message":"Hello Spring Cloud"