Springboot实战:如何用Docker和Kubernetes部署微服务
前言
随着微服务架构的普及,如何高效部署和管理这些分布式服务成为了开发者面临的重要挑战。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: 8080spring:application:name: demo-servicemanagement:endpoints:web:exposure:include: health,info,metrics
微服务通信
在微服务架构中,服务间通信通常通过以下方式实现:
- REST API:最常见的通信方式,基于HTTP协议
- 消息队列:如RabbitMQ、Kafka等,适用于异步通信
- 服务发现:如Eureka、Consul,帮助服务找到彼此
- 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-slimWORKDIR /appCOPY target/demo-service-0.0.1-SNAPSHOT.jar app.jarEXPOSE 8080ENTRYPOINT ["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-serviceports:- "8080:8080"environment:- SPRING_PROFILES_ACTIVE=dockerdepends_on:- dbuser-service:build: ./user-serviceports:- "8081:8081"environment:- SPRING_PROFILES_ACTIVE=dockerdepends_on:- dbdb:image: mysql:8.0environment:- MYSQL_ROOT_PASSWORD=password- MYSQL_DATABASE=microservicesvolumes:- db-data:/var/lib/mysqlports:- "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-servicelabels:app: demo-service
spec:replicas: 3selector:matchLabels:app: demo-servicetemplate:metadata:labels:app: demo-servicespec:containers:- name: demo-serviceimage: demo-service:latestimagePullPolicy: IfNotPresentports:- containerPort: 8080resources:limits:cpu: "0.5"memory: "512Mi"requests:cpu: "0.2"memory: "256Mi"livenessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 30periodSeconds: 10readinessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 5periodSeconds: 5
2. 创建Service配置
# demo-service.yaml
apiVersion: v1
kind: Service
metadata:name: demo-service
spec:selector:app: demo-serviceports:- port: 80targetPort: 8080type: ClusterIP
3. 创建Ingress配置
# demo-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: demo-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: demo.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: demo-serviceport: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: 8080spring:application:name: demo-service
然后在Deployment中引用:
volumes:
- name: config-volumeconfigMap:name: demo-config
containers:
- name: demo-servicevolumeMounts:- name: config-volumemountPath: /app/configenv:- name: SPRING_CONFIG_LOCATIONvalue: 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/v1kind: Deploymentname: demo-serviceminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70
第五部分:监控与维护
应用监控
1. Spring Boot Actuator
Spring Boot Actuator提供了监控和管理生产环境中的Spring Boot应用的功能,如健康检查、指标收集等。
# application.yml中的Actuator配置
management:endpoints:web:exposure:include: health,info,metrics,prometheusendpoint: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: 15sscrape_configs:- job_name: 'spring-boot-app'metrics_path: '/actuator/prometheus'kubernetes_sd_configs:- role: podrelabel_configs:- source_labels: [__meta_kubernetes_pod_label_app]action: keepregex: 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 tailpath /var/log/containers/*.logpos_file /var/log/fluentd-containers.log.postag kubernetes.*read_from_head true<parse>@type jsontime_format %Y-%m-%dT%H:%M:%S.%NZ</parse></source><match kubernetes.var.log.containers.**>@type elasticsearchhost elasticsearch-loggingport 9200logstash_format truelogstash_prefix k8s<buffer>@type filepath /var/log/fluentd-buffers/kubernetes.system.bufferflush_mode intervalretry_type exponential_backoffflush_thread_count 2flush_interval 5s</buffer></match>
CI/CD流水线
使用Jenkins、GitLab CI或GitHub Actions构建CI/CD流水线,实现自动化构建、测试和部署。
GitHub Actions工作流示例:
# .github/workflows/ci-cd.yml
name: CI/CD Pipelineon:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Set up JDK 11uses: actions/setup-java@v2with:java-version: '11'distribution: 'adopt'- name: Build with Mavenrun: mvn clean package -DskipTests- name: Build and push Docker imageuses: docker/build-push-action@v2with:context: .push: truetags: user/demo-service:latestdeploy:needs: buildruns-on: ubuntu-lateststeps:- name: Deploy to Kubernetesuses: steebchen/kubectl@masterwith:config: ${{ secrets.KUBE_CONFIG_DATA }}command: apply -f k8s/
总结
本文详细介绍了如何使用Spring Boot开发微服务,通过Docker进行容器化,并使用Kubernetes进行部署和管理。这一组合已经成为现代云原生应用的标准技术栈,掌握这些技术对于开发和运维人员来说至关重要。
通过遵循本文的实践指南,您可以:
- 使用Spring Boot快速开发微服务
- 将微服务容器化,实现环境一致性
- 使用Kubernetes进行服务编排,实现高可用部署
- 建立完善的监控和日志系统
- 实现自动化的CI/CD流水线
随着云原生技术的不断发展,这些技术和实践也在不断演进。建议读者持续关注相关技术的更新,不断优化自己的微服务架构和部署策略。
参考资料
- Spring Boot官方文档
- Docker官方文档
- Kubernetes官方文档
- Spring Cloud官方文档
- Prometheus官方文档
相关文章:
Springboot实战:如何用Docker和Kubernetes部署微服务
前言 随着微服务架构的普及,如何高效部署和管理这些分布式服务成为了开发者面临的重要挑战。Spring Boot凭借其简化配置、快速开发的特性,成为了构建微服务的理想框架;而Docker和Kubernetes则分别解决了服务的容器化和编排问题。本文将详细介…...
Mac: 运行python读取CSV出现 permissionError
在MAC机器里,之前一直运行程序在某个指定的目录下读取excel和csv文件,没有出现错误,有一天突然出现错误:permissionError:[Errno 1] Operation not permitted, 具体错误信息如下: 经过调查得知,…...
UE5 学习笔记 FPS游戏制作30 显示击杀信息 水平框 UI模板(预制体)
文章目录 一制作单条死亡信息框水平框的使用创建一个水平框添加子元素调整子元素顺序子元素的布局插槽尺寸填充对齐 制作UI 根据队伍,设置文本的名字和颜色声明变量 将变量设置为构造参数根据队伍,设置文本的名字和颜色在构造事件中,获取玩家…...
西门子TCP通讯过程中硬件连接突然断开
通信原理探秘又结合在工作中遇到的问题,关注到了通讯中的KeepAlive定时器的设置,所以做了如下实验。 硬件: 1513PLC TCP客户端 PC TCP服务器 前提条件:禁用PLC侧KeepAlive 程序: 测试流程: 打开PC端网络调试助手,设置为TCP服务器,打开链接; PC端打开WireShack软…...
Android学习总结之算法篇三(打家劫舍)
打家劫舍一 // 动态规划 class Solution {public int rob(int[] nums) {if (nums null || nums.length 0) return 0;if (nums.length 1) return nums[0];int[] dp new int[nums.length];dp[0] nums[0];dp[1] Math.max(dp[0], nums[1]);for (int i 2; i < nums.lengt…...
【蓝桥杯】单片机设计与开发,速成备赛
一、LED模块开看,到大模板 二、刷第零讲题目(直接复制模板) 三、空降芯片模板直接调用部分(听完再敲代码) 四、第十三讲开刷省赛题(开始自己背敲模板) 五、考前串讲刷一遍 b连接࿱…...
【操作系统】Linux进程管理和调试
在 Linux 中,可以通过以下方法查看 PID(进程ID)对应的进程名称和详细信息: 1. 使用 ps 命令(最直接) ps -p <PID> -o pid,comm,cmd示例: ps -p 1234 -o pid,comm,cmd输出: P…...
2025宁德时代测评Verify考什么?网申测评如何通过SHL笔试|附真题线上笔试考点、高分攻略、CATL新能源科技SHL测评宁德社招题目、面试攻略、求职建议
——职小豚 带你拆解新能源巨头招聘密码 一、宁德时代:新能源赛道「超级独角兽」 作为全球动力电池龙头,宁德时代(CATL)的江湖地位无需多言: 技术硬实力:麒麟电池、钠离子电池、无钴电池等黑科技加持&…...
基于 Ollama DeepSeek、Dify RAG 和 Fay 框架的高考咨询 AI 交互系统项目方案
基于 Ollama DeepSeek、Dify RAG 和 Fay 框架的高考咨询 AI 交互系统 一、项目概述 本项目旨在构建一个智能化的高考咨询助手,结合 AI 大模型、知识增强(RAG)和 3D 数字人交互,为用户提供智能高考问答、志愿填报建议、政策解读等…...
【 Vue 2 中的 Mixins 模式】
Vue 2 中的 Mixins 模式 在 Vue 2 里,mixins 是一种灵活的复用代码的方式,它能让你在多个组件间共享代码。借助 mixins,你可以把一些通用的选项(像 data、methods、computed 等)封装到一个对象里,然后在多…...
Spring Boot @RequestParam 解析参数时的常见问题及解决方案
1,遇到的问题:将后端接口写完后我想通过PostMan进行简单的测试一下,一不小心就遇到了这样的情况: org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter contractId is not prese…...
linux xargs命令学习
命令描述 xargs从标准输入中读取默认以空格分隔的项(可以使用双引号保护空格)(或单引号或反斜杠)或换行符,并执行命令(默认为/bin/echo)一次或多次,后面跟着任何初始参数从标准输入中…...
Firefox 浏览器同步一个账户和书签网址
Firefox 浏览器同步一个账户和书签网址 Firefox 支持跨设备接续浏览,可实现电脑、手机与平板无缝衔接。无论您在使用哪台设备上使用 Firefox,都能获取书签、浏览历史、保存的密码等信息。当然也能实现windows、ios、linux、android系统中安装firefox浏览…...
Maven多模块项目,其他项目引用子模块的依赖,无法打包,提示没有找到依赖
背景: 微服务项目 每个服务都是单独的项目,会存在依赖关联的问题,在子模块的下面 depoly 之后,就会出现别的项目,无法package 原因: 多模块项目,depoly 需要在父模块下面执行...
mediacodec服务启动时加载media_codecs.xml
media.codec服务启动时, 会创建 implementation::Omx 和 implementation::OmxStore, 构造 Omx时, 会解析codec相关的xml文件,一般从会如下目录中, // from getDefaultSearchDirs() { "/product/etc",&quo…...
本地部署DeepSeek-R1(Dify压力测试和性能调优)
安装压测软件 为了有效测试,应在局域网设备测试,我这里用的服务器是局域网内的Ubuntu,下载的压测软件是WRK apt install wrk测试脚本 为了省事我直接在/root目录下新建lua脚本 vim test.lua脚本内容如下,app-xxxx更换为你工作…...
自动备份文件到服务器,自动备份文件到服务器有哪些方法?
将SQL Server数据库自动备份文件到服务器,可以通过多种方法实现。以下是几种常用的方法: 一、使用SQL Server Management Studio(SSMS)和SQL Server代理 配置SQL Server代理:确保SQL Server代理服务已启动。如果未启…...
Ollama+open-webui搭建私有本地大模型详细教程
Ollamaopen-webui搭建私有本地大模型详细教程 1. 什么是 Ollama? 1.1. Ollama 简介 Ollama 是一个轻量级的 AI 模型运行时,专注于简化 AI 模型的部署和使用。它支持多种预训练模型(如 Llama、Vicuna、Dolly 等),…...
电销行业机器人外呼话术设计:关键注意事项与实践指南
随着人工智能技术的普及,电话营销行业(电销)逐渐引入智能外呼机器人以提升效率、降低成本。然而,机器人外呼的实际效果高度依赖话术设计的合理性。若话术生硬、缺乏策略,不仅可能导致客户反感,还可能引发合…...
GPT-4o 原生图像生成技术解析:从模型架构到吉卜力梦境的实现
最近不少 AI 爱好者、设计师、Vlogger 在社交平台晒出了 GPT-4o 生成的梦幻图像,尤其是吉卜力风格的作品——柔和光影、日系构图、治愈色彩、富有情感的角色表达,一下子击中了无数人的“童年回忆 审美舒适区”。 🎨 下面是一些 GPT-4o 实际生…...
测试cursor-AI编辑器
Cursor是一个免费的,内置AI插件的编辑器,在vscode基础上开发,可以创建和分析代码,还能提出修改建议。官网是 https://www.cursor.com/cn 载入SFTP的方式跟vscode是一样的,但是会有这样的报错: 报错&#x…...
web网站页面测试点---添加功能测试
添加 一、创建新的申请时,关闭网络查看数据是否存在,并提示网络错位相关提示语 二、在文本框内输入数据 1.在文本框内输入空格,查看文本内容前后是否存在空格 2.在文本框内输入最大长度,查看能否正确提交 3.在文本框内输入最大长…...
[首发]烽火HG680-KD-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包
烽火HG680-KD-海思MV320芯片-28G-安卓9.0-强刷卡刷固件包 U盘强刷刷机步骤: 1、强刷刷机,用一个usb2.0的8G以下U盘,fat32,2048块单分区格式化(强刷对U盘非常非常挑剔,usb2.0的4G U盘兼容的多&a…...
Spring Boot 快速入手
前言:为什么选择 Spring Boot? 🚀 在现代 Java 开发中,Spring Boot 已成为最流行的后端框架之一。无论是小型 Web 应用、企业级系统,还是微服务架构,Spring Boot 都能提供快速开发、自动配置、轻量级部署的…...
OpenAI最近放出大新闻,准备在接下来的几个月内推出一款“开放”的语言模型
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
数据结构值ST表的详细讲解浅显易懂
定义与原理 ST表,即Sparse Table(稀疏表),是一种基于倍增思想的数据结构。它主要用于在**O(1)**时间复杂度内查询给定区间的最值(最大值或最小值)。其原理是通过预处理,利用倍增的思想…...
基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理
基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着…...
自动驾驶---学术论文的常客:nuScenes数据集的使用
1 前言 nuScenes 数据集在大模型训练中应用广泛,在很多CVPR或者其它论文中经常能看到使用nuScenes 数据集达到SOTA水平。 在之前的博客《自动驾驶---学术论文的常客:nuScenes 数据集》中,笔者主要介绍了nuScenes数据集的来源和下载方式&#…...
使用大语言模型进行Python图表可视化
Python使用matplotlib进行可视化一直有2个问题,一是代码繁琐,二是默认模板比较丑。因此发展出seaborn等在matplotlib上二次开发,以更少的代码进行画图的和美化的库,但是这也带来了定制化不足的问题。在大模型时代,这个…...
C#调用ACCESS数据库,解决“Microsoft.ACE.OLEDB.12.0”未注册问题
C#调用ACCESS数据库,解决“Microsoft.ACE.OLEDB.12.0”未注册问题 解决方法: 1.将C#采用的平台从AnyCpu改成X64 2.将官网下载的“Microsoft Access 2010 数据库引擎可再发行程序包AccessDatabaseEngine_X64”文件解压 3.安装解压后的文件 点击下载安…...
