基于SpringBoot工程开发Docker化微服务

news2025/1/12 17:48:22

目录

1. 微服务容器化治理的优缺点

1.1 微服务容器化的优点

 1.2 微服务容器化的缺点

2. 微服务的两种模式

2.1 Microservice SDK

2.2 ServiceMesh

3. 微服务容器化治理的推荐模式

4.Windows下开发容器化微服务(非K8S)

4.1 开发环境

4.2 代码框架

4.2.1 SpringBoot开发框架

4.2.2 增加docker支持

4.3 运行Docker化的微服务


1. 微服务容器化治理的优缺点

1.1 微服务容器化的优点

       最近一直在研究在项目中推进Docker化的可行性,原来项目组采用的技术栈是SpringCloud,而Docker化带来的价值主要包括以下几个SpringCloud体系所不具备的优势:

  1. 产品的安装部署和版本发布效率会提升。这里的背景是我们的产品主要是需要能够为不同的客户进行本地化部署,而不是目前主要的互联网公司的一个网站的模式。用SpringCloud,则产品的安装部署主要是用自己写安装部署脚本,或开发安装部署工具,较为复杂。
  2. 产品的动态伸缩能力会更强。基于K8S可以实现Docker容器的动态伸缩,而SpringCloud体系实现该能力要难度高一些。
  3. 灰度发布能力会更强。这点SpringCloud也能实现,但是需要借助第三方工具,且相对于K8S,实现起来会比较复杂。
  4. 写代码时可以更聚焦业务,不需要把微服务的治理和业务代码耦合。而SpringCloud体系本身需要业务代码和微服务治理体系耦合,如微服务需要知道Nacos,SpringCloud的SDK中也要求微服务对微服务治理相关的组件要了解,并做好配置。

 1.2 微服务容器化的缺点

       当然,采用全面的Docker化也存在一些缺点:

  1. 第一就是运维成本的升高。采用K8S对微服务进行治理,虽然将业务代码和微服务管理进行了剥离,但是K8S本质上是将微服务管理IaaS化了,所以对K8S运维的要求比较高,对人员技能要求也比较高。
  2. 第二就是这种模式并不太成熟。K8S对微服务的管理,本质上是ServiceMesh模式,而非SpringCloud的Microservice SDK模式。而ServiceMesh模式目前主流的技术方案是Istio+K8S,技术成熟度还不太高。

