1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 想知道spring boot+cloud+docker的微服务体系架构如何使用吗?

想知道spring boot+cloud+docker的微服务体系架构如何使用吗?

时间:2023-08-15 08:31:48

相关推荐

想知道spring boot+cloud+docker的微服务体系架构如何使用吗?

本文通过使用Spring Boot,Spring Cloud和Docker构建一个应用程序的示例,为了解常见的微服务架构模式提供了一个起点。

作为这个系统的基础,我选择了一个旧项目,其后端曾经是一个整体。该应用程序提供了一种处理个人财务,组织收入和支出,管理储蓄,分析统计数据和创建简单预测的方法。

功能服务

整体应用程序被分解为三个核心微服务。所有这些都是可独立部署的应用程序,围绕某些业务功能组织。

帐户服务

包含一般用户输入逻辑和验证:收入/费用项目,帐户设置。

统计服务

对主要统计参数执行计算并捕获每个帐户的时间序列。数据点包含标准化基本货币和时间段的值。此数据可用于跟踪帐户生命周期中的现金流动态。

通知服务

存储用户的联系信息和通知设置(如提醒和备份频率),工作人员从其他服务收集所需信息,并向订阅客户发送电子邮件。

笔记

每个微服务都有自己的数据库,因此无法绕过API直接访问数据。

对于这个项目,我使用MongoDB作为每个服务的主数据库。

服务到服务的通信非常简单:微服务只使用同步REST API进行通信。在实际系统中常见的实践是使用组合。例如,执行同步GET请求来检索数据,并通过Message broker为创建/更新操作使用异步方法,以便解耦服务和缓冲区消息,这给我们带来了最终的一致性。

基建服务

Spring cloud提供了强大的工具,可以增强Spring引导应用程序的行为来实现这些模式。请看下图

配置服务

它使用一个可插入的存储库层,目前支持本地存储、Git和Subversion。

在这个项目中,我使用本机配置文件,它只是从本地类路径加载配置文件。您可以在配置服务资源中看到shareddirectory。现在,当notificationservice请求它的配置时,配置服务将使用共享/ notificationservice响应。yml和共享/应用程序。yml(在所有客户机应用程序之间共享)。

客户端使用

只需使用Spring -cloud-starter-config依赖项构建Spring引导应用程序,剩下的工作将由autoconfiguration完成。

现在,您不需要在应用程序中嵌入任何属性。只是提供引导。带有应用程序名称和配置服务url的yml:

使用Spring Cloud Config,您可以动态更改应用程序配置

这意味着您可以更改电子邮件文本和主题行,而无需重新构建和重新启动通知服务应用程序。

首先,更改配置服务器中所需的属性。然后,对通知服务执行刷新请求:

curl -H "Authorization: Bearer #token#" -XPOST http://127.0.0.1:8000/notifications/refresh

您还可以使用webhook来自动化这个过程。

笔记

不过,动态刷新也有一些限制。@RefreshScope不能使用@Configuration类,也不能影响@Scheduled方法。

fail-fast属性意味着,如果Spring引导应用程序不能连接到配置服务,那么它将立即启动失败。在一起启动所有应用程序时,这非常有用。

下面有一些重要的安全注意事项。

验证服务

授权验证被完全提取到单独的服务器,该服务器为后端资源服务授予OAuth2令牌。Auth Server用于用户授权以及周边内部的安全机器到机器通信。

在这个项目中,我使用Passwordcredentials授权类型进行用户授权(因为它仅由本机应用程序UI使用),并Client Credentials用作微服务授权的授权类型。

Spring Cloud Security提供方便的注释和自动配置,使服务器和客户端都能轻松实现。您可以在文档中了解有关它的更多信息,并检查Auth Server代码中的配置详细信息。

从客户端来看,一切都与传统的基于会话的授权完全相同。您可以Principal从请求中检索对象,使用基于表达式的访问控制和@PreAuthorize注释检查用户角色和其他内容。

PiggyMetrics中的每个客户端(帐户服务,统计服务,通知服务和浏览器)都有一个范围:server用于后端服务,以及ui-用于浏览器。因此,我们还可以保护控制器免受外部访问,例如:

API网关

实际上,渲染一个复杂的网页可能涉及数百种服务。

理论上,客户端可以直接向每个微服务发出请求。但显然这个选项存在挑战和局限,例如必须知道所有端点地址,分别对每个信息和平执行http请求,在客户端合并结果。另一个问题是非网络友好协议,可能会在后端使用。

通常,更好的方法是使用API网关。它是系统的单一入口点,用于通过将请求路由到适当的后端服务或通过调用多个后端服务并聚合结果来处理请求。此外,它还可用于身份验证,洞察,压力和金丝雀测试,服务迁移,静态响应处理,主动流量管理。

Netflix开源了这样的优质服务,现在使用Spring Cloud,我们可以通过一个@EnableZuulProxy注释启用它。在这个项目中,我使用Zuul存储静态内容(UI应用程序)并将请求路由到适当的微服务。以下是Notification服务的简单基于前缀的路由配置:

这意味着所有以/ Notification开头的请求都将路由到Notification service,如您所见,这里没有硬编码地址。Zuul使用服务发现机制来定位通知服务实例,以及断路器和负载均衡器。

服务发现

另一个常见的体系结构模式是服务发现。它允许自动检测服务实例的网络位置,由于自动伸缩、故障和升级,服务实例可以动态分配地址。

