潍坊住房和城乡建设局网站,新品发布会英语,沧州网站营销推广,seo公司是什么图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站#xff0c;需要Docker、NodeJS、MongoDB#xff0c;这样的案例您见过吗#xff1f;如果对此有兴趣#xff0c;您就继续往下看吧。 在本系列中#xff0c;我们将构建一个 NodeJS 微服务#xff0c;并使用… 图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站需要Docker、NodeJS、MongoDB这样的案例您见过吗如果对此有兴趣您就继续往下看吧。 在本系列中我们将构建一个 NodeJS 微服务并使用 Docker Swarm 集群进行部署。 以下是我们将要使用的工具 NodeJS 版本 7.2.0MongoDB 3.4.1Docker for Mac 1.12.6 在尝试本指南之前您应该具备 NodeJS基础知识Docker的基本知识以及已安装的DockerMongoDB的基本知识以及正在运行的数据库服务。如果你不这样做我建议你按照我之前的文章如何使用Docker部署MongoDB副本集。 二、首先什么是微服务 微服务是一个独立的单元它与许多其他单元一起构成了一个大型应用程序。通过将应用拆分为小单元应用的每个部分都可以独立部署和扩展可以由不同的团队使用不同的编程语言编写并且可以单独测试。—马克斯·斯托伯 微服务体系结构意味着你的应用由许多较小的独立应用程序组成这些应用程序能够在自己的内存空间中运行并在可能许多单独的计算机上彼此独立缩放。 — 埃里克·艾略特 2.1 微服务的优势 应用程序启动速度更快从而提高开发人员的工作效率并加快部署速度。每个服务都可以独立于其他服务进行部署 — 更容易频繁地部署新版本的服务更易于扩展开发还可以具有性能优势。消除对技术堆栈的任何长期承诺。在开发新服务时您可以选择新的技术堆栈。微服务通常组织得更好因为每个微服务都有一个非常具体的作业并且不关心其他组件的作业。解耦服务也更容易重组和重新配置以满足不同应用的目的例如同时为 Web 客户端和公共 API 提供服务。 2.2 微服务的缺点 开发人员必须处理创建分布式系统的额外复杂性。部署复杂性。在生产中部署和管理由许多不同服务类型组成的系统也存在操作复杂性。在构建新的微服务体系结构时您可能会发现许多在设计时没有预料到的横切问题。 三、微服务的体系结构 影院微服务示例 让我们想象一下我们正在 Cinépolis一家墨西哥电影院的 IT 部门醒来他们给我们的任务是将他们的票务和杂货店从单片系统重组为微服务。 因此对于“构建 NodeJS 影院微服务”系列的第一部分我们将只关注电影目录服务。 在这个架构中我们看到我们有 3 种不同的设备使用微服务、POS销售点、手机/平板电脑和计算机其中 POS 和手机/平板电脑有自己的应用程序开发电子并直接消费微服务计算机通过 Web 应用程序访问微服务大师认为 Web 应用程序也像微服务一样。 四、构建微服务 好的让我们模拟一下我们将要求在我们最喜欢的电影院预订电影首映式。 首先我们想看看电影院目前有哪些电影。下图向我们展示了如何通过 REST 与微服务进行内部通信。 我们的电影服务 API 将具有以下 raml 规范 如果您不知道RAML是什么可以查看这个很棒的教程 API 项目的结构如下所示 - api/ # our apis
- config/ # config for the app
- mock/ # not necessary just for data examples
- repository/ # abstraction over our db
- server/ # server setup code
- package.json # dependencies
- index.js # main entrypoint of the app 好的让我们开始吧。要看的第一部分是 这里是我们对数据库进行查询的地方。repository. 您可能已经注意到我们为存储库连接连接的唯一公开方法提供了一个对象您可以在这里看到javascript具有“闭包”的最大功能之一存储库对象返回一个闭包其中每个函数都可以访问对象和对象对象保持数据库连接。在这里我们正在抽象我们正在连接的数据库类型存储库对象不知道数据库是哪种类型在我们的例子中是MongoDB连接即使它不必知道它是单个数据库还是副本集连接尽管我们使用mongodb语法但我们可以通过从固体原则中应用依赖反转原则来进一步抽象存储库功能 从将 mongo 语法带到另一个文件只需调用数据库操作的接口例如使用 Mongoose 模型。connectiondbcollectiondb 有一个用于测试此模块的文件我将在本文后面讨论测试但如果您想检查它可以在 github 存储库分支 step-1 中找到它。repository/repository.spec.js 我们要看的下一个文件是 .server.js 在这里我们要做的是实例化一个新的快速应用程序验证我们是否提供了存储库和服务器端口对象然后将一些中间件应用于我们的快速应用程序例如日志记录安全性和功能最后我们导出一个启动函数以便能够启动服务器。morganhelmeterror handling Helmet 包括多达 11 个软件包所有这些软件包都可以阻止恶意方破坏或使用应用程序伤害其用户。 如果你想强化微服务你可以查看这篇很棒的文章。 好的既然我们的服务器正在使用我们的movieAPI让我们继续检查文件movies.js 我们在这里做的是为我们的 API 创建路由并根据侦听的路由调用我们的 repo 函数如果你可以看到我们这里的 repo 使用的是接口技术方法这里我们使用著名的“为接口而不是实现编码”因为快速路由不知道是否有数据库对象 数据库查询逻辑等它只调用处理所有数据库问题的 repo 函数。 好的我们所有的文件都有与源代码相邻的单元测试让我们看看我们对movies.js 您可以将测试视为正在构建的应用程序的保护措施。它们不仅在本地计算机上运行还将在 CI 服务上运行以便失败的生成不会推送到生产系统。— Racing by RisingStack 要编写单元测试必须存根所有依赖项这意味着我们为模块提供假依赖项。让我们看看我们的spec files. 如您所见我们正在存根 的依赖项对于服务器我们正在验证是否需要提供服务器端口和存储库对象。movies API 可以在本文的 github 存储库中检查所有测试文件。 让我们继续如何创建我们传递给存储库模块的现在定义说每个微服务都有自己的数据库但对于我们的示例我们将使用 mongoDB 副本集服务器但每个微服务都有自己的数据库如果你现在不如何配置 mongoDB replset 服务器 您可以查看本文以获取更深入的解释。db connection object 如何使用Docker部署MongoDB副本集 本文将介绍如何使用 docker 设置具有身份验证的 MongoDB 副本集。 medium.com 以下是我们需要从 NodeJS 连接到 MongoDB 数据库的配置。 可能有很多更好的方法可以做到这一点但基本上我们可以创建一个与 mongoDB 的连接其中包含这样的副本集。 如您所见我们正在传递一个对象该对象具有 mongo 连接所需的所有参数并且我们正在传递一个对象该对象将在我们通过身份验证过程时发出该对象。optionsevent — mediatordb 注意*这里我使用的是事件发射器对象因为出于某种原因使用promise方法一旦通过身份验证它就不会返回db对象序列将变为空闲状态。— 所以这可能是一个很好的挑战看看发生了什么并尝试使用承诺方法。 现在由于我们正在为参数传递一个对象让我们看看它来自哪里所以下一个要查看的文件是optionsconfig.js 这是我们的配置文件大多数配置代码都是硬编码的但正如你所看到的一些属性使用环境变量作为一个选项。环境变量被视为最佳实践因为这可以隐藏数据库凭据、服务器参数等。 最后为我们的 API 编码的最后一步是将所有内容与movies-serviceindex.js. 在这里我们编写了所有电影 API 服务我们有一些错误处理然后我们加载配置启动存储库最后启动服务器。 因此到目前为止我们已经完成了与 API 开发有关的所有内容您可以在 step-1 分支中检查存储库。 如果你转到本文的 github 存储库你会看到有一些命令用于 npm install # setup node dependencies
npm test # unit test with mocha
npm start # starts the service
npm run node-debug # run the server in debug mode
npm run chrome-debug # debug the node with chrome
npm run lint # lint the code with standard 最后我们启动了第一个微服务并在本地运行执行命令但这不是文章标题所说的。npm start 现在是时候把它放在 Docker 容器中了正如我们在文章标题中提到的那样。 但首先我们需要的是拥有“使用 docker 创建 mongoDB 副本集”一文中的 Docker 环境如果您没有它则必须执行一些额外的修改步骤来为我们的微服务设置数据库这里有一些命令是最新的仅用于测试我们的电影服务。 因此首先让我们创建我们的 Dockerfile 来对我们的 NodeJS 微服务进行 docker化。 # Node v7 as the base image to support ES6
FROM node:7.2.0# Create a new user to our new container and avoid the root user
RUN useradd --user-group --create-home --shell /bin/false nupp \apt-get cleanENV HOME/home/nuppCOPY package.json npm-shrinkwrap.json $HOME/app/COPY src/ $HOME/app/srcRUN chown -R nupp:nupp $HOME/* /usr/local/WORKDIR $HOME/app
RUN npm cache clean \npm install --silent --progressfalse --productionRUN chown -R nupp:nupp $HOME/*
USER nuppEXPOSE 3000CMD [npm, start] 我们将 NodeJS 镜像作为 docker 镜像的基础然后我们创建一个用户以避免非 root 用户然后将 src 复制到我们的镜像然后我们安装依赖项我们公开一个数字端口最后我们实例化我们的电影服务。 接下来我们必须使用以下命令构建我们的 docker 映像 $ docker build -t movies-service . 让我们先看一下构建命令。 docker build告诉引擎我们要创建一个新映像。-t movies-service使用标记标记此图像。从现在开始我们可以通过标签引用此图像。movies-service.使用当前目录查找 .Dockerfile 在一些控制台输出之后我们在 NodeJS 应用程序中有了我们的新映像所以现在我们需要做的是使用以下命令运行我们的映像 $ docker run --name movie-service -p 3000:3000 -e DB_SERVERS192.168.99.100:27017 192.168.99.101:27017 192.168.99.100:27017 -d movies-service 在上面的命令中我们传递了一个 env 变量它是一个需要连接到 mongoDB replset 的服务器数组这只是为了说明有更好的方法可以做到这一点例如读取 env 文件。 现在我们已经启动并运行了我们的容器让我们检索我们的微服务的 ip并且我们准备对微服务进行集成测试另一个测试选项可能是 JMeter它是模拟 http 请求的好工具这里有一个很棒的 JMeter 教程。docker-machine ip machine-name 这是我们将检查 API 调用:D。integration-test 五、这时候回顾一下子 5.1 我们做了什么... 5.2 慢聊和沟通 我们只做了这个通信流程的第一部分我们制作了电影服务来咨询电影院中可用的电影首映我们在 NodeJS 中构建了电影服务 API首先我们使用 RAML 规范设计 API然后我们开始构建我们的 API并进行相应的单元测试最后我们编写所有内容以使我们的微服务完整 并能够启动我们的电影服务服务器。 然后我们将微服务放入Docker容器中以便能够进行一些集成测试。 我们已经在 NodeJS 中看到了很多开发但我们可以做和学习的还有很多这只是一个先睹为快的高峰。我希望这已经展示了一些有趣和有用的东西你可以在你的工作流程中用于Docker和NodeJS。 让我记住你这篇文章是“构建 NodeJS 电影微服务并使用 docker 部署它”系列的一部分。 我将在本系列的第 2 部分的延续链接下方放置。 未完见下文 六、参考信息 构建 NodeJS 影院微服务并使用 docker 部署它第 2 部分 这是✌️“构建 NodeJS 影院微服务”系列的第二篇文章。 6.1 完整的代码在Github上 您可以在以下链接中查看文章的完整代码。 Crizstian/cinema-microservice 影院微服务 - 影院微服务示例 github.com 6.2 延伸阅读 为了更好地使用NodeJS您可以查看此站点 10年成为更好的节点开发人员的2017个技巧NodeJS 教程系列 — Node Hero几乎涵盖了所有节点主题节点JS安全检查表NodeJS at Scale 6.3 # 参考资料 MongoDB NodeJS 驱动程序MongoDB NodeJS Driver legacy ConnectionAPI 工作台 — 使用 RAML 创建 API 定义模式微服务架构 克里斯蒂安·拉米雷斯