2. 微服务的两种模式

       刚刚学习Docker和K8S的时候,习惯性的想把SpringCloud的微服务治理体系装到K8S里面。但直觉上一直认为这种模式很别扭,因为K8S也有类似SpringCloud的完整微服务治理体系,如etcd、API Server等。只到后来看到一个华为大神写的文章《最佳实践:从Spring Cloud 到 Istio》(https://zhuanlan.zhihu.com/p/358891699),才恍然大悟:SpringCloud是Microservice SDK模式,K8S时ServiceMesh模式;两者完全是不同的两种设计思想,强行把他们揉到一起,有点儿要把马车和汽车焊在一起的赶脚。

2.1 Microservice SDK

       微服务SDK曾经是一个常用的解决方案。将微服务化后通用的能力封装在一个开发框架中,开发者使用这个框架开发写自己的业务代码,生成的微服务自然就内置了这些能力。这种模式中,业务代码和微服务框架代码是耦合在一起的的。SpringCloud就是这种模式的典型代表,采用SpringCloud框架,业务代码和SpringCloud框架的Nacos、Sentinel、SpringCloud Gateway等是强耦合的,业务代码的Maven工程和SpringCloud的这些工具集是强绑定的。如果后续不采用SpringCloud框架了,那业务代码基本上也要进行大面积的重构。

       这里适当展开一下,SpringCloud本身包含最核心的Spring Framework,和简化配置开发能力的SpringBoot框架,以及SpringCloud框架。

      早期SpringCloud大部分基于Netflix的版本,采用Eureka、Ribbon、Hystrix、Zuul/Zuul2、SpringCloud Config等工具库来实现微服务治理的基本框架。但随着框架的演进,Netflix版本目前已经不再维护了。

       当前业界采用的主要是SpringCloudAlibaba版本,是阿里基于SpringCloud开发的版本,采用Nacos、Sentinel、SpringCloud Gateway等工具实现了微服务治理的基本框架。

       目前SpringCloudAlibaba版本的主要工具库如下图所示。

 

2.2 ServiceMesh

       ServiceMesh,也就是常说的服务网格,是通过另一种形态提供治理能力。不同于SDK方式,服务治理的能力在一个独立的代理进程中提供,完全和业务代码开发解耦。从本质上讲,微服务SDK是一种开发框架,而ServiceMesh是一个基础设施。

       当前最流行的ServiceMesh模式是K8S + Istio,采用SideCar模式实现业务代码和服务治理的解耦。

3. 微服务容器化治理的推荐模式

       根据上一章的说明,大家应该可以看到,如果要将微服务容器化,建议大家采用ServiceMesh模式。在该模式下,可以灵活的采用不同的开发语言,如Golang、Node.js、Python、Java等;同时也不需要再绑定SpringCloud等微服务框架,只需要聚焦最核心的业务代码开发既可。

       仍然以Java语言为例,采用ServiceMesh模式,只需要采用Maven + SpringBoot框架开发既可。

4.Windows下开发容器化微服务(非K8S)

       按照前面的总结,我们将采用SpringBoot为开发框架,搭建容器化的微服务环境。

4.1 开发环境

       开发语言:Java

       代码框架:Maven + SpringBoot

       开发工具:VSCode

       开发插件:Extension Pack for Java, Spring Boot Extension Pack, Docker

       Docker环境:Docker Desktop

       K8S环境:利用Docker Desktop中自带的对Kubernetes的支持

       具体的安装部署这里不再赘述,大家可以上网搜索。配置国内的Maven库和Docker Registry也不再赘述,大家网上搜索既可。

       这里重点要说一下VSCode真的是很不错的开发环境,微软官方的开发插件对开发效率有极大的提升,上述几个开发插件大家一定要用好。

4.2 代码框架

4.2.1 SpringBoot开发框架

       VSCode的Extension Pack for Java和Spring Boot Extension Pack对SpringBoot的Maven工程创建支持非常好,可以在VSCode中按照引导一步步创建工程即可。

        这里建议创建Spring Boot类型的工程,然后再选择Maven类型工程,再按提示选择。

       不建议创建Maven类型的工程,然后再选择SpringBoot类型的archetype。因为这种模式,可选的archetype比较杂,对SpringBoot的版本配置也比较乱,需要手动做不少调整。

4.2.2 增加docker支持

4.2.2.1 pom中增加dockerfile-maven-plugin

       这里用到了dockerfile-maven-plugin插件,来为maven工程增加docker能力的支持。该插件是spotify公司开发的插件,将docker和maven进行了集成,可以在maven工程中,基于Dockerfile的配置,将工程打包成docker镜像,并支持push和tag等功能。具体的pom配置请见下图。

 

        需要注意的是,该插件的前身是docker-maven-plugin,官方已经声明docker-maven-plugin不再继续演进,建议开发者切换到dockerfile-maven-plugin。目前往上有大量的docker-maven-plugin的教程,需要大家注意不要被误导采用老旧的插件。

4.2.2.2 工程中增加Dockerfile

       在VScode中按F1键,输入Docker: Add Docker File to Workspace,可以在工程中增加Dockerfile。默认增加Dockerfile到根目录,如果手动添加到其他目录,会出现编译错误。

       Dockerfile创建后,VSCode的Docker插件会根据Maven工程自动初始化Dockerfile的内容,如下图所示。

       这里需要注意的是,Docker镜像打包时,需要有底层OS和JDK的支持,开发人员可以根据自己工程采用的java版本,在hub.docker.com上搜索对应的底层docker依赖,并写到Dockerfile的FROM部分。如上图所示,这里用到的是JDK 19,在hub.docker.com中可以搜到很多版本,这里选择的事openjdk: 19-jdk-alpine。选择openjdk是为了避免被Oracle收费,19-jdk表示jdk 19版本,alpine表示基于alpine的linux,这个版本的linux比较小,占用的资源较少,连同jdk合计185.34MB。

       另外,根据工程的需要,刻在Dockerfile中通过EXPOSE port,开放指定端口,以便外部访问。示例工程中开放到是8080端口。

       Dockerfile配置完成后,启动本地的Docker Desktop,再执行Maven编译,可以生成docker image,并自动推送到Docker Desktop。如下图所示:

        至此,该工程的docker文件已编译打包完成,并成功push到本地的docker库上。

4.3 运行Docker化的微服务

       基于Docker Desktop可以启动上面创建的微服务的Docker容器,启动时需要配置一下端口映射,将容器暴露的端口映射到本地端口,以便可以通过本地浏览器访问发布的docker服务。具体操作可以用Docker Desktop提供的功能设置。

       如下图所示,选择要运行的image,点击Run按钮。

 

        在弹出的窗口中可以配置Container name和端口映射,完成后点击Run:

       执行Run后,可以在Docker Desktop上看到启动日志,如下图所示,启动正常。

       Terminal标签是该Container的shell,可以在里面执行shell命令,如下图所示。

 

(未完待续。。。)

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

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

相关文章

全网最新、最详细的使用burpsuite验证码识别绕过爆破教程(2023最新)

1、前沿 最近一直在研究绕过验证码进行爆破的方法,在这里对自己这段时间以来的收获进行一下分享。在这里要分享的绕过验证码爆破的方法一共有2个,分为免费版本(如果验证码比较奇怪可能会有识别错误的情况)和付费版本(…

【Qt】QtCreator远程部署、调试程序

1、添加远程设备 1)QtCreator 工具–> 选项 --> 设备 --> 添加 2)设备设置向导选择–> Generic Linux Device --> 开启向导 3)填写“标识配置的名称”(随便写)、设备IP、用户名 --> 下一步 4)选择配对秘密文件,第一次配对,可以不填写,点击“下一…

