使用 Node.js、K8s 和分布式 SQL 构建世界上最具弹性的待办事项列表应用程序

news2024/11/25 22:29:08

本文演示了如何使用 Kubernetes (K8s) 和分布式 SQL 构建云原生 Node.js 应用程序。

开发可扩展且可靠的应用程序是一项热爱的工作。一个云原生系统可能包括单元测试、集成测试、构建测试,以及用于构建和部署应用程序的完整管道,只需单击一个按钮即可。

可能需要一些中间步骤才能交付可靠的产品。随着分布式和容器化的应用程序涌入市场,像Kubernetes这样的容器编排工具也是如此。Kubernetes 允许我们跨节点集群构建分布式应用程序,具有容错、自我修复和负载平衡——以及许多其他功能。

让我们通过在 Node.js 中构建一个由 YugabyteDB分布式 SQL数据库支持的分布式待办事项列表应用程序来探索其中的一些工具。

入门

生产部署可能会涉及设置完整的CI/CD 管道,以将容器化构建推送到 Google Container Registry,以便在Google Kubernetes Engine或类似的云服务上运行。

出于演示目的,让我们专注于在本地运行类似的堆栈。我们将开发一个简单的 Node.js 服务器,它被构建为一个 docker 镜像,可以在我们机器上的 Kubernetes 上运行。

我们将使用此 Node.js 服务器连接到 YugabyteDB 分布式 SQL 集群并从休息端点返回记录。

安装依赖

我们首先安装一些依赖项来构建和运行我们的应用程序。

  1. Docker桌面

    • Docker 用于构建容器映像,我们将在本地托管这些映像。

  1. Minikube

    • 创建一个本地 Kubernetes 集群来运行我们的分布式应用程序

YugabyteDB托管

接下来,我们创建一个YugabyteDB托管帐户并在云中启动一个集群。YugabyteDB 与 PostgreSQL 兼容,因此您也可以在其他地方运行 PostgreSQL 数据库,或者如果需要,可以在本地运行 YugabyteDB。

为了实现高可用性,我创建了一个在 AWS 上运行的 3 节点数据库集群,但出于演示目的,一个免费的单节点集群运行良好。

播种我们的数据库

一旦我们的数据库在云中启动并运行,就可以创建一些表和记录了。YugabyteDB Managed 有一个云外壳,可用于通过网络浏览器进行连接,但我选择在本地计算机上使用 YugabyteDB客户端外壳。

在连接之前,我们需要从云控制台下载根证书。

我创建了一个 SQL 脚本用于创建一个todos表和一些记录。

CREATE TYPE todo_status AS ENUM ('complete', 'in-progress', 'incomplete');

CREATE TABLE todos (
   id serial PRIMARY KEY,
   description varchar(255),
   status todo_status
);

INSERT INTO
   todos (description, status)
VALUES
   (
       'Learn how to connect services with Kuberenetes',
       'incomplete'
   ),
   (
       'Build container images with Docker',
       'incomplete'
   ),
   (
       'Provision multi-region distributed SQL database',
       'incomplete'
   );

我们可以使用此脚本为我们的数据库播种。 

> ./ysqlsh "user=admin \
host=<DATABASE_HOST>  \
sslmode=verify-full \
sslrootcert=$PWD/root.crt" -f db.sql

为我们的数据库播种后,我们就可以通过 Node.js 连接到它了。

构建 Node.js 服务器

使用 node-postgres 驱动程序连接到我们的数据库很简单。YugabyteDB 在此库之上构建了 YugabyteDB Node.js智能驱动程序,该驱动程序具有解锁分布式 SQL 功能的附加功能,包括负载平衡和拓扑感知。

> npm install express
> npm install @yugabytedb/pg
const express = require("express");
const App = express();
const { Pool } = require("@yugabytedb/pg");
const fs = require("fs");

let config = {
 user: "admin",
 host: "<DATABASE_HOST>",
 password: "<DATABASE_PASSWORD>",
 port: 5433,
 database: "yugabyte",
 min: 5,
 max: 10,
 idleTimeoutMillis: 5000,
 connectionTimeoutMillis: 5000,
 ssl: {
   rejectUnauthorized: true,
   ca: fs.readFileSync("./root.crt").toString(),
   servername: "<DATABASE_HOST>",
 },
};
const pool = new Pool(config);


