Microi.net分布式架构:Redis哨兵+Docker+K8S企业级部署方案

Microi.net分布式架构:Redis哨兵+Docker+K8S企业级部署方案

【免费下载链接】开源低代码平台-Microi吾码 开源低代码平台-Microi吾码,基于.NET8+Vue3+Element-Plus,始于2014年(基于Avalon.js),2018年使用Vue重构,于2024年10月开源。 【免费下载链接】开源低代码平台-Microi吾码 项目地址: https://gitcode.com/microi-net/microi.net

引言:企业级部署的挑战与机遇

在数字化转型浪潮中,企业应用面临着高并发、高可用、弹性扩展的严峻挑战。Microi.net作为一款成熟的开源低代码平台,如何实现企业级分布式部署成为技术决策者关注的核心问题。本文将深入探讨Microi.net在Redis哨兵、Docker容器化和Kubernetes编排下的完整部署方案,帮助企业构建稳定可靠的生产环境。

一、Microi.net架构概览

1.1 技术栈组成

Microi.net采用现代化的技术架构,主要包含以下核心组件:

组件类型技术选型版本要求
后端框架.NET 9支持.NET Standard 2.0+
前端框架Vue 2/3 + Element UI/PlusVue 2.6+ / Vue 3.2+
数据库支持MySQL/SQL Server/OracleMySQL 5.5+ / SQL Server 2016+
缓存系统RedisRedis 6.0+
消息队列RabbitMQRabbitMQ 3.8+
容器编排Docker + KubernetesDocker 20.10+ / K8S 1.20+

1.2 分布式架构设计

mermaid

二、Redis哨兵高可用方案

2.1 Redis哨兵架构设计

Redis哨兵模式为Microi.net提供高可用的缓存服务,确保在节点故障时自动切换:

mermaid

2.2 Docker Compose部署Redis哨兵

创建redis-sentinel-docker-compose.yml文件:

version: '3.8'
services:
  # Redis主节点
  redis-master:
    image: redis:7.2-alpine
    container_name: redis-master
    command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
    ports:
      - "6379:6379"
    volumes:
      - redis-master-data:/data
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}
    networks:
      - redis-network

  # Redis从节点1
  redis-slave1:
    image: redis:7.2-alpine
    container_name: redis-slave1
    command: >
      redis-server 
      --slaveof redis-master 6379 
      --masterauth ${REDIS_PASSWORD}
      --requirepass ${REDIS_PASSWORD}
      --appendonly yes
    ports:
      - "6380:6379"
    volumes:
      - redis-slave1-data:/data
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}
    depends_on:
      - redis-master
    networks:
      - redis-network

  # Redis从节点2
  redis-slave2:
    image: redis:7.2-alpine
    container_name: redis-slave2
    command: >
      redis-server 
      --slaveof redis-master 6379 
      --masterauth ${REDIS_PASSWORD}
      --requirepass ${REDIS_PASSWORD}
      --appendonly yes
    ports:
      - "6381:6379"
    volumes:
      - redis-slave2-data:/data
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}
    depends_on:
      - redis-master
    networks:
      - redis-network

  # 哨兵节点1
  sentinel1:
    image: redis:7.2-alpine
    container_name: sentinel1
    command: >
      redis-sentinel /etc/redis/sentinel.conf
      --sentinel
    ports:
      - "26379:26379"
    volumes:
      - ./sentinel1.conf:/etc/redis/sentinel.conf
    depends_on:
      - redis-master
    networks:
      - redis-network

  # 哨兵节点2
  sentinel2:
    image: redis:7.2-alpine
    container_name: sentinel2
    command: >
      redis-sentinel /etc/redis/sentinel.conf
      --sentinel
    ports:
      - "26380:26379"
    volumes:
      - ./sentinel2.conf:/etc/redis/sentinel.conf
    depends_on:
      - redis-master
    networks:
      - redis-network

  # 哨兵节点3
  sentinel3:
    image: redis:7.2-alpine
    container_name: sentinel3
    command: >
      redis-sentinel /etc/redis/sentinel.conf
      --sentinel
    ports:
      - "26381:26379"
    volumes:
      - ./sentinel3.conf:/etc/redis/sentinel.conf
    depends_on:
      - redis-master
    networks:
      - redis-network

volumes:
  redis-master-data:
  redis-slave1-data:
  redis-slave2-data:

networks:
  redis-network:
    driver: bridge

2.3 哨兵配置文件

创建哨兵配置文件sentinel1.conf

