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

微服务架构:使用Docker+Kubernetes部署应用

微服务架构使用DockerKubernetes部署应用大家好我是欧阳瑞Rich Own。今天想和大家聊聊微服务架构以及如何使用Docker和Kubernetes进行部署。作为一个全栈开发者我经历过单体应用到微服务的转型深刻体会到微服务带来的好处。什么是微服务架构微服务架构是一种将应用程序拆分成多个小型、独立服务的架构风格。每个服务独立部署独立扩展拥有自己的数据库通过API进行通信微服务的优势优势说明独立部署一个服务更新不会影响其他服务技术多样性不同服务可以使用不同技术栈弹性扩展可以根据需求独立扩展每个服务容错性单个服务故障不会导致整个系统崩溃团队自治每个团队可以独立负责一个服务Docker入门什么是DockerDocker是一个容器化平台可以将应用及其依赖打包成一个独立的容器。安装Docker# Ubuntu/Debian curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # Mac brew install docker # 验证安装 docker --version创建Dockerfile# 使用Node.js官方镜像作为基础镜像 FROM node:18-alpine # 设置工作目录 WORKDIR /app # 复制package.json和package-lock.json COPY package*.json ./ # 安装依赖 RUN npm ci --onlyproduction # 复制应用代码 COPY . . # 暴露端口 EXPOSE 3000 # 启动命令 CMD [node, server.js]构建和运行容器# 构建镜像 docker build -t my-node-app . # 运行容器 docker run -p 3000:3000 my-node-app # 后台运行 docker run -d -p 3000:3000 my-node-app # 查看运行中的容器 docker ps # 查看日志 docker logs container-idDocker Compose什么是Docker ComposeDocker Compose可以定义和运行多个容器的应用。创建docker-compose.ymlversion: 3.8 services: web: build: . ports: - 3000:3000 environment: - NODE_ENVproduction - DATABASE_URLpostgres://user:passworddb:5432/mydb depends_on: - db restart: unless-stopped db: image: postgres:15-alpine volumes: - postgres_data:/var/lib/postgresql/data environment: - POSTGRES_USERuser - POSTGRES_PASSWORDpassword - POSTGRES_DBmydb restart: unless-stopped volumes: postgres_data:运行Docker Compose# 启动所有服务 docker-compose up -d # 查看服务状态 docker-compose ps # 查看日志 docker-compose logs -f # 停止服务 docker-compose downKubernetes入门什么是KubernetesKubernetes简称K8s是一个容器编排平台可以自动化部署、扩展和管理容器化应用。安装Minikube本地开发# 安装Minikube curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 sudo install minikube-darwin-amd64 /usr/local/bin/minikube # 启动Minikube minikube start # 安装kubectl brew install kubectl # 验证安装 kubectl cluster-info创建Deployment# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: web-deployment labels: app: web spec: replicas: 3 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: web image: my-node-app:latest ports: - containerPort: 3000 env: - name: NODE_ENV value: production - name: DATABASE_URL value: postgres://user:passwordpostgres-service:5432/mydb resources: requests: memory: 128Mi cpu: 250m limits: memory: 256Mi cpu: 500m创建Service# service.yaml apiVersion: v1 kind: Service metadata: name: web-service spec: selector: app: web ports: - port: 80 targetPort: 3000 type: LoadBalancer创建StatefulSet数据库# statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres spec: serviceName: postgres-service replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:15-alpine ports: - containerPort: 5432 env: - name: POSTGRES_USER value: user - name: POSTGRES_PASSWORD value: password - name: POSTGRES_DB value: mydb volumeMounts: - name: postgres-data mountPath: /var/lib/postgresql/data volumeClaimTemplates: - metadata: name: postgres-data spec: accessModes: [ ReadWriteOnce ] resources: requests: storage: 10Gi应用配置# 应用Deployment kubectl apply -f deployment.yaml # 应用Service kubectl apply -f service.yaml # 应用StatefulSet kubectl apply -f statefulset.yaml # 查看Pod状态 kubectl get pods # 查看Service kubectl get services # 查看日志 kubectl logs pod-name # 进入Pod kubectl exec -it pod-name -- /bin/shKubernetes进阶水平自动扩展# hpa.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: web-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-deployment minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80配置管理# configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: NODE_ENV: production API_URL: https://api.example.com# secret.yaml apiVersion: v1 kind: Secret metadata: name: app-secret type: Opaque data: DATABASE_PASSWORD: cGFzc3dvcmQ # base64 encoded健康检查apiVersion: apps/v1 kind: Deployment metadata: name: web-deployment spec: template: spec: containers: - name: web image: my-node-app:latest ports: - containerPort: 3000 livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 3000 initialDelaySeconds: 5 periodSeconds: 5完整的微服务架构示例架构图┌─────────────────────────────────────────────────────────────┐ │ Load Balancer │ └───────────────────────────┬─────────────────────────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ API GW │ │ API GW │ │ API GW │ └─────┬─────┘ └─────┬─────┘ └─────┬─────┘ │ │ │ ┌─────┴─────────────────┴─────────────────┴─────┐ │ │ ┌───▼───┐ ┌───────┐ ┌─────────┐ ┌─────────┐ │ User │ │ Order │ │ Product │ │ Payment │ │Service│ │Service│ │ Service │ │ Service │ └───┬───┘ └───┬───┘ └────┬────┘ └────┬────┘ │ │ │ │ ▼ ▼ ▼ ▼ ┌─────────────────────────────────────────────────┐ │ PostgreSQL Cluster │ └─────────────────────────────────────────────────┘服务间通信// 使用gRPC进行服务间通信 const grpc require(grpc/grpc-js); const protoLoader require(grpc/proto-loader); const packageDefinition protoLoader.loadSync(order.proto); const orderProto grpc.loadPackageDefinition(packageDefinition); const client new orderProto.OrderService( order-service:50051, grpc.credentials.createInsecure() ); client.createOrder({ userId: 123, items: [item1] }, (error, response) { if (!error) { console.log(Order created:, response); } });CI/CD集成# .github/workflows/deploy.yml name: Deploy to Kubernetes on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv3 - name: Build Docker image run: | docker build -t ${{ secrets.DOCKER_REGISTRY }}/my-app:${{ github.sha }} . - name: Push Docker image run: | echo ${{ secrets.DOCKER_PASSWORD }} | docker login ${{ secrets.DOCKER_REGISTRY }} -u ${{ secrets.DOCKER_USERNAME }} --password-stdin docker push ${{ secrets.DOCKER_REGISTRY }}/my-app:${{ github.sha }} - name: Deploy to Kubernetes run: | kubectl set image deployment/web-deployment web${{ secrets.DOCKER_REGISTRY }}/my-app:${{ github.sha }}总结微服务架构配合Docker和Kubernetes可以构建出高度可扩展、高可用的应用系统。虽然学习曲线比较陡峭但一旦掌握就能体会到它带来的巨大优势。我的鬃狮蜥Hash对微服务也有自己的理解——它把晒太阳、吃饭、睡觉分成了三个独立的服务每个服务都能独立运行互不影响。这也许就是微服务的精髓吧如果你对微服务或Kubernetes有任何问题欢迎留言交流我是欧阳瑞极客之路永无止境技术栈Docker · Kubernetes · Docker Compose · Minikube · gRPC