嵌入式:ARM嵌入式系统开发流程概述

文章目录嵌入式开发的具体过程开发流程图嵌入式软件开发环境交叉开发环境远程调试结构图嵌入式应用软件开发的基本流程软件模拟环境目标板与评估板嵌入式软件开发的可移植性和可重用性嵌入式开发的具体过程 系统定义与需求分析阶段方案设计阶段详细设计阶段软硬件集成测试阶段…

Tomcat架构分析—— Engine

文章目录一、Tomcat的核心模块(核心组件)二、Engine 组件1.核心类与依赖图2.核心类源码分析构造函数:初始化方法 init:启动方法 start:3.Engine的启动过程总结一、Tomcat的核心模块(核心组件) …

机器学习之支持向量机(手推公式版)

文章目录前言1. 间隔与支持向量2. 函数方程描述3. 参数求解3.1 拉格朗日乘数3.2 拉格朗日对偶函数前言 支持向量机(Support(Support(Support VectorVectorVector Machine,SVM)Machine,SVM)Machine,SVM)源于统计学习理论,是一种二分类模型,是机器学习中获…

mysql查询当天,近一周,近一个月,近一年的数据

1.mysql查询当天的数据 select * from table where to_days(时间字段) to_days(now()); 2.mysql查询昨天的数据 select * from table where to_days(now( ) ) - to_days( 时间字段名) < 1 3.mysql查询近一周的数据 SELECT * FROM table WHERE date(时间字段) > D…

MySQL表的创建修改删除

目录 1、表的创建 2、查看表结构 3、表的修改 4、表的删除 1、表的创建 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎&#xff1b;说明&#xff1a; field 表示列名 datatype 表…

计算机系统基础实验 - 定点数加减法的机器级表示

实验序号&#xff1a;2 实验名称&#xff1a;定点数加减法的机器级表示 适用专业&#xff1a;软件工程 学 时 数&#xff1a;2学时 一、实验目的 1、掌握定点数加法的机器级表示。 2、掌握定点数减法的机器级表示。 3、掌握EFLAGS中4个牵涉到计算的标志位的计算方法。 4、掌握…

python实现动态柱状图

目录 一.基础柱状图 反转x轴&#xff0c;y轴&#xff0c;设置数值标签在右侧 小结 二.基础时间线柱状图 三.GDP动态柱状图绘制 1.了解列表的sort方法并配合lambda匿名函数完成列表排序 2.完成图表所需数据 3.完成GDP动态图表绘制 添加主题类型 设置动态标题 四.完整代码…

5.6 try语句块和异常处理

文章目录throw表达式(异常检测)try语句块&#xff08;异常处理&#xff09;编写处理代码函数在寻找处理代码的过程中退出标准异常异常是指存在于运行时的反常行为&#xff0c;这些行为超出了函数正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。当程序的某部…