port 26379
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster ${REDIS_PASSWORD}
dir /tmp

三、Docker容器化部署

3.1 Microi.net Docker镜像构建

创建Dockerfile用于构建Microi.net后端API服务:

FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY ["Microi.Server/Microi.net.Api/Microi.net.Api.csproj", "Microi.net.Api/"]
COPY ["Microi.Server/Microi.SystemBase/Microi.SystemBase.csproj", "Microi.SystemBase/"]
COPY ["Microi.Server/Microi.Cache/Microi.Cache.csproj", "Microi.Cache/"]
COPY ["Microi.Server/Microi.ORM/Microi.ORM.csproj", "Microi.ORM/"]
RUN dotnet restore "Microi.net.Api/Microi.net.Api.csproj"
COPY . .
WORKDIR "/src/Microi.Server/Microi.net.Api"
RUN dotnet build "Microi.net.Api.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Microi.net.Api.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Microi.net.Api.dll"]

3.2 多环境Docker Compose部署

创建docker-compose.prod.yml生产环境配置文件:

version: '3.8'

services:
  # MySQL数据库
  mysql:
    image: mysql:8.0
    container_name: microi-mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: microi_prod
      MYSQL_USER: microi_user
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./config/mysql.cnf:/etc/mysql/conf.d/custom.cnf
    networks:
      - microi-network
    restart: unless-stopped

  # Redis哨兵集群
  redis-sentinel:
    extends:
      file: redis-sentinel-docker-compose.yml
      service: sentinel1
    networks:
      - microi-network

  # 后端API服务
  api-service:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: microi-api
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ConnectionStrings:DefaultConnection=Server=mysql;Database=microi_prod;User=microi_user;Password=${MYSQL_PASSWORD}
      - Redis:ConnectionString=${REDIS_SENTINEL_CONNECTION}
      - JWT:Secret=${JWT_SECRET}
    ports:
      - "5000:80"
    depends_on:
      - mysql
      - redis-sentinel
    networks:
      - microi-network
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80/health"]
      interval: 30s
      timeout: 10s
      retries: 3

  # 前端Web服务
  web-service:
    image: nginx:alpine
    container_name: microi-web
    volumes:
      - ./microi.web/dist:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - api-service
    networks:
      - microi-network
    restart: unless-stopped

volumes:
  mysql_data:
  redis_data:

networks:
  microi-network:
    driver: bridge

四、Kubernetes企业级编排

4.1 K8S部署架构设计

mermaid

4.2 Kubernetes部署清单

创建k8s-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: microi-api
  namespace: microi-production
  labels:
    app: microi-api
    tier: backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: microi-api
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: microi-api
        tier: backend
    spec:
      containers:
      - name: microi-api
        image: registry.example.com/microi-api:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        env:
        - name: ASPNETCORE_ENVIRONMENT
          value: "Production"
        - name: ConnectionStrings__DefaultConnection
          valueFrom:
            secretKeyRef:
              name: microi-secrets
              key: database-connection
        - name: Redis__ConnectionString
          valueFrom:
            configMapKeyRef:
              name: microi-config
              key: redis-sentinel-connection
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 80
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /health/ready
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: microi-api-service
  namespace: microi-production
spec:
  selector:
    app: microi-api
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: microi-ingress
  namespace: microi-production
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - api.microi.example.com
    secretName: microi-tls-secret
  rules:
  - host: api.microi.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: microi-api-service
            port:
              number: 80

4.3 Redis哨兵K8S配置

创建redis-sentinel-k8s.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-sentinel
  namespace: microi-production
spec:
  serviceName: redis-sentinel
  replicas: 3
  selector:
    matchLabels:
      app: redis-sentinel
  template:
    metadata:
      labels:
        app: redis-sentinel
    spec:
      containers:
      - name: redis
        image: redis:7.2-alpine
        command: ["redis-server", "--appendonly", "yes"]
        ports:
        - containerPort: 6379
        volumeMounts:
        - name: redis-data
          mountPath: /data
        env:
        - name: REDIS_PASSWORD
          valueFrom:
            secretKeyRef:
              name: redis-secrets
              key: password
      - name: sentinel
        image: redis:7.2-alpine
        command: ["redis-sentinel", "/etc/redis/sentinel.conf"]
        ports:
        - containerPort: 26379
        volumeMounts:
        - name: sentinel-config
          mountPath: /etc/redis/sentinel.conf
          subPath: sentinel.conf
  volumeClaimTemplates:
  - metadata:
      name: redis-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-sentinel-config
  namespace: microi-production
