基于 Spring Boot 和 Spring Cloud 和 Docker 的微服务架构项目实战
项目名称
piggymetrics
一键三连+评论,然后添加 VX(tkzl6666)即可获得《piggymetrics》的源码地址
项目简介
这是一个教程项目,演示了使用 Spring Boot,Spring Cloud 和 Docker 的微服务架构模式。顺便说一下,拥有漂亮的用户界面。
功能服务
PiggyMetrics 被分解为三个核心微服务。它们都是围绕某些业务领域组织的可独立部署的应用程序。
开户服务
包含一般用户输入逻辑和验证:收入/支出项目,储蓄和账户设置。
统计服务
对主要统计参数执行计算,并捕获每个账户的时间序列。数据点包含以标准化为基础货币和时间段的值。此数据用于跟踪账户生命周期中的现金流动态。
通知服务
存储用户的联系信息和通知设置(如提醒和备份频率)。计划工从其他服务收集所需的信息,并将电子邮件发送给订阅的客户。
笔记
每个微服务都有自己的数据库,因此无法绕过 API 并直接访问持久性数据。
在这个项目中,作者将 MongoDB 用作每个服务的主数据库。具有多语言持久性体系结构(选择最适合服务需求的 db 类型)也可能是有意义的。
服务到服务的通信已大大简化:微服务仅使用同步 REST API 进行通话。实际系统中的常见做法是使用交互样式的组合。例如,执行同步 GET 请求以检索数据,并通过消息代理使用异步方法进行创建/更新操作,以使服务和消息分离。但是,这将我们带到了最终的一致性世界。
基础设施服务
分布式系统中有一堆常见的模式,可以帮助我们使描述的核心服务正常工作。Spring Cloud 提供了功能强大的工具,这些工具可以增强 Spring Boot 应用程序的行为以实现这些模式。我会简单介绍一下。
配置服务
Spring Cloud Config 是用于分布式系统的水平可扩展的集中式配置服务。它使用当前可支持本地存储,Git 和 Subversion 的可插入存储库层。
在此项目中,我使用 native profile,它只是从本地类路径加载配置文件。您可以 shared 在 Config 服务资源中看到目录。现在,当 Notification-service 请求其配置时,Config 服务将使用
shared/notification-service.yml 和进行响应 shared/application.yml(在所有客户端应用程序之间共享)。
客户端使用
只要构建
spring-cloud-starter-config 依赖项的 Spring Boot 应用程序,其余的工作就由自动配置完成。
现在,您在应用程序中不需要任何嵌入式属性。只需提供 bootstrap.yml 应用程序名称和配置服务网址即可:
春季:
应用程序:
名称:通知服务
云:
配置:
uri:http:// config:8888
fail-fast:true
借助 Spring Cloud Config,您可以动态更改应用程序配置。
例如,EmailService bean 用注释 @RefreshScope。这意味着,您可以更改电子邮件文本和主题,而无需重建和重新启动 Notification Service 应用程序。
首先,更改配置服务器中的必需属性。然后,执行对通知服务的刷新请求: curl -H "Authorization: Bearer #token#" -XPOST
http://127.0.0.1:8000/notifications/refresh
另外,您可以使用 Repository webhooks 自动执行此过程
笔记
但是,对于动态刷新有一些限制。@RefreshScope 不适用于 @Configuration 类,也不影响 @Scheduled 方法
fail-fast 属性意味着如果 Spring Boot 应用程序无法连接到 Config Service,它将立即启动失败。
有显著的安全注意事项如下
验证服务
授权职责已完全提取到单独的服务器,该服务器为后端资源服务授予 OAuth2 令牌。Auth Server 用于用户授权以及外围内部安全的机器对机器通信。
在此项目中,我将 Password credentials 授予类型用于用户授权(因为仅用于本机 PiggyMetrics UI),而将 Client Credentials 授予类型用于微服务授权。
Spring Cloud Security 提供了方便的批注和自动配置,以使其在服务器和客户端均易于实现。您可以在文档中了解更多信息,并在 Auth Server 代码中查看配置详细信息。
从客户端来看,一切工作都与传统的基于会话的授权完全相同。您可以 Principal 从请求中检索对象,并使用基于表达式的访问控制和 @PreAuthorize 注释检查用户的角色以及其他内容。
PiggyMetrics 中的每个客户端(账户服务,统计服务,通知服务和浏览器)都有一个范围:server 后端服务,以及 ui-浏览器。因此,我们还可以保护控制器免受外部访问,例如:
@PreAuthorize(“#oauth2.hasScope( '服务器') ”)
@RequestMapping(值 = “账户/ {名称} ”,方法 = RequestMethod 。 GET)
公共 列表< 数据点 > getStatisticsByAccountName(@PathVariable 字符串名称){
返回 statisticsService 。findByAccountName(name);
}
API 网关
如您所见,有三个核心服务,它们向客户端公开外部 API。在现实世界的系统中,此数字以及整个系统的复杂性都可以非常迅速地增长。实际上,渲染一个复杂的网页可能涉及数百种服务。
从理论上讲,客户端可以直接向每个微服务发出请求。但是很明显,此选项存在挑战和局限性,例如必须知道所有端点地址,分别对每条信息执行 http 请求,将结果合并到客户端。另一个问题是可能在后端使用的非 Web 友好协议。
通常,更好的方法是使用 API网关。它是系统的单个入口点,用于通过将请求路由到适当的后端服务或调用多个后端服务并汇总结果来处理请求。此外,它还可用于身份验证,洞察力,压力和金丝雀测试,服务迁移,静态响应处理,主动流量管理。
Netflix 开源了这种边缘服务,现在有了 Spring Cloud,我们可以使用一个 @EnableZuulProxy 注释启用它。在这个项目中,我使用 Zuul 存储静态内容(ui 应用程序)并将请求路由到适当的微服务。这是通知服务的基于前缀的简单路由配置:
zuul:
路由:
通知服务:
路径:/ notifications / **
serviceId:通知服务
stripPrefix:false
这意味着所有以开头的请求/notifications 都将路由到 Notification Service。如您所见,没有硬编码的地址。Zuul 使用服务发现机制来定位 Notification 服务实例以及如下所述的 Circuit Breaker 和 Load Balancer。
服务发现
另一个众所周知的体系结构模式是服务发现。它允许自动检测服务实例的网络位置,由于自动缩放,故障和升级,该服务实例可以动态分配地址。
服务发现的关键部分是注册表。我在这个项目中使用 Netflix Eureka。当客户端负责确定可用服务实例的位置(使用注册表服务器)并在它们之间负载均衡请求时,Eureka 是客户端发现模式的一个很好的例子。
使用 Spring Boot,您可以轻松构建具有
spring-cloud-starter-eureka-server 依赖项,@EnableEurekaServer 注释和简单配置属性的 Eureka Registry 。
客户端支持已启用,并 @EnableDiscoveryClient 带有 bootstrap.yml 带有应用程序名称的注释:
春天:
应用程序:
名称:通知服务
现在,在应用程序启动时,它将向 Eureka Server 注册并提供元数据,例如主机和端口,运行状况指示器 URL,主页等。Eureka 从属于服务的每个实例接收心跳消息。如果心跳在可配置的时间表上进行故障转移,则该实例将从注册表中删除。
此外,Eureka 还提供了一个简单的界面,您可以在其中跟踪正在运行的服务和许多可用实例: http://localhost:8761
负载均衡器,断路器和 Http 客户端
Netflix OSS 提供了另一套很棒的工具。
色带
Ribbon 是客户端负载平衡器,可让您对 HTTP 和 TCP 客户端的行为进行大量控制。与传统的负载平衡器相比,无需每次通过线路调用都需要额外的约点-您可以直接联系所需的服务。
开箱即用,它与 Spring Cloud 和 Service Discovery 本地集成。Eureka Client 提供了可用服务器的动态列表,因此 Ribbon 可以在它们之间进行平衡。
Hystrix
Hystrix 是 Circuit Breaker 模式的实现,它可以控制通过网络访问的依赖项引起的延迟和故障。主要思想是在具有大量微服务的分布式环境中停止级联故障。这有助于快速故障并尽快恢复-自我修复的容错系统的重要方面。
除了断路器控制之外,使用 Hystrix,您还可以添加一个后备方法,如果主命令失败,该方法将被调用以获取默认值。
此外,Hystrix 会针对每个命令生成有关执行结果和延迟的度量,我们可以使用这些度量来监视系统行为。
假装
Feign 是一个声明性的 Http 客户端,它与 Ribbon 和 Hystrix 无缝集成。实际上,有了一个
spring-cloud-starter-feign 依赖项和 @EnableFeignCli
评论 (1 条评论)