服务发现的关键部分是注册表。我在这个项目中使用了Netflix的Eureka。当客户端负责确定可用服务实例的位置(使用注册表服务器)并在它们之间平衡负载请求时,Eureka是客户端发现模式的一个很好的例子。

使用Spring Boot,您可以使用Spring -cloud-starter- Eureka -server依赖项、@EnableEurekaServer注释和简单的配置属性轻松构建Eureka注册表。

通过@EnableDiscoveryClient注释和bootstrap.yml应用程序名称启用客户端支持:

现在,在应用程序启动时,它将注册到Eureka服务器并提供元数据,如主机和端口、指示器URL、主页等。Eureka从属于服务的每个实例接收心跳消息。如果heartbeat在可配置的时间表上失败,则将从注册表中删除该实例。

此外,Eureka提供了一个简单的接口,您可以在其中跟踪正在运行的服务和可用实例的数量:http://localhost:8761

负载均衡器,断路器和HTTP客户端

Netflix OSS提供了另一套很棒的工具。

Ribbon

Ribbon是一个客户端负载均衡器,可以让您对HTTP和TCP客户端的行为进行大量控制。

开箱即用,它本身与Spring Cloud和ServiceDiscovery集成。Eureka Client提供可用服务器的动态列表,因此Ribbon可以在它们之间取得平衡。

Hystrix

Hystrix是断路器模式的实现,它提供了对通过网络访问的依赖项造成的延迟和故障的控制。其主要思想是在具有大量微服务的分布式环境中停止级联故障,这有助于快速找出错误并尽快恢复——这是自修复容错系统的重要方面。

除了断路器控制之外,使用Hystrix还可以添加一个回退方法,当主命令失败时,将调用该方法获取默认值。

此外,Hystrix为每个命令生成关于执行结果和延迟的度量,我们可以使用这些度量来监视系统行为。

Feign

Feign是一个声明式HTTP客户机,它与Ribbon和Hystrix无缝集成。实际上,使用spring-cloud-start -佯装依赖项和@EnableFeignClients注释,您就拥有了一套完整的负载平衡器、断路器和HTTP客户机,以及一个合理的现成默认配置。

下面是来自Account Service的一个例子:

你所需要的只是一个界面

您可以在Spring MVC控制器和Feign方法之间共享@RequestMapping部分

上面的示例指定了所需的服务id - statistics-service,这多亏了通过Eureka自动发现(但显然您可以使用特定的ur访问任何资源)

监控仪表板

在这个项目配置中,每个带有Hystrix的微服务都通过Spring云总线(带有AMQP代理)将指标推送到监控台。监视项目只是一个带有Hystrix仪表板的小型Spring启动应用程序。

让我们看看负载下的系统行为:Account服务调用统计服务,而它的响应具有不同的模拟延迟。响应超时阈值设置为1秒。

日志分析

Elasticsearch、Logstash和Kibana堆栈允许您轻松地搜索和分析日志、利用率和网络活动数据。我的另一个项目描述了就绪Docker配置。

安全

高级安全配置超出了此概念验证项目的范围。要更真实地模拟真实系统,请考虑使用https和JCE密钥库来加密微服务密码和配置服务器属性内容。

构建自动化

与部署整体应用程序相比,部署微服务具有相互依赖性,这是一个复杂得多的过程。拥有完全自动化的基础架构非常重要。我们可以通过持续交付方法获得以下好处:

随时发布软件的能力。

任何构建都可能最终成为一个版本。

构建工件一次,根据需要进行部署。

这是一个简单的Continuous Delivery工作流程,在此项目中实施:

在此配置中,Travis CI为每个成功的Git推送构建标记图像。因此,Docker Hub上的每个微服务始终都有一个映像,旧映像使用Git commit hash进行标记。如果需要,可以轻松部署其中任何一个并快速回滚。

如何运行所有的东西?

这真的很容易,我建议你试试。请记住,您将启动8个Spring Boot应用程序,4个MongoDB实例和RabbitMq。确保您4 Gb的计算机上有可用的RAM。您始终可以通过网关,注册表,配置,身份验证服务和帐户服务运行重要服务。

在你开始之前

安装Docker和Docker组合。

导出环境变量:CONFIG_SERVICE_PASSWORD、NOTIFICATION_SERVICE_PASSWORD、STATISTICS_SERVICE_PASSWORD、ACCOUNT_SERVICE

生产模式

在此模式下,所有最新镜像都将从Docker Hub中提取。只需复制docker-compose.yml并点击即可docker-compose up -d

发展模式

如果您想自己构建映像(例如,代码中有一些更改),则必须使用Maven克隆所有存储库并构建代码。然后, run:docker-compose-f docker-compose.yml -f docker-compose.dev.yml up -d

docker-compose.dev.yml继承docker-compose.yml了在本地构建映像的额外可能性,并公开所有容器端口以便于开发。

重要的端口

localhost:80 - 网关

localhost:8761 - Eureka Dashboard

localhost:9000 - Hystrix仪表板

localhost:8989 - 监控(Hystrix仪表板的来源)

localhost:15672 - RabbitMq管理

笔记

所有Spring Boot应用程序都需要运行Config Server才能启动。但是我们可以同时启动所有容器,因为fail-fastSpringBoot属性和restart: alwaysdocker-compose选项。这意味着所有相关容器都将尝试重新启动,直到ConfigServer启动并运行。

长按二维码▲

订阅「架构师小秘圈」公众号

如有启发,帮我点个在看,谢谢↓

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。