data:
  sentinel.conf: |
    port 26379
    sentinel monitor mymaster redis-sentinel 6379 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 10000
    sentinel parallel-syncs mymaster 1
    sentinel auth-pass mymaster ${REDIS_PASSWORD}

五、监控与运维保障

5.1 健康检查与监控配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: microi-monitoring-config
  namespace: microi-production
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    
    scrape_configs:
    - job_name: 'microi-api'
      static_configs:
      - targets: ['microi-api-service:80']
      metrics_path: /metrics
    
    - job_name: 'redis'
      static_configs:
      - targets: ['redis-sentinel:9121']
    
    - job_name: 'mysql'
      static_configs:
      - targets: ['mysql-exporter:9104']

5.2 自动化运维脚本

创建部署脚本deploy-microi.sh

#!/bin/bash
set -e

# 环境变量配置
export NAMESPACE=microi-production
export DEPLOYMENT_NAME=microi-api
export IMAGE_TAG=latest

echo "开始部署Microi.net到Kubernetes集群..."

# 创建命名空间
kubectl create namespace $NAMESPACE --dry-run=client -o yaml | kubectl apply -f -

# 部署Redis哨兵
kubectl apply -f redis-sentinel-k8s.yaml -n $NAMESPACE

# 部署MySQL
kubectl apply -f mysql-deployment.yaml -n $NAMESPACE

# 部署应用
kubectl set image deployment/$DEPLOYMENT_NAME \
  microi-api=registry.example.com/microi-api:$IMAGE_TAG \
  -n $NAMESPACE

# 等待部署完成
kubectl rollout status deployment/$DEPLOYMENT_NAME -n $NAMESPACE --timeout=300s

echo "部署完成!"
echo "API服务地址: http://api.microi.example.com"
echo "监控面板: http://grafana.microi.example.com"

六、性能优化与最佳实践

6.1 数据库连接池优化

// Microi.net数据库连接配置优化
services.AddDbContext<MicroiDbContext>(options =>
{
    options.UseMySql(Configuration.GetConnectionString("DefaultConnection"),
        new MySqlServerVersion(new Version(8, 0, 26)),
        mysqlOptions =>
        {
            mysqlOptions.EnableRetryOnFailure(
                maxRetryCount: 5,
                maxRetryDelay: TimeSpan.FromSeconds(30),
                errorNumbersToAdd: null);
            mysqlOptions.CommandTimeout(300);
        });
    
    options.EnableSensitiveDataLogging(false);
    options.EnableDetailedErrors(true);
});

// 配置连接池
services.AddPooledDbContextFactory<MicroiDbContext>(options =>
{
    options.UseMySql(Configuration.GetConnectionString("DefaultConnection"));
}, poolSize: 128);

6.2 Redis客户端配置优化

// StackExchange.Redis连接多路复用
var configurationOptions = new ConfigurationOptions
{
    EndPoints = { "redis-sentinel:26379" },
    ServiceName = "mymaster",
    Password = Configuration["Redis:Password"],
    AbortOnConnectFail = false,
    ConnectRetry = 5,
    ConnectTimeout = 5000,
    SyncTimeout = 5000,
    DefaultDatabase = 0,
    AllowAdmin = true
};

services.AddSingleton<IConnectionMultiplexer>(sp =>
    ConnectionMultiplexer.Connect(configurationOptions));

七、总结与展望

通过Redis哨兵+Docker+K8S的完整部署方案,Microi.net能够实现:

  1. 高可用性:Redis哨兵确保缓存服务99.95%的可用性
  2. 弹性扩展:Kubernetes水平自动扩缩容应对流量高峰
  3. 故障自愈:容器健康检查和自动重启保障服务连续性
  4. 简化运维:统一的容器化部署和配置管理

未来Microi.net将继续深化云原生架构,集成服务网格(Service Mesh)、无服务器(Serverless)等先进技术,为企业数字化转型提供更强大的技术支撑。

立即行动:按照本文提供的方案部署您的Microi.net企业级环境,享受高可用、高性能的低代码开发体验!

【免费下载链接】开源低代码平台-Microi吾码 开源低代码平台-Microi吾码,基于.NET8+Vue3+Element-Plus,始于2014年(基于Avalon.js),2018年使用Vue重构,于2024年10月开源。 【免费下载链接】开源低代码平台-Microi吾码 项目地址: https://gitcode.com/microi-net/microi.net

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值