Android Studio实现一个旅游课题手机app

文章目录&#xff1a; 目录 一、课题介绍 二、软件的运行环境 三、软件运行截图 四、软件项目总结 一、课题介绍 本次课题是实现了一个外出旅游的app&#xff0c;通过app可以显示景点的信息&#xff0c;以及根据地区查询&#xff0c;具体功能如下&#xff1a; 客户端 1.用…

【算法】面试题 - 数组(附讲解视频)

目录标题原地修改数组&#xff08;快慢指针&#xff09;26. 删除有序数组中的重复项扩展&#xff1a;83. 删除排序链表中的重复元素27. 移除元素283. 移动零左右指针167. 两数之和15. 三数之和[一个方法团灭 NSUM 问题](https://blog.csdn.net/yzx3105/article/details/1284606…

JavaWeb学生系统+教师系统+管理员系统

目录&#xff1a;一、前言&#xff1a;一、用到的技术&#xff1a;1.前端&#xff1a;HTMLCssJavaScriptAjaxJQueryBootStrap2.后端&#xff1a;ServletJSPSpringMVCJPA二、系统实现的效果&#xff1a;1.登录登出功能&#xff1a;(1)不同用户可以跳转到不同的系统页面。(2)设有…

window 和虚拟机ubuntu通讯的网络设置 本地连接桥接和NAT

工作需要&#xff0c;最近在linux下开发&#xff0c;需要将windows里的文件传至虚拟机里以及下位机树莓派中&#xff0c;三者需要实现互传。 windows连接树莓派时是采用网口建立本地连接的&#xff0c;而当不需要连接树莓派时&#xff0c;windows和虚拟机不能通过有线本地连接…

09、SpringCloud 系列:Nacos - 配置文件中心

SpringCloud 系列列表&#xff1a; 文章名文章地址01、Eureka - 集群、服务发现https://blog.csdn.net/qq_46023503/article/details/12831902302、Ribbon - 负载均衡https://blog.csdn.net/qq_46023503/article/details/12833228803、OpenFeign - 远程调用https://blog.csdn.…

Python接口测试实战1(下)- 接口测试工具的使用

本节内容 抓包工具的使用Postman的使用 抓包工具的使用 抓包工具简介 Chrome/Firefox 开发者工具: 浏览器内置&#xff0c;方便易用Fiddler/Charles: 基于代理的抓包&#xff0c;功能强大&#xff0c;可以手机抓包&#xff0c;模拟弱网&#xff0c;拦截请求&#xff0c;定制…

xpdf在windows下的编译记录

目录 1、下载源码 ​编辑 2、准备工作 3、编译freetype 3.1 打开vs工程 3.2 生成之后查看 4、编译zlib 5、编译libpng 6、编译lcms 7、编译xpdf 8、存在问题 1、下载源码 Xpdf官网下载&#xff1a;Download Xpdf and XpdfReader 2、准备工作 3、编译freetype 3.1 打…

财务数字化转型怎么转?从哪几个方面出发

财务的数字化转型如何进行&#xff1f;许多企业在推动各大业务部门进行数字化转型时&#xff0c;往往会忽略财务部门。然而&#xff0c;作为掌握公司核心资源与数据和推动企业数字化建设的部门&#xff0c;财务也应成为企业数字化转型的重要突破口。 这篇就用几个案例详细拆解…

React 入门:实战案例 Github搜索_静态组件

文章目录开发前的准备实现组件静态代码开发前的准备 目标实现页面效果, 及组件拆分&#xff0c;如下图所示 组件代码结构规划 外部资源准备 引入第三方样式 bootstrap CSS 样式库 bootstrap 官网有 v3、v4、v5 三个版本&#xff0c;本文使用的 v3 版本的样式&#xff0c;可…

JavaScript篇.day05-数组, 基本/引用数据类型函数调用区别

目录 1.Array数组 (1)简介 (2)数组的基本操作 (3)数组的遍历 a. 普通数组的遍历 b.对象数组的遍历 (4)数组对象常用方法 2.基本/引用数据类型函数调用区别 1.Array数组 (1)简介 数组时存放一组数据,长度可变的有序集合索引: 从0开始, 空数组索引无效稀疏数组, 其中含…