Springboot实战:如何用Docker和Kubernetes部署微服务

news2025/4/3 2:24:09

前言

随着微服务架构的普及,如何高效部署和管理这些分布式服务成为了开发者面临的重要挑战。Spring Boot凭借其简化配置、快速开发的特性,成为了构建微服务的理想框架;而Docker和Kubernetes则分别解决了服务的容器化和编排问题。本文将详细介绍如何将Spring Boot开发的微服务通过Docker容器化,并使用Kubernetes进行部署和管理,帮助读者掌握现代云原生应用的完整开发部署流程。

第一部分:微服务架构简介

什么是微服务

微服务是一种将应用程序构建为一系列小型、自治服务的架构风格,每个服务运行在自己的进程中,通过轻量级机制(通常是HTTP API)进行通信。这些服务围绕业务能力构建,可以通过全自动部署机制独立部署。

微服务的优势

  • 技术异构性:不同服务可以使用不同的技术栈
  • 弹性:单个组件的失败不会导致整个应用崩溃
  • 可扩展性:可以只对需要扩展的服务进行扩展,而不是整个应用
  • 易于部署:服务可以独立部署,不影响其他服务
  • 组织对齐:小型团队可以专注于特定服务

微服务的挑战

  • 分布式系统的复杂性
  • 服务间通信的可靠性
  • 数据一致性
  • 运维复杂度增加

第二部分:Spring Boot微服务开发

Spring Boot简介

Spring Boot是简化Spring应用开发的框架,它消除了传统Spring应用中繁琐的配置过程,提供了许多"开箱即用"的功能。

创建一个简单的Spring Boot微服务

1. 项目结构
demo-service/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── demo/
│   │   │               ├── DemoApplication.java
│   │   │               ├── controller/
│   │   │               │   └── DemoController.java
│   │   │               ├── service/
│   │   │               │   └── DemoService.java
│   │   │               └── model/
│   │   │                   └── DemoEntity.java
│   │   └── resources/
│   │       └── application.yml
├── pom.xml
└── Dockerfile
2. pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>demo-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
    <properties>
        <java.version>11</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
3. 应用主类
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
4. 控制器
package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    
    @GetMapping("/hello")
    public String hello() {
        return "Hello from Spring Boot Microservice!";
    }
}
5. 配置文件 application.yml
server:
  port: 8080

spring:
  application:
    name: demo-service

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics

微服务通信

在微服务架构中,服务间通信通常通过以下方式实现:

  1. REST API:最常见的通信方式,基于HTTP协议
  2. 消息队列:如RabbitMQ、Kafka等,适用于异步通信
  3. 服务发现:如Eureka、Consul,帮助服务找到彼此
  4. API网关:如Spring Cloud Gateway,提供统一的API入口

第三部分:Docker容器化

Docker简介

Docker是一个开源的应用容器引擎,它让开发者可以将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的Linux或Windows机器上。

Docker的核心概念

  • 镜像(Image):Docker容器的模板,包含了运行应用所需的所有文件和配置
  • 容器(Container):镜像的运行实例
  • Dockerfile:用于构建Docker镜像的脚本文件
  • Docker Hub:公共的Docker镜像仓库

为Spring Boot应用创建Dockerfile

FROM openjdk:11-jre-slim

WORKDIR /app

COPY target/demo-service-0.0.1-SNAPSHOT.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]

构建和运行Docker镜像

# 构建Spring Boot应用
mvn clean package

# 构建Docker镜像
docker build -t demo-service:latest .

# 运行Docker容器
docker run -p 8080:8080 demo-service:latest

多阶段构建优化

为了减小最终镜像的大小,可以使用多阶段构建:

# 构建阶段
FROM maven:3.8.5-openjdk-11-slim AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests

# 运行阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/demo-service-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

Docker Compose管理多服务

对于包含多个微服务的应用,可以使用Docker Compose进行管理:

# docker-compose.yml
version: '3'

services:
  demo-service:
    build: ./demo-service
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=docker
    depends_on:
      - db
  
  user-service:
    build: ./user-service
    ports:
      - "8081:8081"
    environment:
      - SPRING_PROFILES_ACTIVE=docker
    depends_on:
      - db
  
  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=microservices
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3306:3306"

volumes:
  db-data:

第四部分:Kubernetes编排与部署

Kubernetes简介

