当前位置: 首页 > news >正文

构建 NodeJS 影院微服务并使用 docker 部署【01/4】

图片来自谷歌 — 封面由我制作

一、说明

        构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。

        在本系列中,我们将构建一个 NodeJS 微服务,并使用 Docker Swarm 集群进行部署。

        以下是我们将要使用的工具:

  • NodeJS 版本 7.2.0
  • MongoDB 3.4.1
  • Docker for Mac 1.12.6

        在尝试本指南之前,您应该具备:

  • NodeJS基础知识
  • Docker的基本知识(以及已安装的Docker)
  • MongoDB的基本知识(以及正在运行的数据库服务。如果你不这样做,我建议你按照我之前的文章如何使用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 --progress=false --productionRUN chown -R nupp:nupp $HOME/*
USER nuppEXPOSE 3000CMD ["npm", "start"] 

        我们将 NodeJS 镜像作为 docker 镜像的基础,然后我们创建一个用户以避免非 root 用户,然后将 src 复制到我们的镜像,然后我们安装依赖项,我们公开一个数字端口,最后我们实例化我们的电影服务。

        接下来,我们必须使用以下命令构建我们的 docker 映像:

$ docker build -t movies-service . 

        让我们先看一下构建命令。

  1. docker build告诉引擎我们要创建一个新映像。
  2. -t movies-service使用标记标记此图像。从现在开始,我们可以通过标签引用此图像。movies-service
  3. .使用当前目录查找 .Dockerfile

        在一些控制台输出之后,我们在 NodeJS 应用程序中有了我们的新映像,所以现在我们需要做的是使用以下命令运行我们的映像:

$ docker run --name movie-service -p 3000:3000 -e DB_SERVERS="192.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 Connection
  • API 工作台 — 使用 RAML 创建 API 定义
  • 模式:微服务架构

克里斯蒂安·拉米雷斯

 

相关文章:

构建 NodeJS 影院微服务并使用 docker 部署【01/4】

图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。 在本系列中,我们将构建一个 NodeJS 微服务,并使用…...

变频器和plc之间无线MODBUS通讯

在工业现场由PLC远程控制变频器的应用非常常见,如果挖沟布线不便或者变频器在移动设备上,那么采用无线通讯就是最佳方案。 这里我们选用最常用的三菱 FX2N PLC和三菱变频器为例,并结合日系plc专用无线通讯终端DTD435M来说明PLC与变频器之间的…...

【云原生】3分钟快速在Kubernetes1.25部署Prometheus2.42+Grafana9.5.1+Alertmanager0.25

文章目录 1、简介2、GitHub地址3、环境信息4、安装5、访问Grafana1、简介 Prometheus-operator帮助我们快速创建Prometheus+Grafana+Alertmanager等服务,而kube-prometheus更加完整的帮助我们搭建全套监控体系,这包括部署多个 Prometheus 和 Alertmanager 实例, 指标导出器…...

Redis中常见的缓存穿透、缓存击穿、缓存雪崩、缓存预热解决方案

文章目录 一、缓存穿透1. 什么是缓存穿透2. 解决方案2.1 无效的key存放到Redis2.2 引入布隆过滤器2.3 如何选择: 二、缓存击穿1. 什么是缓存击穿2. 解决方案 三、缓存雪崩1. 什么是缓存雪崩2. 解决方案2.1 均匀过期2.2 热点数据缓存永远不过期2.3 采取限流降级的策略…...

第二章-自动驾驶卡车-自动驾驶卡车前装量产的要求

1、自动驾驶卡车的特点与挑战 重卡主要运行在相对封闭的高速公路,相较城市道路场景看似更简单。但是,由于重卡特有的物理特性、运行环境和商业运营要求,相较于乘用车的自动驾驶系统,重卡的自动驾驶系统对车辆的感知距离和精度、系…...

Midjourney API 申请及使用

Midjourney API 申请及使用 在人工智能绘图领域,想必大家听说过 Midjourney 的大名吧! Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作,只要简单输入绘图指令,这个神奇的工具就能在瞬间为我们呈现出对应的图…...

mysql mysql 容器 忽略大小写配置

首先能够连接上mysql,然后输入下面这个命令查看mysql是否忽略大小写 show global variables like %lower_case%; lower_case_table_names 0:不忽略大小写 lower_case_table_names 1:忽略大小写 mysql安装分为两种(根据自己的my…...

第58步 深度学习图像识别:Transformer可视化(Pytorch)

一、写在前面 (1)pytorch_grad_cam库 这一期补上基于基于Transformer框架可视化的教程和代码,使用的是pytorch_grad_cam库,以Bottleneck Transformer模型为例。 (2)算法分类 pytorch_grad_cam库中包含的…...

angular实现全局组件

之前我们实现全局组件的第一种方式。我们是在定义了组件的时候通过在declares:[component],然后exports出该组件。最后在页面中每次导入该组件,而这次我们将采用另一种方式来实现 1 新建公用组件: navbreadcrumbnavbreadcrumb.component.htmlnavbreadc…...

Spring编程模型(范式)

面向对象编程 契约接口:Aware aware:意识到的 契约接口(Aware)是Spring框架中的一个特性,它允许Bean对象意识到它们所在的环境并与之进行交互,用于提供特定的功能或信息给Bean对象。这些接口通常作为回调接口,在Bean初始化过程…...

Golang GORM 单表删除

删除只有一个操作,delete。也是先找到再去删除。 可以删除单条记录,也可以删除多条记录。 var s Studentdb.Debug().Delete(&s, "age ?", 100)fmt.Println(s)[15.878ms] [rows:1] DELETE FROM student WHERE age 100var s Studentdb.De…...

Windows 下 MySQL 源码学习环境搭建步骤【建议收藏】

【建议收藏】Windows 下如何安装最新版 MySQL 源码学习的调试环境步骤。 作者:芬达 《芬达的数据库学习笔记》公众号作者,开源爱好者,擅长 MySQL、ansible。 本文来源:原创投稿 爱可生开源社区出品,原创内容未经授权不…...

redis总复习

springboot基于redisson实现看门狗锁:Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】_springboot redission lock_AP0906424的博客-CSDN博客 springboot基于redis实现设置缓存和过期时间的代码?包括key的设计 https://mbd.baidu.com/ug_share…...

[LeetCode - Python]844. 比较;含退格的字符串(Easy);415. 字符串相加(Easy)

1.题目 844. 比较含退格的字符串(Easy) 1.代码: class Solution:def backspaceCompare(self, s: str, t: str) -> bool:# 暴力法s list(s)t list(t)M 0N 0for i in range(len(s)):i -M if s[i] # :if i > 0 :s.pop(i)s.pop(i-…...

机器学习深度学习——NLP实战(自然语言推断——注意力机制实现)

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——NLP实战(自然语言推断——数据集) 📚订阅专栏:机器学习&…...

mac垃圾清理软件有哪些

随着使用时间的增加,mac系统会产生一些垃圾文件,影响系统的性能和稳定性。为了保持mac系统的高效,用户需要定期使用mac垃圾清理软件来清理系统缓存、日志、语言包等无用文件。CleanMyMac是一款功能强大的mac垃圾清理软件,它可以帮…...

8.18 校招 内推 面经

绿泡泡: neituijunsir 交流裙,内推/实习/校招汇总表格 1、校招 | 小米集团2024届全球校园招聘正式启动(内推) 校招 | 小米集团2024届全球校园招聘正式启动(内推) 2、2023校招总结--软件测试岗位 - 2 2…...

docker的web管理平台docker.ui

docker.ui安装 docker run --name docker.ui \ -p 8999:8999 \ --restartalways \ -v /var/run/docker.sock:/var/run/docker.sock \ -d joinsunsoft/docker.ui参数说明: docker run:启动container–name:容器命名–restartalways&#xff…...

20230822 Windows上使用find_package引入OpenCV报错

报错信息 打开Cmake项目时,find_package 报错: Found OpenCV Windows Pack but it has no binaries compatible with yourconfiguration.You should manually point CMake variable OpenCV_DIR to your build of OpenCVlibrary.原因 大概率原项目是在 …...

MySQL下载安装配置

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

3D WEB轻量化引擎HOOPS产品助力NAPA打造船舶设计软件平台

NAPA(Naval Architectural PAckage,船舶建筑包),来自芬兰的船舶设计软件供应商,致力于提供世界领先的船舶设计、安全及运营的解决方案和数据分析服务。NAPA拥有超过30年的船舶设计经验,年营业额超过2560万欧…...

lesson9: C++多线程

1.线程库 1.1 thread类的简单介绍 C11 中引入了对 线程的支持 了&#xff0c;使得 C 在 并行编程时 不需要依赖第三方库 而且在原子操作中还引入了 原子类 的概念。要使用标准库中的线程&#xff0c;必须包含 < thread > 头文件 函数名 功能 thread() 构造一个线程对象…...

安卓修改SwitchCompat色值

SwitchCompat控件色值跟系统设置的主题有关&#xff0c;但是主题效果不是能轻易就能改的&#xff0c;因为涉及到整个APP的样式。网上方案基本都是通过修改style文件来改变色值&#xff0c;经过多次尝试修改最终觉得单独修改控件色值比较好。 一、控件属性 //修改开关色值就是最…...

pytorch内存泄漏

问题描述&#xff1a; 内存泄漏积累过多最终会导致内存溢出&#xff0c;当内存占用过大&#xff0c;进程会被killed掉。 解决过程&#xff1a; 在代码的运行阶段输出内存占用量&#xff0c;观察在哪一块存在内存剧烈增加或者显存异常变化的情况。但是在这个过程中要分级确认…...

20230821-字符串相乘-给树命名(unordered_map)

字符串相乘 有两个非负整数字符串num1&#xff0c;num2&#xff0c;计算num1和num2所表达整数的乘积&#xff0c;结果以字符串形式存储。注意:不能通过强制转换方法解题。 示例1&#xff1a; 输入&#xff1a; "4", "3" 输出&#xff1a; "12" …...

[Go版]算法通关村第十二关黄金——字符串冲刺题

目录 题目&#xff1a;最长公共前缀解法1&#xff1a;纵向对比-循环内套循环写法复杂度&#xff1a;时间复杂度 O ( n ∗ m ) O(n*m) O(n∗m)、空间复杂度 O ( 1 ) O(1) O(1)Go代码 解法2&#xff1a;横向对比-两两对比&#xff08;类似合并K个数组、合并K个链表&#xff09;复…...

neovim为工作区添加本地clangd配置

1 背景 尝试使用neovim开发stm32&#xff0c;使用clangd作为LSP提供代码补全等功能。 2 思路 使用stm32cubeMX生成一个基于makefile的stm32工程。 使用bear或compiledb基于makefile生成compile_commands.json文件。 为clangd配置--query-driver选项&#xff0c;使其使用arm…...

信号处理--基于EEG脑电信号的眼睛状态的分析

本实验为生物信息学专题设计小项目。项目目的是通过提供的14导联EEG 脑电信号&#xff0c;实现对于人体睁眼和闭眼两个状态的数据分类分析。每个脑电信号的时长大约为117秒。 目录 加载相关的库函数 读取脑电信号数据并查看数据的属性 绘制脑电多通道连接矩阵 绘制两类数据…...

Redis高可用:主从复制详解

目录 1.什么是主从复制&#xff1f; 2.优势 3.主从复制的原理 4.全量复制和增量复制 4.1 全量复制 4.2 增量复制 5.相关问题总结 5.1 当主服务器不进行持久化时复制的安全性 5.2 为什么主从全量复制使用RDB而不使用AOF&#xff1f; 5.3 为什么还有无磁盘复制模式&#xff…...

[Flutter]有的时候调用setState(() {})报错?

先看FlutterSDK的原生类State中有一个变量mounted。 abstract class State<T extends StatefulWidget> with Diagnosticable {/// mounted的作用是&#xff0c;此State对象当前是否在树中。/// 在创建State对象之后&#xff0c;在调用initState之前&#xff0c;框架通过…...

利用屏幕水印学习英语单词,无打扰英语单词学习

1、利用屏幕水印学习英语单词&#xff0c;不影响任何鼠标键盘操作&#xff0c;不影响工作 2、利用系统热键快速隐藏&#xff08;ALT1键 隐藏与显示&#xff09; 3、日积月累单词会有进步 4、软件下载地址: 免安装&#xff0c;代码未加密&#xff0c;安全的屏幕水印学习英语…...

开学必备物品清单!这几款优先考虑!

​马上就要开学了&#xff0c;同学们也要准备一系列开学用品&#xff0c;方便我们的学习生活&#xff0c;那有哪些数码物品可以在开学前准备的呢&#xff0c;接下来给大家安利几款很不错很实用的数码好物&#xff01; 推荐一&#xff1a;南卡00压开放式蓝牙耳机 南卡00压开放式…...

聊聊调制解调器

目录 1.什么是调制解调器 2.调制解调器的工作原理 3.调制解调器的作用 4.调制解调器未来发展 1.什么是调制解调器 调制解调器&#xff08;Modem&#xff09;是一种用于在数字设备和模拟设备之间进行数据传输的设备。调制解调器将数字数据转换为模拟信号进行传输&#xff0c;…...

Go语言入门指南:基础语法和常用特性(下)

上一节&#xff0c;我们了解Go语言特性以及第一个Go语言程序——Hello World&#xff0c;这一节就让我们更深入的了解一下Go语言的**基础语法**吧&#xff01; 一、行分隔符 在 Go 程序中&#xff0c;一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ;…...

【MFC常用问题记录】

MFC 记录 MFC的edit control控件显示1.控件添加变量M_edit后&#xff1a;2.控件ID为IDC_EDIT1: 线程函数使用 MFC的edit control控件显示 1.控件添加变量M_edit后&#xff1a; CString str; int x 10; str.Format(_T("%d"),x); M_edit.SetWindowText(str)2.控件ID…...

ThreadLocal内存泄漏问题

引子&#xff1a; 内存泄漏&#xff1a;是指本应该被GC回收的无用对象没有被回收&#xff0c;导致内存空间的浪费&#xff0c;当内存泄露严重时会导致内存溢出。Java内存泄露的根本原因是&#xff1a;长生命周期的对象持有短生命周期对象的引用&#xff0c;尽管短生命周期对象已…...

微服务基础概念【内含图解】

目录 拓展补充&#xff1a; 单体架构 分布式架构 面向服务的体系结构 云原生 微服务架构 什么是微服务&#xff1f; 微服务定义 拓展补充&#xff1a; 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;最终打成一个包部署 优点&#x…...

Dockerfile创建 LNMP 服务+Wordpress 网站平台

文章目录 一.环境及准备工作1.项目环境2.服务器环境3.任务需求 二.Linux 系统基础镜像三.docker构建Nginx1.建立工作目录上传安装包2.编写 Dockerfile 脚本3.准备 nginx.conf 配置文件4.生成镜像5.创建自定义网络6.启动镜像容器7.验证 nginx 四.docker构建Mysql1. 建立工作目录…...

消息中间件篇

消息中间件篇 RabbitMQ 如何保证消息不丢失 面试官&#xff1a; RabbitMQ如何保证消息不丢失 候选人&#xff1a; 嗯&#xff01;我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的&#xff0c;这里面就要求了消息的高可用性&#xff0c;我们要保证消息的不…...

基本定时器

1.简介 1. 基本定时器 TIM6 和 TIM7 包含一个 16 位自动重载计数器 2. 可以专门用于驱动数模转换器 (DAC), 用于触发 DAC 的同步电路 3. 16 位自动重载递增计数器 4. 16 位可编程预分频器 5. 计数器溢出时, 会触发中断/DMA请求 从上往下看 1.开始RCC供给定时器的时钟 RCC_APB1…...

MySQL 中文全文检索

创建索引&#xff08;MySQL 5.7.6后全文件索引可用WITH PARSER ngram&#xff0c;针对中文&#xff0c;日文&#xff0c;韩文&#xff09; ALTER TABLE 表 ADD FULLTEXT 索引名 (字段) WITH PARSER ngram;或者CREATE FULLTEXT INDEX 索引名 ON 表 (字段) WITH PARSER ngram; …...

Redis——list类型详解

概要 Redis中的list类型相当于双端队列&#xff0c;支持头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删&#xff0c;并且列表中的内容是可以重复的。 如果搭配使用rpush和lpop&#xff0c;那么就相当于队列 如果搭配使用rpush和rpop&#xff0c;那么就相当于栈 lpu…...

npm 安装 git 仓库包

安装 #v1.0.0 代表版本, 例如打了仓库一个tag叫v1.0.0; 如果不指定版本则默认是最新的代码 npm install githttp://mygitlab.xxxx.net/chengchongzhen/hex-event-track.git#v1.0.0在项目根目录执行以下命令, 此时你的代码会被链接到npm的全局仓库, 类似执行了 npm install xxx …...

问题来了!你知道你穿的防砸劳保鞋的保护包头都是什么材料

防砸劳保鞋是较为常见的一种劳保鞋&#xff0c;用于作业过程中保护工人的脚&#xff0c;减少或避免被坠落物、重物砸伤或压伤脚部的工作鞋。防砸安全鞋鞋前头装有防护包头&#xff0c;具有耐压力和抗冲击性能。主要适用于矿山、机械、建筑、钢铁、冶金、运输等行业。 你穿的防砸…...

计算机网络-物理层(三)编码与调制

计算机网络-物理层&#xff08;三&#xff09;编码与调制 在计算机网络中&#xff0c;计算机需要处理和传输用户的文字、图片、音频和视频&#xff0c;它们可以统称为消息 数据是运输信息的实体&#xff0c;计算机只能处理二进制数据&#xff0c;也就是比特0和比特1。计算机中…...

Linux面试笔试题(6)

91、6块300G的硬盘做raid5&#xff0c;新的设备容量是多大&#xff08;C&#xff09; A 900G B 1800G C 1500G D 300G 6300G−300G 1500G 由于一块硬盘用于奇偶校验&#xff0c;所以设备容量将是1500G. Raid 5是一种磁盘阵列&#xff0c;将数据分散到多个硬盘上以提高性能和可…...

qt中窗口的布局

qt中窗口的布局 常用的窗口布局方式使用拖拽控件的方式调用窗口布局使用Widget控件完成窗口布局布局中嵌套布局demo&#xff08;制作登录页面&#xff09; 如果不使用窗口布局&#xff0c;会带来的后果&#xff1a; 控件可能显示不出来不能按照期望的大小显示不能跟随窗口进行…...

玄子Share - HTML Emmet 语法详细介绍

玄子Share - HTML Emmet 语法详细介绍 以下Emmet语法 基于WebStorm 2023.2演示 Emmet 语法介绍 Emmet 是一种缩写语法&#xff0c;旨在简化 HTML 和 CSS 的编写。它基于 CSS 选择器的语法结构&#xff0c;通过输入特定的缩写&#xff0c;可以快速生成 HTML 结构。 Emmet 语法…...

Linux上安装和使用git到gitoschina和github上_亲测

Linux上安装和使用git到gitoschina和github上_亲测 git介绍与在linux上安装创建SSHkey在git-oschina使用maven-oschina使用在github使用maven-github使用组织与仓库 【git介绍与在linux上安装】 Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何…...

合宙Air724UG LuatOS-Air LVGL API--简介

为何是 LVGL LVGL 是一个开源的图形库&#xff0c;它提供了创建嵌入式 GUI 所需的一切&#xff0c;具有易于使用的图形元素、漂亮的视觉效果和低内存占用的特点。 LVGL特点&#xff1a; 强大的 控件 &#xff1a;按钮、图表、列表、滑动条、图像等 高级图形引擎&#xff1a;动…...