App.get("/todos", async (req, res) => {
 try {
   const data = await pool.query("select * from todos");
   res.json({ status: "OK", data: data?.rows });
 } catch (e) {
   console.log("error in selecting todos from db", e);
   res.status(400).json({ error: e });
 }
});
App.listen(8000, () => {
 console.log("App listening on port 8000");
});

容器化我们的 Node.js 应用程序

要在Kubernetes中运行我们的 Node.js 应用程序,我们首先需要构建一个容器镜像。在同一目录中创建一个 Dockerfile。

FROM node:latest
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 8000
ENTRYPOINT [ "npm", "start" ]

我们所有的服务器依赖项都将构建到容器映像中。要使用该命令运行我们的应用程序,请使用启动脚本npm start更新您的文件。package.json

…
"scripts": {
  "start": "node index.js"
}
…

现在,我们已准备好使用 Docker 构建我们的镜像。

> docker build -t todo-list-app .  
Sending build context to Docker daemon  458.4MB
Step 1/6 : FROM node:latest
 ---> 344462c86129
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> 49f210e25bbb
Step 3/6 : COPY . .
 ---> Using cache
 ---> 1af02b568d4f
Step 4/6 : RUN npm install
 ---> Using cache
 ---> d14416ffcdd4
Step 5/6 : EXPOSE 8000
 ---> Using cache
 ---> e0524327827e
Step 6/6 : ENTRYPOINT [ "npm", "start" ]
 ---> Using cache
 ---> 09e7c61855b2
Successfully built 09e7c61855b2
Successfully tagged todo-list-app:latest

我们的应用程序现已打包并准备好在 Kubernetes 中运行。

使用 Minikube 在本地运行 Kubernetes

要在本地运行 Kubernetes 环境,我们将运行 Minikube,它会在我们机器上运行的 Docker 容器内创建一个 Kubernetes 集群。

> minikube start

那很简单!现在我们可以使用kubectl命令行工具从 Kubernetes 配置文件部署我们的应用程序。

部署到 Kubernetes

首先,我们创建一个名为的配置文件kubeConfig.yaml,它将定义集群的组件。Kubernetes 部署用于保持 pod 运行和最新。todo-app在这里,我们正在创建一个运行我们已经用 Docker 构建的容器的节点集群。

apiVersion: apps/v1
kind: Deployment
metadata:
 name: todo-app-deployment
 labels:
   app: todo-app
spec:
 selector:
   matchLabels:
     app: todo-app
 replicas: 3
 template:
   metadata:
     labels:
       app: todo-app
   spec:
     containers:
       - name: todo-server
         image: todo
         ports:
           - containerPort: 8000
         imagePullPolicy: Never

在同一个文件中,我们将创建一个 Kubernetes 服务,用于为您的应用程序设置网络规则并将其公开给客户端。 

---
apiVersion: v1
kind: Service
metadata:
 name: todo-app-service
spec:
 type: NodePort
 selector:
   app: todo-app
 ports:
   - name: todo-app-service-port
     protocol: TCP
     port: 8000
     targetPort: 8000
     nodePort: 30100

 

让我们使用我们的配置文件来创建我们的todo-app-deploymentand todo-app-service。这将创建一个网络化的集群,对故障具有弹性并由 Kubernetes 编排! 

> kubectl create -f kubeConfig.yaml

 

在 Minikube 中访问我们的应用程序

> minikube service todo-app-service --url    
Starting tunnel for service todo-app-service.
因为你在 darwin 上使用 Docker 驱动程序,所以需要打开终端才能运行它。

我们可以通过执行以下命令找到隧道端口。

> ps -ef | grep docker@127.0.0.1
  503  2363  2349   0  9:34PM ttys003    0:00.01 ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -N docker@127.0.0.1 -p 53664 -i /Users/bhoyer/.minikube/machines/minikube/id_rsa -L 63650:10.107.158.206:8000

输出表明我们的隧道在端口 63650 上运行。我们可以通过浏览器中的/todos此URL或通过客户端访问我们的端点。