Kubernetes(K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。

Kubernetes的核心概念

  • Pod:K8s中最小的部署单元,可包含一个或多个容器
  • Service:为一组Pod提供统一的网络访问策略
  • Deployment:管理Pod的创建和更新
  • ConfigMap/Secret:管理配置和敏感信息
  • Namespace:提供资源隔离
  • Ingress:管理外部访问集群内服务的HTTP路由

部署Spring Boot微服务到Kubernetes

1. 创建Deployment配置
# demo-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-service
  labels:
    app: demo-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo-service
  template:
    metadata:
      labels:
        app: demo-service
    spec:
      containers:
      - name: demo-service
        image: demo-service:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: "0.5"
            memory: "512Mi"
          requests:
            cpu: "0.2"
            memory: "256Mi"
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
2. 创建Service配置
# demo-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: demo-service
spec:
  selector:
    app: demo-service
  ports:
  - port: 80
    targetPort: 8080
  type: ClusterIP
3. 创建Ingress配置
# demo-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: demo.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: demo-service
            port:
              number: 80
4. 应用配置到Kubernetes集群
# 部署应用
kubectl apply -f demo-deployment.yaml
kubectl apply -f demo-service.yaml
kubectl apply -f demo-ingress.yaml

# 查看部署状态
kubectl get deployments
kubectl get pods
kubectl get services
kubectl get ingress

配置管理

使用ConfigMap管理应用配置:

# demo-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-config
data:
  application.yml: |
    server:
      port: 8080
    spring:
      application:
        name: demo-service

然后在Deployment中引用:

volumes:
- name: config-volume
  configMap:
    name: demo-config
containers:
- name: demo-service
  volumeMounts:
  - name: config-volume
    mountPath: /app/config
  env:
  - name: SPRING_CONFIG_LOCATION
    value: file:/app/config/application.yml

自动扩缩容

配置Horizontal Pod Autoscaler (HPA):

# demo-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: demo-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: demo-service
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

第五部分:监控与维护

应用监控

1. Spring Boot Actuator

Spring Boot Actuator提供了监控和管理生产环境中的Spring Boot应用的功能,如健康检查、指标收集等。

# application.yml中的Actuator配置
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus
  endpoint:
    health:
      show-details: always
2. Prometheus和Grafana
  • Prometheus:用于收集和存储指标数据
  • Grafana:用于可视化监控数据

部署Prometheus:

# prometheus-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
    scrape_configs:
      - job_name: 'spring-boot-app'
        metrics_path: '/actuator/prometheus'
        kubernetes_sd_configs:
          - role: pod
        relabel_configs:
          - source_labels: [__meta_kubernetes_pod_label_app]
            action: keep
            regex: demo-service

日志管理

使用ELK(Elasticsearch, Logstash, Kibana)或EFK(Elasticsearch, Fluentd, Kibana)栈收集和分析日志。

Fluentd配置示例:

# fluentd-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
data:
  fluent.conf: |
    <source>
      @type tail
      path /var/log/containers/*.log
      pos_file /var/log/fluentd-containers.log.pos
      tag kubernetes.*
      read_from_head true
      <parse>
        @type json
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </parse>
    </source>
    
    <match kubernetes.var.log.containers.**>
      @type elasticsearch
      host elasticsearch-logging
      port 9200
      logstash_format true
      logstash_prefix k8s
      <buffer>
        @type file
        path /var/log/fluentd-buffers/kubernetes.system.buffer
        flush_mode interval
        retry_type exponential_backoff
        flush_thread_count 2
        flush_interval 5s
      </buffer>
    </match>

CI/CD流水线

使用Jenkins、GitLab CI或GitHub Actions构建CI/CD流水线,实现自动化构建、测试和部署。

GitHub Actions工作流示例:

# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'
        distribution: 'adopt'
        
    - name: Build with Maven
      run: mvn clean package -DskipTests
      
    - name: Build and push Docker image
      uses: docker/build-push-action@v2
      with:
        context: .
        push: true
        tags: user/demo-service:latest
        
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
    - name: Deploy to Kubernetes
      uses: steebchen/kubectl@master
      with:
        config: ${{ secrets.KUBE_CONFIG_DATA }}
        command: apply -f k8s/

总结

本文详细介绍了如何使用Spring Boot开发微服务,通过Docker进行容器化,并使用Kubernetes进行部署和管理。这一组合已经成为现代云原生应用的标准技术栈,掌握这些技术对于开发和运维人员来说至关重要。

通过遵循本文的实践指南,您可以:

  1. 使用Spring Boot快速开发微服务
  2. 将微服务容器化,实现环境一致性
  3. 使用Kubernetes进行服务编排,实现高可用部署
  4. 建立完善的监控和日志系统
  5. 实现自动化的CI/CD流水线

随着云原生技术的不断发展,这些技术和实践也在不断演进。建议读者持续关注相关技术的更新,不断优化自己的微服务架构和部署策略。

参考资料

  • Spring Boot官方文档
  • Docker官方文档
  • Kubernetes官方文档
  • Spring Cloud官方文档
  • Prometheus官方文档

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

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

相关文章

Mac: 运行python读取CSV出现 permissionError

在MAC机器里&#xff0c;之前一直运行程序在某个指定的目录下读取excel和csv文件&#xff0c;没有出现错误&#xff0c;有一天突然出现错误&#xff1a;permissionError:[Errno 1] Operation not permitted&#xff0c; 具体错误信息如下&#xff1a; 经过调查得知&#xff0c…

UE5 学习笔记 FPS游戏制作30 显示击杀信息 水平框 UI模板(预制体)

文章目录 一制作单条死亡信息框水平框的使用创建一个水平框添加子元素调整子元素顺序子元素的布局插槽尺寸填充对齐 制作UI 根据队伍&#xff0c;设置文本的名字和颜色声明变量 将变量设置为构造参数根据队伍&#xff0c;设置文本的名字和颜色在构造事件中&#xff0c;获取玩家…

西门子TCP通讯过程中硬件连接突然断开

通信原理探秘又结合在工作中遇到的问题,关注到了通讯中的KeepAlive定时器的设置,所以做了如下实验。 硬件: 1513PLC TCP客户端 PC TCP服务器 前提条件:禁用PLC侧KeepAlive 程序: 测试流程: 打开PC端网络调试助手,设置为TCP服务器,打开链接; PC端打开WireShack软…

2025宁德时代测评Verify考什么?网申测评如何通过SHL笔试|附真题线上笔试考点、高分攻略、CATL新能源科技SHL测评宁德社招题目、面试攻略、求职建议

——职小豚 带你拆解新能源巨头招聘密码 一、宁德时代&#xff1a;新能源赛道「超级独角兽」 作为全球动力电池龙头&#xff0c;宁德时代&#xff08;CATL&#xff09;的江湖地位无需多言&#xff1a; 技术硬实力&#xff1a;麒麟电池、钠离子电池、无钴电池等黑科技加持&…

Spring Boot @RequestParam 解析参数时的常见问题及解决方案

1&#xff0c;遇到的问题&#xff1a;将后端接口写完后我想通过PostMan进行简单的测试一下&#xff0c;一不小心就遇到了这样的情况&#xff1a; org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter contractId is not prese…

Firefox 浏览器同步一个账户和书签网址

Firefox 浏览器同步一个账户和书签网址 Firefox 支持跨设备接续浏览&#xff0c;可实现电脑、手机与平板无缝衔接。无论您在使用哪台设备上使用 Firefox&#xff0c;都能获取书签、浏览历史、保存的密码等信息。当然也能实现windows、ios、linux、android系统中安装firefox浏览…

Maven多模块项目,其他项目引用子模块的依赖,无法打包,提示没有找到依赖

背景&#xff1a; 微服务项目 每个服务都是单独的项目&#xff0c;会存在依赖关联的问题&#xff0c;在子模块的下面 depoly 之后&#xff0c;就会出现别的项目&#xff0c;无法package 原因&#xff1a; 多模块项目&#xff0c;depoly 需要在父模块下面执行

mediacodec服务启动时加载media_codecs.xml

media.codec服务启动时&#xff0c; 会创建 implementation::Omx 和 implementation::OmxStore&#xff0c; 构造 Omx时&#xff0c; 会解析codec相关的xml文件&#xff0c;一般从会如下目录中&#xff0c; // from getDefaultSearchDirs() { "/product/etc",&quo…

本地部署DeepSeek-R1(Dify压力测试和性能调优)

安装压测软件 为了有效测试&#xff0c;应在局域网设备测试&#xff0c;我这里用的服务器是局域网内的Ubuntu&#xff0c;下载的压测软件是WRK apt install wrk测试脚本 为了省事我直接在/root目录下新建lua脚本 vim test.lua脚本内容如下&#xff0c;app-xxxx更换为你工作…

自动备份文件到服务器,自动备份文件到服务器有哪些方法?

将SQL Server数据库自动备份文件到服务器&#xff0c;可以通过多种方法实现。以下是几种常用的方法&#xff1a; 一、使用SQL Server Management Studio&#xff08;SSMS&#xff09;和SQL Server代理 配置SQL Server代理&#xff1a;确保SQL Server代理服务已启动。如果未启…

Ollama+open-webui搭建私有本地大模型详细教程

Ollamaopen-webui搭建私有本地大模型详细教程 1. 什么是 Ollama&#xff1f; 1.1. Ollama 简介 ​ Ollama 是一个轻量级的 AI 模型运行时&#xff0c;专注于简化 AI 模型的部署和使用。它支持多种预训练模型&#xff08;如 Llama、Vicuna、Dolly 等&#xff09;&#xff0c;…

GPT-4o 原生图像生成技术解析:从模型架构到吉卜力梦境的实现

最近不少 AI 爱好者、设计师、Vlogger 在社交平台晒出了 GPT-4o 生成的梦幻图像&#xff0c;尤其是吉卜力风格的作品——柔和光影、日系构图、治愈色彩、富有情感的角色表达&#xff0c;一下子击中了无数人的“童年回忆 审美舒适区”。 &#x1f3a8; 下面是一些 GPT-4o 实际生…

测试cursor-AI编辑器

Cursor是一个免费的&#xff0c;内置AI插件的编辑器&#xff0c;在vscode基础上开发&#xff0c;可以创建和分析代码&#xff0c;还能提出修改建议。官网是 https://www.cursor.com/cn 载入SFTP的方式跟vscode是一样的&#xff0c;但是会有这样的报错&#xff1a; 报错&#x…

[首发]烽火HG680-KD-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包

烽火HG680-KD-海思MV320芯片-28G-安卓9.0-强刷卡刷固件包 U盘强刷刷机步骤&#xff1a; 1、强刷刷机&#xff0c;用一个usb2.0的8G以下U盘&#xff0c;fat32&#xff0c;2048块单分区格式化&#xff08;强刷对&#xff35;盘非常非常挑剔&#xff0c;usb2.0的4G U盘兼容的多&a…

Spring Boot 快速入手

前言&#xff1a;为什么选择 Spring Boot&#xff1f; &#x1f680; 在现代 Java 开发中&#xff0c;Spring Boot 已成为最流行的后端框架之一。无论是小型 Web 应用、企业级系统&#xff0c;还是微服务架构&#xff0c;Spring Boot 都能提供快速开发、自动配置、轻量级部署的…

OpenAI最近放出大新闻,准备在接下来的几个月内推出一款“开放”的语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理

基于PyQt5的自动化任务管理软件&#xff1a;高效、智能的任务调度与执行管理 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着…

自动驾驶---学术论文的常客:nuScenes数据集的使用

1 前言 nuScenes 数据集在大模型训练中应用广泛&#xff0c;在很多CVPR或者其它论文中经常能看到使用nuScenes 数据集达到SOTA水平。 在之前的博客《自动驾驶---学术论文的常客&#xff1a;nuScenes 数据集》中&#xff0c;笔者主要介绍了nuScenes数据集的来源和下载方式&#…

使用大语言模型进行Python图表可视化

Python使用matplotlib进行可视化一直有2个问题&#xff0c;一是代码繁琐&#xff0c;二是默认模板比较丑。因此发展出seaborn等在matplotlib上二次开发&#xff0c;以更少的代码进行画图的和美化的库&#xff0c;但是这也带来了定制化不足的问题。在大模型时代&#xff0c;这个…

C#调用ACCESS数据库,解决“Microsoft.ACE.OLEDB.12.0”未注册问题

C#调用ACCESS数据库&#xff0c;解决“Microsoft.ACE.OLEDB.12.0”未注册问题 解决方法&#xff1a; 1.将C#采用的平台从AnyCpu改成X64 2.将官网下载的“Microsoft Access 2010 数据库引擎可再发行程序包AccessDatabaseEngine_X64”文件解压 3.安装解压后的文件 点击下载安…