相关文章:

微服务架构:使用Docker+Kubernetes部署应用

微服务架构:使用DockerKubernetes部署应用 大家好,我是欧阳瑞(Rich Own)。今天想和大家聊聊微服务架构以及如何使用Docker和Kubernetes进行部署。作为一个全栈开发者,我经历过单体应用到微服务的转型,深刻体…...

WinDirStat插件开发终极指南:构建自定义磁盘管理功能

WinDirStat插件开发终极指南:构建自定义磁盘管理功能 【免费下载链接】windirstat WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/wi/windirstat 作为Windows平台最知名的…...

有桥BOOST PFC变换器原理、工作模式和控制模式的优缺点

前言在现代电力电子设备中,功率因数校正(PFC)技术已经成为不可或缺的核心环节。随着全球各国对电网谐波污染的管控日益严格(如 IEC 61000-3-2 标准,对各类用电设备的谐波电流发射施加严格限值;例如对于功率…...

2026届最火的十大AI辅助写作平台解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下这个学术环境当中,AI辅助论文的写作已然变成了一种具备高效性的工具。借助…...

别再满世界找旧版了!用JetBrains Toolbox App一键管理所有IDE版本(含IDEA/PyCharm/WebStorm)

高效管理开发环境:JetBrains Toolbox App 的进阶使用指南 每次打开编辑器都要重新配置环境?项目组里有人用新版有人用旧版导致协作困难?插件突然不兼容最新版本?这些问题困扰着许多开发者。JetBrains Toolbox App 作为官方推出的管…...

Cadence Allegro 17.2 PCB设计避坑指南:从焊盘制作到封装绘制的完整流程

Cadence Allegro 17.2 PCB设计避坑指南:从焊盘制作到封装绘制的完整流程 刚接触Cadence Allegro 17.2的硬件工程师,往往会在焊盘制作和封装绘制环节踩不少坑。这些看似基础的操作,一旦参数设置不当或概念理解有误,轻则导致设计返工…...

从Excel到BI Launchpad:SAP BW/4HANA数据分析实战,手把手教你用BO做报表

从Excel到BI Launchpad:SAP BW/4HANA数据分析实战指南 1. 企业级数据分析的进化之路 在当今数据驱动的商业环境中,企业数据分析正经历着从静态报表到动态洞察的革命性转变。传统Excel虽然灵活易用,但在处理海量数据、实现实时协作和构建企业级…...

AI小白必看:打好基础再冲大模型,收藏这份学习路线图!

本文针对想学习AI的学生,强调掌握基础的重要性,避免直接进入大模型学习。文章提出应先理解AI的核心是让机器从数据中学习规律,并掌握数学、编程和数据思维能力。建议从数据处理开始,熟悉Python及常用库,逐步学习机器学…...

洛谷 P1305:新二叉树 ← DFS + 字符索引数组 + map

​【题目来源】 https://www.luogu.com.cn/problem/P1305 【题目描述】 输入一串二叉树,输出其前序遍历。 【输入格式】 第一行为二叉树的节点数 n。(1≤n≤26) 后面 n 行,第一个字母为节点,后两个字母分别为其左右儿子。特别地&#xff0c…...

ANSI转义序列封装:cursor-reset库实现终端光标精准控制

1. 项目概述与核心价值 最近在折腾一些自动化工具链,发现一个挺有意思的小项目,叫 zhitrend/cursor-reset 。乍一看名字,你可能会觉得这只是一个重置光标位置的小工具,但实际用下来,我发现它解决的痛点非常精准&…...

Spring Boot 2026教育技术演示项目全栈架构与工程实践解析

1. 项目概述:一个面向未来的教育技术演示 最近在整理开源项目时,我注意到了 holzerjm/GACEP-Spring-2026-demo 这个仓库。乍一看,这个标题信息量不小,它像是一个技术演示,但前缀 GACEP 和 Spring-2026 又透露出…...

别再死记硬背截止、放大、饱和了!用Arduino+面包板,5分钟直观理解NPN/PNP三极管三种状态

用Arduino点亮三极管:5分钟可视化实验理解电子开关的三种状态 你是否曾被三极管的"截止"、"放大"、"饱和"这些术语困扰?教科书上的电压公式和载流子运动图虽然精确,却难以形成直观认知。今天我们将用Arduino和…...

Mixtral-8x7B模型在消费级GPU上推理:混合量化与动态专家卸载实战

1. 项目概述与核心思路拆解最近在折腾大语言模型本地部署的朋友,估计都对Mixtral-8x7B这个“庞然大物”又爱又恨。爱的是它作为开源MoE(专家混合)模型的标杆,性能强悍;恨的是它那惊人的参数量(约47B&#x…...

AI工作流自动化实践:Claude数据同步工具架构与实现

1. 项目概述与核心价值 最近在折腾AI应用集成的时候,发现一个挺有意思的项目,叫 cam901051/claude-sync 。乍一看这个标题,你可能会有点懵,这到底是干嘛的?简单来说,这是一个旨在实现Claude(…...

为AI编码助手集成aislop-skill:实时代码质量检测与修复

1. 项目概述:为AI编码助手装上“质检员”如果你和我一样,日常重度依赖Cursor、Windsurf这类AI驱动的IDE,或者频繁使用Claude Code、Gemini CLI等代码生成工具,那你一定遇到过这样的场景:AI助手生成的代码,功…...

系统提示、开发提示、用户提示:在 Agent 里怎么分层

系统提示、开发提示、用户提示在 Agent 里的分层架构:从理论到工业级落地全解析 副标题:基于认知科学、软件工程双视角,构建可复用、可调试、高智能的三层提示架构体系 第一部分:引言与基础 (Introduction & Foundation) 1.1 引人注目的标题(重复+锚定SEO) 系统提…...

避坑指南:LabVIEW做3D模型旋转动画时,90%的人会忽略的‘添加对象及引用’模式

LabVIEW 3D模型旋转动画深度解析:从"乱跑"到精准控制的进阶指南 在LabVIEW中创建3D模型旋转动画时,许多开发者都会遇到一个令人困惑的现象:明明只想让模型旋转,结果整个坐标系也跟着"翩翩起舞"。这种看似简单…...

SINAMICS V90伺服驱动器故障代码大全

SINAMICS V90伺服驱动器在运行过程中可能出现故障,导致设备停机。用户可通过BOP面板或调试软件查看故障代码,并根据以下信息判断故障原因及处理方法。序号报警号信息故障信息可能原因处理方法1F1000内部软件错误出现了一个内部软件错误。分析故障缓冲器为…...

第六篇:《JMeter逻辑控制器:循环、条件和交替执行》

在实际业务测试中,并非只是简单的顺序执行。有时需要重复执行某些操作(循环),有时需要根据条件决定执行哪个分支(条件),有时需要模拟多个用户的交替行为(交替)。JMeter 提…...

给IPC相机调图像,别再瞎调了!一份保姆级的ISP线性模式调试顺序图(附避坑要点)

IPC相机图像调试实战指南:从线性模式到专业级画质优化 刚接触IPC相机图像调试的工程师们,常常会陷入参数迷宫——面对AE、AWB、Gamma、3DNR等数十个模块,该从何处入手?调试顺序的错误可能导致反复返工,甚至影响最终成像…...

ARMv8 A64指令集内存访问优化与LDRH/LDRSB指令详解

1. A64指令集与内存访问基础在ARMv8架构中,A64指令集作为64位执行状态的核心指令系统,其内存访问指令的设计直接影响处理器性能。与32位的A32指令集相比,A64在寄存器数量、地址空间和指令编码等方面都有显著改进。1.1 ARMv8内存访问特点ARM架…...

从网页地图卡顿说起:深入理解瓦片加载与前端性能优化(Leaflet/Mapbox实战)

从网页地图卡顿说起:深入理解瓦片加载与前端性能优化(Leaflet/Mapbox实战) 当用户在地图应用中频繁缩放拖拽却遭遇卡顿、白屏时,体验会瞬间崩塌。作为前端开发者,我们该如何从底层机制入手解决这些问题?本文…...

技能图谱探索器:从数据建模到交互可视化的全栈实现

1. 项目概述:一个技能图谱的探索工具最近在GitHub上看到一个挺有意思的项目,叫nitzzzu/openclaw-skills-explorer。光看名字,openclaw和skills-explorer这两个词就挺有画面感的。我第一反应是,这应该是一个用来探索、梳理或可视化…...

从“共和国之辉”到AI原生应用:一个关于“哥布林”诞生的技术启示录

从“共和国之辉”到AI原生应用:一个关于“哥布林”诞生的技术启示录 2025年7月,一篇名为《Where the goblins came from》的文章在Hacker News上引发了超过710票的热议。当大多数技术评论者将目光聚焦于AI模型的最新突破时,这篇来自OpenAI的文…...

扫雷外挂逆向笔记:我是如何找到那个0x8F代表地雷的(含OD动态调试技巧)

扫雷外挂逆向笔记:从内存数据到游戏逻辑的侦探之旅 逆向工程最迷人的地方在于,它像一场精心设计的侦探游戏。当你面对一堆看似毫无规律的十六进制数值时,如何抽丝剥茧,找出它们与游戏逻辑之间的映射关系?本文将分享我在…...

3PEAK思瑞浦 TPA2772-VS1R MSOP8 运算放大器

特性 供电电压:3V至36V 偏移电压:在25C时最大3.5mV 轨到轨输入和输出 带宽:4.6 MHz 噪声容限:-良好,THD0.0008% 低噪声:1kHz时53nV/vHz 零交叉输入: -优异的总谐波失真加噪声:0.0008%...

3PEAK思瑞浦 TPA1882Q-SO1R-S SOP8 运算放大器

特性 供电电压:4.5伏至36伏或2.25伏至18伏 偏移电压:最大50V 差分输入电压范围至电源轨,可作为比较器工作 输入轨至-Vs,轨到轨输出 带宽:12MHz,斜率:10V/us 优异的EMI抑制性能:1GHz时85dB 过温保护 低噪声:1kHz时为10nV/vHz 符合AEC-Q100认证…...

别再手动调阈值了!OpenCV实战:用Otsu和自适应阈值搞定光照不均的图片分割

智能图像分割实战:Otsu与自适应阈值技术解决光照不均难题 在工业质检、医疗影像分析、自动驾驶等场景中,图像分割的准确性直接影响最终结果。但现实世界的光照条件往往复杂多变——同一张图片可能同时存在过曝和欠曝区域,传统全局阈值方法在…...

DenseNet参数量比ResNet少?从Bottleneck和Transition层设计,聊聊模型轻量化的核心思路

DenseNet与ResNet参数效率对比:从结构设计看模型轻量化本质 在深度学习模型设计中,参数量与计算效率一直是工程师们关注的核心指标。当DenseNet首次提出时,许多研究者对其参数效率感到惊讶——看似复杂的密集连接结构,实际参数量却…...

AI编码助手如何重塑开发体验:从工具到伙伴的范式转变

1. 项目概述:当AI编码助手遇上“氛围感”最近在GitHub上看到一个挺有意思的项目,叫“awesome-ai-vibe-coding”。初看这个标题,可能会有点摸不着头脑。“Awesome”系列我们见多了,是各种优质资源的集合;“AI Coding”也…...