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

微前端 + Docker + Kubernetes 运作机制

1. 整体思路

想象一下,微前端就像是一个大房子,里面有很多小房间(微应用)。Docker就是把这些房间打包成独立的盒子,Kubernetes就是管理这些盒子的管家。

2. 为什么需要这样组合?

微前端的问题:

  • 多个小应用需要独立开发、测试、部署
  • 每个应用可能用不同的技术(React、Vue、Angular)
  • 需要统一管理这些应用

Docker的作用:

  • 把每个微应用打包成一个独立的"集装箱"
  • 确保在任何地方运行都是一样的
  • 解决"在我电脑上能跑,在别人电脑上跑不了"的问题

Kubernetes的作用:

  • 管理这些Docker集装箱
  • 自动分配资源(CPU、内存)
  • 自动处理故障(某个应用挂了,自动重启)
  • 自动扩展(用户多了,自动增加应用实例)

3. 具体运作过程

第一步:开发阶段

  • 开发人员分别开发不同的微应用
  • 每个应用都有自己的代码、依赖、配置
  • 测试没问题后,准备部署

第二步:打包阶段(Docker)

  • 把每个微应用打包成Docker镜像
  • 就像把应用装进一个标准化的盒子里
  • 这个盒子包含了运行应用需要的所有东西

第三步:部署阶段(Kubernetes)

  • 把Docker镜像部署到Kubernetes集群
  • Kubernetes自动分配服务器资源
  • 启动应用,确保它们能正常运行

第四步:运行阶段

  • 用户访问网站
  • 主应用(基座)负责整体协调
  • 根据用户访问的页面,动态加载对应的微应用
  • 所有应用组合成一个完整的页面

4. 实际例子

假设你有一个电商网站:
微应用结构:

  1. 主应用:负责导航、用户登录
  2. 商品列表应用:显示商品
  3. 购物车应用:管理购物车
  4. 订单应用:处理订单

运作流程:
用户访问网站
主应用加载,显示导航栏
用户点击"商品列表"
主应用动态加载商品列表应用
用户点击"购物车"
主应用加载购物车应用
所有应用看起来像一个完整的网站

5. 优势

对开发团队:
不同团队可以独立开发
可以自由选择技术栈
独立测试和部署
对运维团队:
统一管理所有应用
自动处理故障
容易扩展和维护
对用户:
网站响应更快
功能更稳定
体验更流畅

6. 简单类比

传统方式:
就像一个大房子,所有房间都是连在一起的,要装修一个房间,整个房子都要停工。
微前端方式:
就像一个大房子,每个房间都是独立的,可以单独装修,不影响其他房间。
Docker:
就像把每个房间都标准化,确保在任何地方都能完美复制。
Kubernetes:
就像智能管家,自动管理所有房间,确保它们都正常运行,出了问题自动修复。

7. 实际应用场景

大型企业网站:
不同部门负责不同功能模块
可以独立更新和维护
降低系统耦合度
电商平台:
商品、订单、支付、用户等模块独立
某个模块出问题不影响其他功能
可以针对不同模块进行优化
管理系统:
权限管理、数据统计、报表等模块独立
团队可以并行开发
更容易进行技术升级
这样组合的好处就是:灵活、稳定、易维护。每个部分都可以独立发展,但又能完美配合,给用户提供完整的体验。

1. 整体架构概览

用户请求 → 负载均衡器 → Kubernetes Ingress → 微前端主应用 → 微应用容器↓微应用1容器 (Docker)微应用2容器 (Docker)微应用3容器 (Docker)

2. Docker 容器化微前端

2.1 微前端应用容器化
主应用 Dockerfile

# 主应用 Dockerfile
FROM node:16-alpine as builderWORKDIR /app
COPY package*.json ./
RUN npm ci --only=productionCOPY . .
RUN npm run build# 生产环境镜像
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.confEXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

微应用 Dockerfile

# 微应用 Dockerfile
FROM node:16-alpine as builderWORKDIR /app
COPY package*.json ./
RUN npm ciCOPY . .
RUN npm run build# 使用轻量级服务器
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm ci --only=productionEXPOSE 3000
CMD ["npm", "start"]

2.2 Docker Compose 本地开发环境