> curl -X GET http://127.0.0.1:63650/todos -H 'Content-Type: application/json'
{"status":"OK","data":[{"id":1,"description":"Learn how to connect services with Kuberenetes","status":"incomplete"},{"id":2,"description":"Build container images with Docker","status":"incomplete"},{"id":3,"description":"Provision multi-region distributed SQL database","status":"incomplete"}]}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/651699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】第二章应用层-电子科技大学2023期末考试

第二章 应用层 应用层协议原理 网络应用程序体系结构 客户机/服务器体系结构&#xff1a;至少有一个服务器&#xff0c;一个客户机&#xff0c;其中服务器总是打开的&#xff0c;具有固定的众所周知的IP地址&#xff0c;主机群集常被用于创建强大的虚拟服务器&#xff0c;而客…

【Trino实战】Trino下ORC与Parquet查询性能分析

Trino下ORC与Parquet查询性能分析 环境 OS&#xff1a;CentOS 6.5 JDK&#xff1a;1.8 内存&#xff1a;256G 磁盘&#xff1a;HDD CPU&#xff1a;Dual 8-core Intel Xeon CPU (32 Hyper-Threads) E5-2630 v3 2.40GHz HDFS&#xff1a;2.9.2 Hive&#xff1a;2.3.9 T…

[n00bzCTF 2023] CPR 全

Crypto AES 给了java的加密原码&#xff0c;AES加密&#xff0c;有key import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; import java.n…

arima模型原理及实战

目录 1&#xff0c;概念 2&#xff0c;数学知识 3&#xff0c;前提条件 4&#xff0c;序列不平稳时的平稳性方法 5&#xff0c;模型定阶&#xff0c;确定P和Q 6&#xff0c;模型训练与检验 1&#xff0c;概念 ARIMA模型&#xff08;英语&#xff1a;Autoregressive Integr…

grep及文本处理命令

正则表达式 一.基础命令 1.grep命令 对文本的内容进行过滤&#xff0c;针对行处理 1.1grep格式 grep [选项]…查找条件 目标文件 1.2grep命令选项 -m数字——————匹配几次后停止eg&#xff1a;grep -m 1 root /etc/passwd————————————多个匹配只取 -v …

【编程语言 · C语言 · 递归函数】

递归函数 C 语言的函数都支持递归, 也就是说&#xff0c;每个函数都可以直接或者间接第调用自己。所谓的间接调用&#xff0c;是指在递归函数调用的下层函数中再调用自己。 递归关系图如下&#xff1a; 递归之所以能实现&#xff0c;是因为函数的每个执行过程在栈中都有自己的…

深入理解 SpringBoot 日志框架:从入门到高级应用——(三)Logback 输出日志到 MySQL 数据库

文章目录 添加依赖导入 SQL 文件配置 logback-spring.xml运行结果 Logback 是一个开源的日志框架&#xff0c;它支持多种日志输出方式&#xff0c;包括控制台输出、文件输出、邮件输出等。如果要将 Logback 输出的日志保存到 MySQL 数据库中&#xff0c;可以按照以下步骤进行配…

Tapd在研发团队中的使用技巧-持续更新ing

1.TAPD第三方服务集成能力&#xff0c;支持与代码仓库、流水线进行了深度打通&#xff0c;力求为开发团队提供流畅高效的使用体验。我们梳理了一份攻略&#xff0c;掌握下面几个小技能&#xff0c;让TAPD与代码仓库、流水线一起&#xff0c;成为研发团队的得力助手&#xff0c;…

数据结构算法刷题(27)回溯(子集型)

回溯思想&#xff1a; 思路&#xff1a;这种出现全部xx组合的&#xff0c;基本都是回溯算法。首先&#xff0c;当digits是空&#xff0c;那返回也是空。当回溯到边界条件的时候&#xff0c;就更新答案&#xff0c;在非边界条件的时候&#xff0c;循环该数值下的全部情况。 cla…

125760-33-0,Fmoc-Thr(Ac4Galβ1-3Ac2GalNAcα)-OH,于蛋白质糖基化修饰

文章关键词&#xff1a;糖化学试剂&#xff0c;化学试剂&#xff0c;糖基氨基酸一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a; Fmoc-Thr(Ac4Galβ1-3Ac2GalNAcα)-OH中蛋白质糖基化修饰是在糖基转移酶的催化作用下糖链分子…

