我想在分布式环境中部署我的 Spring Boot。一般来说,遵循的最佳做法是什么?
1.分布式环境的每个节点都有自己的application.properties
2.分布式环境的所有节点共享一个应用程序.properties
这是我的第一个 Spring Boot 项目,请不要因为这个问题杀了我:P
我想在分布式环境中部署我的 Spring Boot。一般来说,遵循的最佳做法是什么?
1.分布式环境的每个节点都有自己的application.properties
2.分布式环境的所有节点共享一个应用程序.properties
这是我的第一个 Spring Boot 项目,请不要因为这个问题杀了我:P
根据您的需要,可以有许多选项,有些是微不足道的,有些更复杂但更灵活。
一开始,您可以将配置保留在 Spring Boot 应用程序中,这当然不是理想的方式,但它非常简单。您可以将 application-local.properties、application-production.properties 等放在资源文件夹中,并使用您需要的环境的活动配置文件运行 spring boot 应用程序。
另一种更高级的设置是使用配置文件,但将其保留在应用程序之外。在这里,您将与应用程序分开部署此配置文件,这里有许多可能的选项,包括共享文件系统、自动部署等。您可以运行 spring boot 应用程序--spring.config.location=<path to configuration file>
现在,如果您想将配置保存在 git 存储库或文件系统中,并且您的组织中有许多微服务,那么管理它们就会变得一团糟。因此,在这种情况下,您可以检查配置服务器。Spring Boot 与配置服务器集成在一起,这是 Spring Cloud 项目的一部分。你可以在这里找到更多信息。
这是迄今为止最先进的设置 - 您甚至可以动态更改配置而不重新启动 spring boot 微服务(google for Refreshable beans in spring boot configuration)。此外,您可以将配置保存在 git 存储库中,它将自动能够使用它。
还有其他解决方案,可能与 Spring Boot 应用程序集成较少,但如果您已经在组织中使用它们,可以考虑:etc.d、consul 等。
通常,人们在进入 Spring Boot 世界时会从第一个或第二个选项开始,然后采用其中一个选项中的第三个选项。
我个人会尝试使用配置服务器:Centralized Configuration。基本上,您将配置文件保存在 git 存储库中,并在其上放置一个相对简单的 Spring Boot 应用程序,您的其他 Spring Boot 应用程序可以连接到该应用程序并请求配置。
此外,与执行器结合使用时,它还使您能够即时更改配置,而无需重新启动应用程序。
所有这两种策略:
这取决于你想要达到的目标。
在第一种情况下,我建议遵循 Single Host Per Service Pattern 并将您的 Spring Boot 应用程序作为 Docker 容器提供,然后将其部署在 AWS ECS、Kubernetes、Swarm 等编排器上,甚至为每个服务提供单个 VM 可能是一个解决方案,但我想这可能会很昂贵。
听到的好处是我们的应用程序无需其他开发工作即可使用,因为您在代码附近拥有所有配置,此模式中的任何配置更改都将是一个新的部署,它将在您的 docker 注册表上创建一个新的 docker 映像。通过这种方式,您可以防止配置漂移,并且所有和所有副本都将更新并保持一致,您可能会使用金丝雀部署或蓝绿色部署模式。
第二种策略让您拥有与 Cloud Foundry 和 Openshift 等许多 PAAS 类似的配置模式。所有应用程序副本将共享一个配置入口点。
在 Spring 与 Spring Cloud 的情况下,您可能会选择 Spring Cloud Configuration Server。在这种情况下,所有应用程序都会向服务器请求配置,可以通过嵌入式客户端发现服务器,该客户端将尝试检索配置,或者通过 Netflix Eureka 或 Consul 等发现服务系统。
这种情况下的好处是您可以动态扩展配置服务器的实例数量,将发现系统提供所有已注册的副本。在配置服务器的情况下,您可以受益于许多配置存储,例如文件系统、SVN、GIT 或最近的 JDBC。更重要的是,您可以受益于@RefreshScope
将 bean 创建为代理的特殊功能,并且您是否允许通过执行器端点 /actuator/refresh 使用最后一个 Spring Cloud (Finchley) 或 /refresh 使用以前的 Spring Cloud 版本重新刷新配置,甚至可以使用 Spring Cloud Bus 来传播 reshresh 事件。如果你使用zuul,路由会在发生变化和刷新时更新,这样你就可以用来实现蓝绿部署或金丝雀部署策略。
我希望它对你有用