# docker-compose.yml
version: '3.8'services:main-app:build: ./main-appports:- "3000:80"environment:- NODE_ENV=development- MICRO_APP_1_URL=http://app1:3000- MICRO_APP_2_URL=http://app2:3000depends_on:- app1- app2app1:build: ./micro-app1ports:- "3001:3000"environment:- NODE_ENV=developmentapp2:build: ./micro-app2ports:- "3002:3000"environment:- NODE_ENV=developmentnginx:image: nginx:alpineports:- "80:80"volumes:- ./nginx.conf:/etc/nginx/nginx.confdepends_on:- main-app- app1- app2

3. Kubernetes 部署配置

3.1 命名空间和配置

# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:name: micro-frontendlabels:name: micro-frontend

3.2 主应用部署

# main-app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: main-appnamespace: micro-frontend
spec:replicas: 3selector:matchLabels:app: main-apptemplate:metadata:labels:app: main-appspec:containers:- name: main-appimage: your-registry/main-app:latestports:- containerPort: 80env:- name: MICRO_APP_1_URLvalue: "http://app1-service:3000"- name: MICRO_APP_2_URLvalue: "http://app2-service:3000"resources:requests:memory: "128Mi"cpu: "100m"limits:memory: "256Mi"cpu: "200m"livenessProbe:httpGet:path: /healthport: 80initialDelaySeconds: 30periodSeconds: 10readinessProbe:httpGet:path: /readyport: 80initialDelaySeconds: 5periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:name: main-app-servicenamespace: micro-frontend
spec:selector:app: main-appports:- protocol: TCPport: 80targetPort: 80type: ClusterIP

3.3 微应用部署

# micro-app1-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: app1namespace: micro-frontend
spec:replicas: 2selector:matchLabels:app: app1template:metadata:labels:app: app1spec:containers:- name: app1image: your-registry/micro-app1:latestports:- containerPort: 3000env:- name: NODE_ENVvalue: "production"resources:requests:memory: "64Mi"cpu: "50m"limits:memory: "128Mi"cpu: "100m"livenessProbe:httpGet:path: /healthport: 3000initialDelaySeconds: 20periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:name: app1-servicenamespace: micro-frontend
spec:selector:app: app1ports:- protocol: TCPport: 3000targetPort: 3000type: ClusterIP

3.4 Ingress 配置

# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: micro-frontend-ingressnamespace: micro-frontendannotations:nginx.ingress.kubernetes.io/rewrite-target: /nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:ingressClassName: nginxrules:- host: micro-frontend.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: main-app-serviceport:number: 80- path: /app1pathType: Prefixbackend:service:name: app1-serviceport:number: 3000- path: /app2pathType: Prefixbackend:service:name: app2-serviceport:number: 3000
  1. 微前端应用配置
    4.1 主应用配置