色环电阻介绍

复习一下色环电阻&#xff0c;是在电阻封装上(即电阻表面)涂上一定颜色的色环&#xff0c;来代表这个电阻的阻值。色环实际上是早期为了帮助人们分辨不同阻值而设定的标准。色环电阻现在应用还是很广泛的&#xff0c;如家用电器、电子仪表、电子设备中常常可以见到。但由于色环…

Java内存模型(JMM)和volatile原理

一、Java 内存模型 JMM即Java Memory Model&#xff0c;他定义了主存&#xff08;共享的数据&#xff09;、工作内存&#xff08;私有的数据&#xff09;抽象概念&#xff0c;底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等 JMM体现以下几个方面 原子性-保证指令不会受…

ad18报错:Minimum Solder Mask Sliver Constraint

报告上提示&#xff1a; Minimum Solder Mask Sliver (Gap0.254mm) (All),(All) Minimum Solder Mask Sliver Constraint&#xff0c;PCB焊盘阻焊层之间间距小于0.254报错 修改了这里&#xff0c;把这个报警值改小一些&#xff0c;就不会报警了 翻译过来是&#xff1a;最小…

8.vue3医疗在线问诊项目 - _问诊室模块-websocket学习 ==> 消息卡片、websocket、socket.io、约定通讯规则、建立连接

8.vue3医疗在线问诊项目 - _问诊室模块-websocket学习 &#xff1e; 消息卡片、websocket、socket.io、约定通讯规则、建立连接 问诊室-路由与组件 目标&#xff1a;配置路由和分析结构 1&#xff09;路由配置 {path: /room,component: () > import(/views/room/index.vue)…

UNIX网络编程卷一 学习笔记 第二十章 广播

本书迄今为止的所有例子都是单播&#xff1a;一个进程与另一个进程通信。TCP只支持单播寻址&#xff0c;而UDP和原始IP还支持其他寻址类型&#xff0c;下图比较了不同的寻址方式&#xff1a; IPv6往寻址体系中增加了任播&#xff08;anycasting&#xff09;方式。RFC 1546讲述…

章节5:04-shiro反序列化漏洞

章节5&#xff1a;04-shiro反序列化漏洞 复现环境 本地tomcat或Docker vulhub 基础环境&#xff1a; IDEA Maven Tomcat Burp JDK8版 01 Shiro介绍 Shiro Apache Shiro&#xff1a;开源安全框架 身份验证授权会话管理加密 本地代码 https://github.com/apache/shi…

Iptables防火墙策略

目录 一、iptables netfilter/iptables 关系 二、四表五链 三、iptables的安装 iptables 命令行配置方法 管理选项 一、iptables Linux 系统的防火墙——netfilter/iptables IP信息包过滤系统&#xff0c;它实际上由两个组件netfilter 和 iptables组成。 主要工作在网络…

MATLAB与大数据:如何应对海量数据的处理和分析

第一章&#xff1a;引言 在当今数字化时代&#xff0c;大数据已经成为了各行各业的核心资源之一。海量的数据源源不断地涌现&#xff0c;如何高效地处理和分析这些数据已经成为了许多企业和研究机构面临的重要挑战。作为一种功能强大的数学软件工具&#xff0c;MATLAB为我们提供…

深度剖析InnoDB存储结构

大家都知道 MySQL 的数据都是存储在物理磁盘上的&#xff0c;那具体是保存在哪个文件呢&#xff1f;我们首先要知道MySQL 存储的行为是由存储引擎实现的&#xff0c;不同的存储引擎保存的文件自然也不同。由于InnoDB 是我们常用的存储引擎&#xff0c;也是 MySQL 默认的存储引擎…

Spring Cloud Alibaba - Sentinel源码分析(二)

目录 一、Sentinel源码分析 1、时间窗算法 2、滑动时间窗算法 3、Sentinel滑动时间窗口算法源码解析 4、Sentinel滑动窗口数据统计源码解析 一、Sentinel源码分析 1、时间窗算法 时间窗算法&#xff0c;也可以称之为&#xff1a;固定时间窗算法 概念&#xff1a;固定时…