本文通过使用Spring Boot,Spring Cloud和Docker构建的概念验证应用程序的示例,为了解常见的微服务架构模式提供了一个起点。
该代码在Github上可用,并且可以在Docker Hub上获得图像。只需一个命令即可启动整个系统。
作为这个系统的基础,我选择了一个旧项目,其后端曾经是一个整体。该应用程序提供了一种处理个人财务,组织收入和支出,管理储蓄,分析统计数据和创建简单预测的方法。
功能服务整体应用程序被分解为三个核心微服务。所有这些都是可独立部署的应用程序,围绕某些业务功能组织。
帐户服务包含一般用户输入逻辑和验证:收入/费用项目,节省和帐户设置。
METHOD PATH DESCRIPTION USER AUTHENTICATED AVAILABLE FROM UIGET /accounts/{account} Get specified account data
GET /accounts/current Get current account data × ×
GET /accounts/demo Get demo account data (pre-filled incomes/expenses items, etc) ×
PUT /accounts/current Save current account data × ×
POST /accounts/ Register new account
统计服务
对主要统计参数执行计算并捕获每个帐户的时间序列。数据点包含标准化为基本货币和时间段的值。此数据可用于跟踪帐户生命周期中的现金流动态。
METHOD PATH DESCRIPTION USER AUTHENTICATED AVAILABLE FROM UIGET /statistics/{account} Get specified account statistics
GET /statistics/current Get current account statistics × ×
GET /statistics/demo Get demo account statistics ×
PUT /statistics/{account} Create or update time series datapoint for specified account
通知服务
存储用户的联系信息和通知设置(如提醒和备份频率)。计划工作人员从其他服务收集所需信息,并向订阅客户发送电子邮件。
METHOD PATH DESCRIPTION USER AUTHENTICATED AVAILABLE FROM UIGET /notifications/settings/current Get current account notification settings × ×
PUT /notifications/settings/current Save current account notification settings × ×
注意
每个微服务都有自己的数据库,因此无法绕过API并直接访问持久性数据。
对于这个项目,我使用MongoDB作为每个服务的主数据库。拥有多语言持久性体系结构(以便选择最适合服务要求的数据库类型)也是有意义的。
服务到服务通信非常简单:微服务仅使用同步REST API进行通信。现实世界系统中的常见做法是使用交互方式的组合。例如,执行同步GET请求以检索数据并通过Message broker使用异步方法进行创建/更新操作,以便解耦服务和缓冲消息。这带给我们 。
基建服务分布式系统中有许多常见模式,可以帮助我们使所描述的核心服务工作。Spring cloud 提供了强大的工具,可以增强Spring Boot应用程序的行为以实现这些模式。我简要介绍一下:
配置服务Spring Cloud Config 是分布式系统的水平可扩展集中配置服务。它使用可插入的存储库层,目前支持本地存储,Git和Subversion。
在这个项目中,我使用 native profile,它只是从本地类路径加载配置文件。你可以在Config服务资源中查看 share 目录 。现在,当Notification-service请求它的配置时,使用shared/notification-service.yml 和 配置服务响应 shared/application.yml (在所有客户端应用程序之间共享)。
客户端使用只需构建具有spring-cloud-starter-config 依赖性的Spring Boot应用程序 ,自动配置将完成剩下的工作。