// main-app/src/config/microApps.js
const microAppConfigs = {app1: {name: 'app1',entry: process.env.MICRO_APP_1_URL || 'http://localhost:3001',container: '#app1-container',activeRule: '/app1',props: {// 传递给微应用的数据userInfo: window.userInfo,theme: window.theme}},app2: {name: 'app2',entry: process.env.MICRO_APP_2_URL || 'http://localhost:3002',container: '#app2-container',activeRule: '/app2',props: {userInfo: window.userInfo,theme: window.theme}}
};export default microAppConfigs;

4.2 微应用生命周期管理

// main-app/src/utils/microAppManager.js
import { registerMicroApps, start, loadMicroApp } from 'qiankun';class MicroAppManager {constructor() {this.apps = new Map();this.loadingApps = new Set();}async init() {try {// 注册微应用registerMicroApps([{name: 'app1',entry: process.env.MICRO_APP_1_URL,container: '#app1-container',activeRule: '/app1',loader: (loading) => this.showLoading('app1', loading),beforeLoad: (app) => this.beforeLoad(app),beforeMount: (app) => this.beforeMount(app),afterMount: (app) => this.afterMount(app),beforeUnmount: (app) => this.beforeUnmount(app),afterUnmount: (app) => this.afterUnmount(app)}]);// 启动微前端框架start({prefetch: true,sandbox: {strictStyleIsolation: true,experimentalStyleIsolation: true}});console.log('微前端框架初始化成功');} catch (error) {console.error('微前端框架初始化失败:', error);throw error;}}async loadApp(name, container) {if (this.loadingApps.has(name)) {console.warn(`应用 ${name} 正在加载中...`);return;}try {this.loadingApps.add(name);const app = await loadMicroApp({name,entry: this.getAppEntry(name),container});this.apps.set(name, app);console.log(`应用 ${name} 加载成功`);} catch (error) {console.error(`应用 ${name} 加载失败:`, error);throw error;} finally {this.loadingApps.delete(name);}}getAppEntry(name) {const config = microAppConfigs[name];if (!config) {throw new Error(`未找到应用 ${name} 的配置`);}return config.entry;}// 生命周期钩子beforeLoad(app) {console.log(`应用 ${app.name} 即将加载`);}beforeMount(app) {console.log(`应用 ${app.name} 即将挂载`);}afterMount(app) {console.log(`应用 ${app.name} 挂载完成`);}beforeUnmount(app) {console.log(`应用 ${app.name} 即将卸载`);}afterUnmount(app) {console.log(`应用 ${app.name} 卸载完成`);}showLoading(appName, loading) {const container = document.querySelector(`#${appName}-loading`);if (container) {container.style.display = loading ? 'block' : 'none';}}
}export default new MicroAppManager();

5. 服务发现和配置管理

5.1 ConfigMap 配置

# configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: micro-frontend-confignamespace: micro-frontend
data:MICRO_APP_1_URL: "http://app1-service:3000"MICRO_APP_2_URL: "http://app2-service:3000"API_BASE_URL: "http://api-service:8080"FEATURE_FLAGS: |{"enableApp1": true,"enableApp2": true,"enableAnalytics": false}

5.2 Secret 管理

# secret.yaml
apiVersion: v1
kind: Secret
metadata:name: micro-frontend-secretsnamespace: micro-frontend
type: Opaque
data:API_KEY: <base64-encoded-api-key>JWT_SECRET: <base64-encoded-jwt-secret>

6. 监控和日志

6.1 Prometheus 监控配置

// main-app/src/utils/metrics.js
class MetricsCollector {constructor() {this.metrics = {appLoadTime: {},errorCount: {},userActions: {},performance: {}};}trackAppLoadTime(appName, loadTime) {if (!this.metrics.appLoadTime[appName]) {this.metrics.appLoadTime[appName] = [];}this.metrics.appLoadTime[appName].push(loadTime);// 发送到 Prometheusthis.sendMetric('app_load_time', {app: appName,value: loadTime,timestamp: Date.now()});}trackError(appName, error) {if (!this.metrics.errorCount[appName]) {this.metrics.errorCount[appName] = 0;}this.metrics.errorCount[appName]++;this.sendMetric('app_error_count', {app: appName,error: error.message,timestamp: Date.now()});}sendMetric(name, data) {// 发送指标到监控系统fetch('/metrics', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ name, data })}).catch(console.error);}
}export default new MetricsCollector();

7. CI/CD 流水线

7.1 GitLab CI 配置

# .gitlab-ci.yml
stages:- build- test- build-image- deployvariables:DOCKER_REGISTRY: "your-registry.com"KUBE_NAMESPACE: "micro-frontend"build:stage: buildimage: node:16script:- npm ci- npm run buildartifacts:paths:- dist/test:stage: testimage: node:16script:- npm ci- npm run test:unit- npm run test:integrationbuild-image:stage: build-imageimage: docker:latestservices:- docker:dindscript:- docker build -t $DOCKER_REGISTRY/main-app:$CI_COMMIT_SHA .- docker push $DOCKER_REGISTRY/main-app:$CI_COMMIT_SHA- docker tag $DOCKER_REGISTRY/main-app:$CI_COMMIT_SHA $DOCKER_REGISTRY/main-app:latest- docker push $DOCKER_REGISTRY/main-app:latestdeploy:stage: deployimage: bitnami/kubectl:latestscript:- kubectl set image deployment/main-app main-app=$DOCKER_REGISTRY/main-app:$CI_COMMIT_SHA -n $KUBE_NAMESPACE- kubectl rollout status deployment/main-app -n $KUBE_NAMESPACEenvironment:name: productionurl: https://micro-frontend.example.com

8. 故障恢复和扩展

8.1 Horizontal Pod Autoscaler

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: main-app-hpanamespace: micro-frontend
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: main-appminReplicas: 3maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70- type: Resourceresource:name: memorytarget:type: UtilizationaverageUtilization: 80

8.2 Pod Disruption Budget

# pdb.yaml
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:name: main-app-pdbnamespace: micro-frontend
spec:minAvailable: 2selector:matchLabels:app: main-app

9. 网络策略

9.1 网络隔离

# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: micro-frontend-network-policynamespace: micro-frontend
spec:podSelector:matchLabels:app: main-apppolicyTypes:- Ingress- Egressingress:- from:- namespaceSelector:matchLabels:name: ingress-nginxports:- protocol: TCPport: 80egress:- to:- podSelector:matchLabels:app: app1ports:- protocol: TCPport: 3000- to:- podSelector:matchLabels:app: app2ports:- protocol: TCPport: 3000
  1. 实际运作流程
    10.1 应用启动流程
    sequenceDiagram
    participant User
    participant Ingress
    participant MainApp
    participant App1
    participant App2
    participant K8s

    User->>Ingress: 访问 /app1
    Ingress->>MainApp: 路由到主应用
    MainApp->>K8s: 检查 App1 服务状态
    K8s->>MainApp: 返回 App1 服务信息
    MainApp->>App1: 加载微应用
    App1->>MainApp: 返回应用内容
    MainApp->>User: 渲染完整页面
    10.2 容器编排流程
    应用部署:通过 kubectl 或 Helm 部署微前端应用
    服务发现:Kubernetes 自动创建服务端点
    负载均衡:Ingress 控制器分发请求
    健康检查:Kubelet 定期检查容器健康状态
    自动扩展:HPA 根据资源使用情况自动调整副本数
    故障恢复:失败的 Pod 自动重启或重新调度
    这种架构的优势在于:
    高可用性:多副本部署,自动故障恢复
    可扩展性:支持水平扩展和垂直扩展
    资源隔离:每个微应用独立运行,互不影响
    统一管理:通过 Kubernetes 统一管理所有容器
    自动化运维:支持自动部署、监控、扩展

http://www.dtcms.com/a/327109.html

相关文章:

  • 【51单片机定时器流水灯】2022-10-28
  • Docker使用----(安装_Windows版)
  • Go语言实战案例:使用Gin框架构建Hello API
  • windows单机单卡+CIFAR-10数据集+Docker模拟训练
  • 快速了解自然语言处理
  • 《Redis慢查询日志操作:SLOWLOG GET/CONFIG等命令的分析方法》
  • 计算机视觉(4)-相机基础知识恶补
  • 前端css学习笔记3:伪类选择器与伪元素选择器
  • 【shell脚本编程】-4 shell脚本编写冒泡排序
  • Redis命令大全
  • 新型Windows RPC攻击可劫持服务并完全攻陷Active Directory,PoC已公开
  • C++——模板初阶
  • 企业培训笔记:宠物信息管理--实现宠物信息的添加
  • 计算机毕设不知道选什么题目?基于Spark的糖尿病数据分析系统【Hadoop+Spark+python】
  • 多语言与隐形攻击:LLM安全防线为何被频频突破?
  • 雪花算法snowflake分布式id生成原理详解,以及对解决时钟回拨问题几种方案讨论
  • 跨设备开发不再难:HarmonyOS 分布式任务管理应用全解析
  • 【web站点安全开发】任务2:HTML5核心特性与元素详解
  • 树:数据结构中的层次架构
  • 【后端】Spring @Resource和@Autowired的用法和区别
  • 一键生成 Android 适配不同分辨率尺寸的图片
  • [GESP202309 六级] 2023年9月GESP C++六级上机题题解,附带讲解视频!
  • Airtable 入门指南:从创建项目到基础数据分析与可视化
  • 修复图像、视频和3D场景的AI工具–Inpaint Anything
  • PCIe Electrical Idle Sequences ( EIOS and EIEOS )
  • C++ 中的单例模式:使用静态方法管理唯一实例
  • 告别土味埋点:Java 优雅统计方法耗时的艺术与实践​
  • 企业高性能web服务器(4)
  • 【实时计费系统的Redis实践:视频平台按分钟付费服务的原子扣费与对账】
  • C++11-下