【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
目录
一、前言
二、前置准备
2.1 基本环境
2.2 准备一个springboot工程
2.2.1 准备几个测试接口
2.3 准备Dockerfile文件
2.4 打包上传到服务器
三、制作微服务镜像与运行服务镜像
3.1 拷贝Dockerfile文件到服务器
3.2 制作服务镜像
3.3 启动镜像服务
3.4 访问一下服务接口
四、配置负载均衡
4.1 源码包方式安装nginx
4.1.1 下载nginx安装包
4.1.2 解压安装包
4.1.3 进入解压后的安装包目录
4.1.4 编译安装
4.1.5 启动nginx
4.1.6 检查nginx服务是否启动成功
4.1.7 访问nginx主页
4.1.8 nginx其他命令补充
4.2 启动另外两个微服务容器
4.3 配置负载均衡
4.3.1 配置nginx负载均衡
4.3.2 负载均衡效果验证
4.4 固定微服务容器IP的方式配置负载均衡
4.4.1 创建一个docker网络
4.4.2 使用指定IP的方式启动三个微服务容器
4.4.3 测试访问服务接口
4.4.4 配置nginx负载均衡
4.5 使用Docker Compose配置负载均衡
4.5.1 创建docker网络
4.5.2 创建nginx.conf配置文件
4.5.3 创建docker-compose文件
4.5.4 启动容器
五、写在文末
一、前言
基于容器化部署微服务的实施方案目前在很多团队中实践应用,得益于docker 领域解决方案的完善,生态和组件的丰富,以及k8s的盛行,于是微服务接入docker进行部署也成为一种比较主流的方式,不过一旦项目上线,高可用问题在任何一个系统中都是需要亟待解决的,使用docker部署springboot也不例外,在不引入k8s的情况下,如何低成本的快速实现docker微服务多节点扩容呢,本篇将详细介绍一下。
二、前置准备
在正式开始操作之前,你需要提前做下面几项准备,以确保后面的部署、实施和相关的操作能够顺利完成。
2.1 基本环境
- 云服务器或虚拟机,最低,2C4G;
- 服务器安装了Docker环境,以及Docker Compose环境;
- 本地JDK(JDK17),Maven,Idea等;
2.2 准备一个springboot工程
如下在本地创建一个springboot工程
2.2.1 准备几个测试接口
方便后面的测试效果
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DockerController {//localhost:8081/test@GetMapping("/test")public String test(){return "docker test";}}
本地启动之后,确保接口能够正常调用
2.3 准备Dockerfile文件
在resources目录下添加一个Dockerfile文件,内容如下:
FROM openjdk:17-jdk-alpine
ADD ./boot-docker.jar /app/boot-docker.jar
ENTRYPOINT ["java", "-jar", "/app/boot-docker.jar"]
2.4 打包上传到服务器
使用maven命令对上面的工程打包,将jar包上传到服务器目录
为了确保可用,使用java -jar命令启动一下
三、制作微服务镜像与运行服务镜像
使用docker的方式运行微服务,首先需要基于Dockerfile文件将原始的服务jar包制作成镜像,参考下面的操作过程
3.1 拷贝Dockerfile文件到服务器
在服务器目录与jar包同目录下,创建一个Dockerfile文件,将上述Dockerfile的内容拷贝进去
3.2 制作服务镜像
使用下面的命令,将本次的微服务jar包制作成docker镜像
-
这里有个前提,需要服务器提前安装好docker compose组件,否则无法使用这个命令;
docker build -t boot-docker:1.0 .
执行成功后,通过docker imags命令检查微服务镜像是否生成
3.3 启动镜像服务
使用下面的命令启动第一个镜像服务
docker run -d -it -p 8081:8081 --name=boot-docker-1 boot-docker:1.0
3.4 访问一下服务接口
访问工程中预留的接口,看到如下效果,说明服务正常启动可用了
四、配置负载均衡
目前在项目中使用nginx作为路由转发,负载均衡的配置非常普遍,下面就以nginx为例进行说明。
4.1 源码包方式安装nginx
4.1.1 下载nginx安装包
使用下面的命令下载
wget http://nginx.org/download/nginx-1.20.2.tar.gz
4.1.2 解压安装包
执行下面的命令
tar -zxvf nginx-1.20.2.tar.gz -C /usr/local/src/
4.1.3 进入解压后的安装包目录
cd /usr/local/src/nginx-1.20.2
4.1.4 编译安装
依次执行下面的命令
./configuremakemake install
执行过程
4.1.5 启动nginx
切换到nginx的安装目录
cd /usr/local/nginx
执行下面的命令,启动nginx服务
./sbin/nginx
4.1.6 检查nginx服务是否启动成功
ps -ef | grep nginx
4.1.7 访问nginx主页
如果能够正常启动,访问下80端口,看到下面的效果说明nginx服务启动成功
4.1.8 nginx其他命令补充
这里补充一下其他的几个nginx常用命令
nginx -s reload # 重新载入配置文件
nginx -s reopen # 重启 Nginx
nginx -s stop # 停止 Nginx
4.2 启动另外两个微服务容器
参照2.3 的方式,再启动另外两个服务镜像,使用不同的端口进行区分
docker run -d -it -p 8082:8081 --name=boot-docker-2 boot-docker:1.0
docker run -d -it -p 8083:8081 --name=boot-docker-3 boot-docker:1.0
通过docker ps命令,可以看到三个镜像服务都正常启动了
依次访问一下各自的服务接口,确保可以正常使用
第一个服务
第二个服务
第三个服务
4.3 配置负载均衡
上面的服务环境和nginx服务启动之后,接下来就可以配置负载均衡了
4.3.1 配置nginx负载均衡
将下面的配置信息拷贝到nginx.conf文件中
upstream backend {server 101.221.34.177:8081;server 101.221.34.177:8082;server 101.221.34.177:8083;}server {listen 80;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
配置完成之后,注意重启nginx
4.3.2 负载均衡效果验证
在上面的配置中,配置监听80端口,然后直接被路由到各个服务模块,各个服务模块直接访问自身的默认的那个接口,我们可以通过查看日志观察效果,上述负载均衡的配置中,没有指定具体的方式,默认采用轮询的策略
第一次访问:
第二次访问:
第三次访问:
4.4 固定微服务容器IP的方式配置负载均衡
在上述的操作中,采用的方式是基于同一个原始镜像,启动多个容器的方式,最后配置负载均衡的效果,在目前金仓的部署方式中,各个微服务容器采用的是固定IP的形式启动的,下面再补充一下这种方式的配置过程。
4.4.1 创建一个docker网络
使用下面的命令自定义一个docker网络
-
指定的IP段根据服务器自身的情况设置
docker network create --subnet=192.168.100.0/24 my_custom_network
4.4.2 使用指定IP的方式启动三个微服务容器
依次执行下面的命令
docker run -d -it -p 8085:8081 --name boot-docker-5 --network my_custom_network --ip 192.168.100.10 boot-docker:1.0
docker run -d -it -p 8086:8081 --name boot-docker-6 --network my_custom_network --ip 192.168.100.11 boot-docker:1.0
docker run -d -it -p 8087:8081 --name boot-docker-7 --network my_custom_network --ip 192.168.100.12 boot-docker:1.0
4.4.3 测试访问服务接口
访问工程中预留的接口,看到如下效果,说明服务正常启动可用了
4.4.4 配置nginx负载均衡
只需要修改一下upstream中的信息即可
upstream backend {server 192.168.100.10:8085;server 192.168.100.11:8086;server 192.168.100.12:8087;}server {listen 80;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
4.5 使用Docker Compose配置负载均衡
4.5.1 创建docker网络
使用自定义的网络,可以确保微服务和nginx的容器在同一个网络域
docker network create --driver bridge --subnet=172.19.0.0/24 network1
4.5.2 创建nginx.conf配置文件
自定义一个nginx.conf配置文件,用于在启动nginx容器的时候作映射,可以直接拷贝上面的做简单的修改使用,关键是负载均衡那里的配置
upstream backend {server 172.19.0.5:8085;server 172.19.0.6:8086;}server {listen 80;location / {proxy_pass http://backend;#proxy_pass http://192.168.100.10:8085;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
4.5.3 创建docker-compose文件
在nginx.conf相同的目录下创建一个docker-compose文件
参考下面的配置信息,将其拷贝到docker-compose.yml文件中
version: '3'
services:app1:image: boot-docker:1.0container_name: boot-docker-5networks:network1:ipv4_address: 172.19.0.5ports:- "8085:8081"app2:image: boot-docker:1.0container_name: boot-docker-6networks:network1:ipv4_address: 172.19.0.6ports:- "8086:8081"nginx:image: nginx:alpinevolumes:- ./nginx.conf:/etc/nginx/nginx.confports:- "80:80"depends_on:- app1- app2networks:network1:ipv4_address: 172.19.0.7networks:network1:external: true
4.5.4 启动容器
执行下面的命令启动微服务容器,和nginx
docker-compose up -d
验证下是否启动成功
五、写在文末
本文通过实际操作详细演示了如何基于springboot制作微服务镜像,以及开启多个微服务容器配置nginx负载均衡的过程,希望对看到的同学有用哦,本篇到此结束,感谢观看。
相关文章:
【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
目录 一、前言 二、前置准备 2.1 基本环境 2.2 准备一个springboot工程 2.2.1 准备几个测试接口 2.3 准备Dockerfile文件 2.4 打包上传到服务器 三、制作微服务镜像与运行服务镜像 3.1 拷贝Dockerfile文件到服务器 3.2 制作服务镜像 3.3 启动镜像服务 3.4 访问一下服…...
【Linux系统】从 C 语言文件操作到系统调用的核心原理
文章目录 前言lesson 15_基础IO一、共识原理二、回顾C语言接口2.1 文件的打开操作2.2 文件的读取与写入操作2.3 三个标准输入输出流 三、过渡到系统,认识文件系统调用3.1 open 系统调用1. 比特位标志位示例 3.2 write 系统调用1. 模拟实现 w 选项2. 模拟实现 a 选项…...
俄罗斯方块算法
俄罗斯方块是一款风靡全球 38 年的经典益智游戏,凭借其简单易学但难于精通的特点,成为游戏史上的不朽之作。 游戏界面与规则 游戏界面为 20 行10 列的可视区域。横向 X 轴区间为 [0,9],共 10 列;纵向 Y 轴区间为 [0&a…...
Node.js 循环依赖问题详解:原理、案例与解决方案
文章目录 一、什么是循环依赖?二、循环依赖的典型表现三、解决方案四、如何检测循环依赖五、循环依赖的隐藏危害 一、什么是循环依赖? 当两个或者多个模块互相直接或者间接引用时,就会形成循环依赖。例如: A.js → 依赖 → B.js…...
Linux系统编程——vfork函数的使用方法以及与fork函数的区别
vfork() 是 Linux 系统编程中与 fork() 类似的系统调用,用于创建一个新的子进程。它们都能创建子进程,但在实现机制和使用场景上有明显区别。 以下是对 vfork() 的详细介绍,包括: 使用方法 注意事项 与 fork() 的联系与区别 使…...
.NET 无侵入自动化探针原理与主流实现详解
目录 引言 一、.NET 无侵入自动化探针的原理 1.1 CLR Profiling API 核心机制 示例代码 1.2 CLR Instrumentation 核心机制 示例代码 1.3 反射和动态代理 核心机制 示例代码 1.4 DiagnosticSource 核心机制 示例代码 二、主流实现与工具 2.1 AppDynamics 实现原…...
大数据:新能源汽车宇宙的未来曲率引擎
** 发布日期:2025-05-14** 关键词:大数据、新能源、机器学习、碳中和、CSDN爆款 1. 大数据科普:定义、特征与技术核心 1.1 什么是大数据? 大数据(Big Data)指规模巨大、类型多样、生成速度快且价值密度低…...
创建你的第一个MCP服务
创建你的第一个MCP服务 Model Context Protocol (MCP) 中国天气查询服务创建教程 什么是 Model Context Protocol (MCP) Model Context Protocol (MCP) 是一种开放标准协议,允许大型语言模型(LLM)如 Claude 与外部系统和数据源进行交互。通…...
说一说Node.js高性能开发中的I/O操作
众所周知,在软件开发的领域中,输入输出(I/O)操作是程序与外部世界交互的重要环节,比如从文件读取数据、向网络发送请求等。这段时间,也指导项目中一些项目的开发工作,发现在Node.js运用中&#…...
小白入门:GitHub 远程仓库使用全攻略
一、Git 核心概念 1. 三个工作区域 工作区(Working Directory):实际编辑文件的地方。 暂存区(Staging Area):准备提交的文件集合(使用git add操作)。 本地仓库(Local…...
Protobuf3协议关键字详解与应用实例
一、核心语法与基础关键字 syntax 声明协议版本,必须为文件的第一行非空、非注释内容。 syntax "proto3"; // 显式指定proto3语法,否则编译器默认使用proto2message 定义消息类型,包含一组结构化字段。支持嵌套消息定义ÿ…...
阿克曼-幻宇机器人系列教程3- 机器人交互实践(Message)
上一篇文章介绍了如何通过topic操作命令实现与机器人的交互,本篇我们介绍如何通过Message(即topic的下一级)实现与机器人的交互。 和topic一样,首先在一个终端通过ssh命令登录机器人、启动机器人,然后打开另外一个终端…...
Leetcode刷题 | Day63_图论08_拓扑排序
一、学习任务 拓扑排序代码随想录 二、具体题目 1.拓扑排序117. 软件构建 【题目描述】 某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依…...
[Harmony]获取资源文件中.txt文件中的字符串
txt文件 src/main/resources/rawfile/userInfo.txt {"Code": 200,"Msg": "登录成功","RetData": {"Name": "shq","Phone": "18511111111","PostName": "按摩技师",&qu…...
matlab多项式
1. 多项式表示 多项式用行向量表示,按降幂排列系数。例如,多项式 3x22x1 表示为 [3 2 1]。 2. 创建多项式 直接输入系数:如 p [1 -3 3 -1] 表示 x3−3x23x−1。由根创建:使用 poly 函数。例如,根为 [1, 1, 1]&…...
手搓传染病模型(SEI - SEIAR )
在传染病防控的前沿研究中,构建精准的数学模型对于理解疾病传播机制、预测疫情走势以及制定有效干预策略至关重要。SEI - SEIAR 模型(易感媒介 \(S_m\) - 潜伏媒介 \(E_m\) - 感染媒介 \(I_m\) - 易感人群 S - 潜伏人群 E - 有症状感染者 I - 无症状感染…...
Ubuntu 安装 Redis
1. 下载 redis 下载地址:https://github.com/redis/redis 2. 解压 redis 把下载的软件包,上传到服务器的 /usr/local 目录中,执行解压命令 tar -zxvf redis-8.0.1.tar.gz 3. 安装 redis 安装依赖 sudo apt-get updatesudo apt-get ins…...
【QGIS二次开发】地图显示与交互-03
系列目录: 【QGIS二次开发】地图显示与交互-01_qgis二次开发加载地图案例-CSDN博客 【QGIS二次开发】地图显示与交互-02_setlayerlabeling-CSDN博客 3. 地图符号与色表 3.1 矢量图层符号设置 任务要求:双击图层树节点,实现图层中图元的符…...
28、动画魔法圣典:Framer Motion 时空奥义全解——React 19 交互动效
"在数字世界的夹缝中,存在着连接现实与虚拟的魔法纽带——这便是 Framer Motion 的时空秘术。" ——《前端魔法师手札卷七》 一、时空裂隙动画 - FLIP量子跃迁术 1. FLIP时空扭曲原理 <motion.divlayout // 开启时空裂隙transition{{type: "spr…...
Ken Thompson 和 Dennis Ritchie
Ken Thompson(肯汤普逊)和Dennis Ritchie(丹尼斯里奇)是计算机科学领域的两位传奇人物,他们对现代计算机技术的发展产生了深远影响。以下是关于他们的详细介绍: 1. Ken Thompson 出生&am…...
SQL:MySQL函数:条件函数(Conditional Functions)
目录 什么是条件函数? 常用 MySQL 条件函数总览表 1️⃣ IF() – 条件判断函数(If Statement) 2️⃣ IFNULL() – 空值判断与替代函数(If Null) 3️⃣ NULLIF() – 相等返回 NULL(Null If Equal&#…...
初识Linux · IP分片
目录 前言: IP分片 分片vs不分片 如何分片 分片举例 三个字段 前言: 前文IP协议上和IP协议下我们已经把IP协议的报头的大多数字段介绍了,唯独有三个字段现在还有介绍,即16位标识,8位协议,13位片偏移…...
TCP 粘包
一、粘包问题详解 1. 粘包的概念 定义: 指在 TCP 通信中,由于发送方和接收方的读写速度、数据量不一致,导致多个数据包被错误地合并成一个数据包处理的现象。产生原因: TCP 是流式协议(无边界)࿰…...
第一个优化
agent项目 tool 调用外部服务时 选择了指数回避的重试机制 优化点:延迟时间那 加了一个随机的时间抖动 指数回避 我第一眼看到 这不就是 tcp重连机制吗 其实就是 如果当时网络波动 网况不好 || 服务正忙 ,可以不急着在这个时候选择多次重试,…...
LabVIEW的CAN通讯测试程序
该程序是基于 NI LabVIEW 平台开发的 CAN(Controller Area Network,控制器局域网)通讯测试程序。主要功能是对 CAN 通讯过程进行模拟、数据传输与验证,确保 CAN 通讯的正常运行和数据的准确传输。 程序详细说明 接口选择ÿ…...
视频质量分析时,遇到不同分辨率的对照视频和源视频,分辨率对齐的正确顺序。
背景 我们平时在做视频转码后,会用VMAF/PSNR得评分工具进行视频对比的评分,但是这几种客观评分方式都有一个要求就是分辨率要一模一样,因为这样才对像素点做数学运算。 但是分辨率对齐其实有两种选择,例如源视频是1080P…...
Kotlin并发请求的一些知识记录
private suspend fun fetchDataConcurrently(list: MutableList<MyType>,onRequestResult: (Int, List<MyType>?) -> Unit //高阶函数回调) {val deferredList mutableListOf<Deferred<MyType?>>()// 设定任务超时时间为12秒,并使用 …...
Ubuntu 编译SRS和ZLMediaKit用于视频推拉流
SRS实现视频的rtmp webrtc推流 ZLMediaKit编译生成MediaServer实现rtsp推流 SRS指定某个固定网卡,修改程序后重新编译 打开SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp,在 232 行后面添加: ZLMediaKit编译后文件存放在ZLMediakit/rele…...
typora免费获取序列号
这个方法不是唯一,但是所需要的时长很短。废话不多说 1.下载网盘文件 通过网盘分享的文件:typora破解 链接: https://pan.baidu.com/s/1KQnSUV3V0uBGpLc_iz2UFQ?pwdetc4 提取码: etc4 2.把解压下来的文件放到装软件的文件夹 3. 打开cmd,…...
C++23 新增的查找算法详解:ranges::find_last 系列函数
文章目录 引言C Ranges 库简介ranges::find_last、ranges::find_last_if 和 ranges::find_last_if_not 概述ranges::find_last示例代码代码解释 ranges::find_last_if函数签名参数解释示例代码代码解释 ranges::find_last_if_not示例代码代码解释 使用场景总结 引言 在 C 的发…...
11.基础IO(上)
一、文件概念 对文件归类认知: 对于 0KB 的空文件是占用磁盘空间的 文件是文件属性(元数据)和文件内容的集合(文件 属性(元数据) 内容) 所有的文件操作本质是文件内容操作和文件属性操作。 …...
本地部署Firecrawl+Dify调用踩坑记录
最近自己研究Dify,使用到Firecrawl这个比较好用的工具。用Firecrawl官网的不知道为什么总是卡住得不到结果,于是我打算自己去本地部署一个。好家伙真给我人搞麻了,太多问题了。 我是在京东云上面租的一台服务器。 首先就是docker的安装&…...
硬盘坏了电脑会出现哪些明显现象?机械和固态可不一样
机械硬盘(HDD)损坏的常见表现 >启动异常:如果是启动盘,可能会遭遇系统无法启动,提示“No Bootable Device”“Operating System not found”或“Sector not found”等错误;以及BIOS无法识别硬盘&#x…...
数据驱动下的具身智能进化范式
数据驱动技术与挑战...
使用Python与正则表达式高效提取Excel中的票号数据
使用Python与正则表达式高效提取Excel中的票号数据 一、需求 本文将介绍如何利用Python的Pandas库和正则表达式,快速实现票号这一数据清洗任务,并将结果整理为规范的表格结构。 在数据处理场景中,从非结构化文本里提取特定格式的信息是常见…...
MySQL 迁移至 Doris 最佳实践方案
在数据架构不断演进的背景下,从 MySQL 迁移至 Doris 成为许多企业提升数据处理效率的关键选择。本文将深入剖析三种经过实践验证的 MySQL 迁移至 Doris 的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于 CDC(Change Data Capture&#x…...
2025长三角杯数学建模A题思路模型代码:智能手机产品设计优化与定价问题
2025长三角杯数学建模A题思路模型代码,详细内容见文末名片 一、问题背景 在 2025 年第五届长三角高校数学建模竞赛中,赛题 A 聚焦于智能手机产品设计优化与定价这一极具现实意义的问题。如今的智能手机市场,可谓是一片硝烟弥漫的“战场”&a…...
【hadoop】Kafka 安装部署
一、Kafka安装与配置 步骤: 1、使用XFTP将Kafka安装包kafka_2.12-2.8.1.tgz发送到master机器的主目录。 2、解压安装包: tar -zxvf ~/kafka_2.12-2.8.1.tgz 3、修改文件夹的名字,将其改为kafka,或者创建软连接也可࿱…...
网络安全EN18031-1,EN18031-2,EN18031-3三个标准对应的测试项目
EN18031-1,EN18031-2,EN18031-3三个标准有什么区别 EN18031-1、EN18031-2和EN18031-3三个标准分别针对不同的安全要求和应用场景,具体区别如下: EN18031-1:主要关注网络安全防护,特别是防止DDoS攻击和确保安全通信协议的…...
React与Docker中的MySQL进行交互
完整结构 1. 项目结构设置 首先创建项目: npm create vitelatest . --template react cd . npm install2. 设置Docker中的MySQL 创建docker-compose.yml文件(与之前相同): version: 3.8 services:mysql:image: mysql:8.0conta…...
量子隧穿:PROFINET到Ethernet ip的无损耗协议转换方案转
在本季度的生产工作中,我们成功实现了仓储物流自动化分拣系统中的关键技术突破。我们面临的主要挑战是将采用EtherNet/IP协议的输送带控制器与PROFINET协议的上位系统进行有效通信。通过引入ethernet IP转PROFINET网关倍讯科技BX-606-EIP,我们实现了输送…...
W1R3S: 1.0.1靶场
W1R3S: 1.0.1 来自 <W1R3S: 1.0.1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.249 3,对靶机进行端口…...
pycharm中qthread中的run函数debug不上的问题
先说结论 在风和日丽的一天,我尝试把我mac上的代码拿到windows修改。突然遇到了个bug,然后想着对几个线程内部的run函数逐一debug。 结果一开线程,整个线程仍然继续报错,run函数的第一行都不停断点。甚至,我加了个pr…...
深度解析IP静态的工作原理,IP静态的应用场景又哪些?
一、什么是IP静态? 当我们谈到“IP静态”时,大家可能首先想到的是与“动态IP”相对的概念。确实如此,静态IP是一种固定分配的IP地址,也就是说,在特定时间内,分配给你的IP地址不会有所更改——无论你完成多…...
Electron 应用的升级机制详解
在产品分发给用户之后,进入迭代周期是不可避免的过程。开发者需要为产品增加新功能、修复Bug,并推出新版本。如何将这些更新有效地分发给用户,是产品经理和开发人员共同关注的问题。本节将从开发者的角度出发,详细介绍Electron应用的两种常见升级方式:全量升级与增量升级。…...
Java 开源报表系统全解析:免费工具、企业案例与集成实践
在企业级数据可视化与报表开发中,选择一款功能强大且完全免费的开源报表系统至关重要。本文深度剖析 5 款经过权威验证的免费开源 Java 报表工具,涵盖图表展示、定制化及第三方集成能力,附企业级案例与技术实践,助您高效选型。 一…...
[原创](现代Delphi 12指南):[macOS 64bit App开发]: 注意“回车换行“的跨平台使用.
[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…...
分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现
分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现 目录 分类预测 | Matlab实现ABC-Transformer人工蜂群算法优化编码器多特征分类预测/故障诊断Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现ABC-…...
Java中的设计模式
一、工厂方法模式 1.1 简单工厂模式 1.1.1 案例引入 比方说我们要设计一个披萨店的点单程序,披萨店有水果披萨,有芝士披萨,两种类型,选择哪个披萨,只需要创建那个类型的披萨对象即可。 package org.example;import…...
NSSCTF [GFCTF 2021]where_is_shell
889.[GFCTF 2021]where_is_shell(system($0)64位) [GFCTF 2021]where_is_shell (1) 1.准备 motalymotaly-VMware-Virtual-Platform:~$ file shell shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.s…...