在之前的文章(「GCTT 出品」Golang 中的微服务-第一部分,「GCTT 出品」Golang 中的微服务-第二部分-Docker 和 go-micro)中,我们介绍了 go-micro 和 Docker 的一些基础知识。在推出了这两项服务之后我们将在本文介绍 docker-compose、教大家如何更便捷地在本地运行多个服务,还会列述一些在本系列微服务教程中可以使用的数据库类型,最后引出本系列的第三项服务 —— User service。
(译者注:阅读本文之前建议先下载作者源码配合理解)
准备工作
安装 docker-compose: https://docs.docker.com/compose/install/
docker-compose 安装完毕之后,我们来介绍一些可用的数据库以及他们之间的区别。
数据库选择
在前两篇文章,我们的数据并不会持久化的存储到某地,它只会存储在我们服务的内存中,当容器重新启动时,这些数据会丢失。所以需要选择一种数据库来持久化的存储和查询我们的数据。
微服务的优点是,你可以为每个服务选择一个不同的数据库。当然许多情况下我们不必这样做。例如生产环境中的小团队完全不必选择多个数据库,这样会增加维护成本。但在某些情况下,一个服务的数据可能并不兼容其他服务的数据库,这时不得不增加一个数据库。微服务使得数据兼容这件事变得更加简单,你完全不必操心不同服务的数据使用不同的数据库带来的额外维护成本。
本文不会解释如何为你的服务选择“正确的”数据库,这是一个值得深入探究的话题,详情可以借鉴如何为你的服务选择“正确的”数据库。本文示例的数据持久化选择 NoSQL 文档存储解决方案,NoSQL 更适用于处理大量松散且不一致的数据集,例如 json 存储数据更加灵活,我会选择效果良好并且社区服务更加完善的 MongoDB 作为我们的 NoSQL。
如果需要处理的数据是被严格定义并且联系紧密,那么可以使用传统的关系型数据库(RDBMS),但实际上并非一定要这么做。在选择之前一定考虑我们服务的数据结构,它是做的读操作更多还是写操作更多?查询的复杂程度如何?等等。这些才是我们选择使用何种数据库的出发点。由于个人原因,关系数据库我更喜欢使用 Postgres,当然,你也可以使用 MySQL 或者 MariaDB 等等。
如果你不想亲自管理自己的数据库(通常是可取的),你可以选择使用亚马逊或者谷歌提供的完全成熟的 NoSQL 和 RDBMS 解决方案。除此之外 compose 则是另外一个非常棒的选择,你可以将自己的服务完全托管在 compose 上,它可以提供类似于亚马逊和谷歌的云服务,并且能够更加便捷的扩展各种数据库实例,同时还具备更低的延迟。
- 亚马逊:
- RDBMS:https://aws.amazon.com/rds/
- NoSQL:https://aws.amazon.com/dynamodb/
- 谷歌:
- RDBMS:https://cloud.google.com/spanner/
- NoSQL:https://cloud.google.com/datastore/
数据库相关知识讨论完毕之后我们就可以写一些代码了!
docker-compose
上一篇文章我们介绍了 Docker ,它可以用轻量级的容器运行我们的服务,并拥有自己独立的运行时间和依赖关系。但是服务数量较多的情景下使用单独的 Makefile 运行和管理每个服务太麻烦了。docker-compose应运而生,它很好的帮我们解决了这一问题。 Docker-compose 允许我们在 yaml 文件中定义 Docker 容器列表,并指定关于其运行时间的元数据。我们可以从 Docker-compose 中看到一些熟悉的 docker 命令的影子。例如:
在 docker-compose 里可以写为:
太简单了,不是吗?
接下来我们可以在根目录下创建一个 docker-compose 文件