我多年来一直在开发单片应用程序,现在想尝试微服务和容器。
为了学习微服务和容器,我正在计划一个小型日历应用程序(作为一个网络应用程序),在那里你可以创建日期并邀请其他人参加。我确定了我必须实现的三项服务:
- 身份验证服务->处理登录,返回JWT
- UserData服务->处理注册,显示用户数据,处理用户数据的编辑(个人资料图片、姓名、简短描述)
- 日历服务->用于创建、编辑和删除日期、邀请他人参加日期、查看日期等
这是我有信心的部分,但如果我已经做错了什么,请纠正我。
我不确定该做什么的地方是如何实现数据库和前端部分。
数据库
我以前从未使用过Neo4j或任何基于图形的数据库,但它们似乎很适合这个用例,我想学习一些新的东西。也许我的数据库选择可能与此无关,但我的问题是:
每个微服务应该有自己的数据库,还是应该访问同一个数据库
有些数据集是连接的,比如每个日期都有一个创建者和多个参与者。
数据库应该在容器中运行,还是应该直接托管在服务器上?(我想自托管数据库)
为了存储个人资料图片,我决定使用共享容器卷,这样一个服务的多个实例就可以访问相同的文件。但我以前从未使用过集装箱,所以如果你有更好的想法,我很乐意听到
前端
我应该构建一个单一的(单片的)前端应用程序,还是构建某种微前端有用,它只包含导航并从上面定义的服务加载其他部分,如日历视图或用户数据视图?如果是,我应该将UserData前端和UserData服务打包到一个容器中吗?
MVP
我希望其他人可以使用整个应用程序,这样他们就可以将其安装在自己的服务器/云上。是否可以将整个应用程序(所有服务和前端)打包到一个包中,并通过一个步骤将其安装在kubernetes中,但在某种程度上,每个服务仍然有自己的容器?在我看来,这听起来很有必要,因为没有用户数据服务,日历服务就无法工作,因为每个日期都需要一个创建它的用户
其他可选服务
想象一下,我想添加一些额外但可选的功能,如实时聊天。检查是否安装了这些功能的最佳方法是什么?我应该添加一个管理服务来检查哪些服务存在,并告诉前端应该显示哪些导航链接,还是前端应用程序应该ping所有可能的服务以检查它们是否已安装?
我知道,这是很多问题,但我认为它们是联系在一起的,因为一方的选择会影响另一方。我期待着你的回答。
我比你走得更远,但离";微服务专家";。但我会尽力:
每个微服务都应该有自己的数据库,还是应该访问同一个数据库?
经验法则是微服务应该有自己的数据库。这使它们解耦,从而使服务之间的合同只是API。此外,它使服务中的逻辑更简单,因为服务负责处理的数据类型更少。
数据库应该在容器中运行,还是应该直接托管在服务器上?
我不喜欢在容器中运行数据库。一般来说,一个数据库:
- 可能会消耗大量资源(取决于查询)
- 维持长期连接
- 是指垂直缩放,而不是水平缩放
这些品质反映了集装箱化的糟糕情况。
为了存储个人资料图片,我决定使用共享容器卷
这没什么错,但使用像AmazonS3这样的云存储在这里很受欢迎,这样你就不必管理卷的状态了。也就是说,如果音量变小了,你还想把你的照片放在身边吗?
我应该构建一个单一的(单片的)前端应用程序吗?
我会说是的:这将是最简单的方法。微服务的另一大动机是允许独立的开发团队独立工作。如果这里不是这样的话,我认为你应该避免为微型前端而头疼。
如果是,我应该将UserData前端和UserData服务打包到一个容器中吗?
我不确定我是否完全理解这里。我认为将前端和后端服务作为同一代码库的一部分是可以的;"部署";在一起您希望如何服务前端完全取决于您以及它的实现方式。有些人喜欢通过CDN来提供服务,以最大限度地减少延迟,但我从未见过这种必要性。
是否可以将整个应用程序(所有服务和前端)打包到一个包中,并使其可以在kubernetes中安装,只需一步?
这是Helm charts的用例:kubernetes的包管理器。
想象一下,我想添加一些额外但可选的功能,如实时聊天。检查是否安装了这些功能的最佳方法是什么?我应该添加一个管理服务来检查哪些服务存在,并告诉前端应该显示哪些导航链接,还是前端应用程序应该ping所有可能的服务以检查它们是否已安装?
您所描述的内容和监控内容之间有一条细线。如果是我,我会选择辐射这些信息的服务,并在配置文件或其他文件中设置一些布尔值。这是因为在重新安装之前,这种状态不会改变,所以没有必要每隔一段时间检查一次。
--
这些都是我的想法,但就像所有建筑一样,没有普遍的真理。有时,根据您的实际情况,有例外情况。