Golang 遇见 Kubernetes:云原生开发的完美结合
Golang 和 Kubernetes 简介
Golang 概述
Golang,也称为 Go,是由 Google 开发的一种开源编程语言。Go 由 Robert Griesemer、Rob Pike 和 Ken Thompson 设计,于 2009 年首次发布,此后在各个领域都获得了广泛的关注,尤其是在服务器端应用程序、云计算和微服务领域。
Golang 的主要特点
1. 简洁高效:
- Golang 的设计理念是简洁,语法简洁,注重可读性和易用性。这使得它成为初学者和经验丰富的开发人员的理想选择,能够快速学习和开发。
2. 并发性:
- Golang 的一大突出特点是它通过 goroutine 和 channel 内置了对并发的支持。goroutine 是由 Go 运行时管理的轻量级线程,允许开发人员同时执行多个任务,而无需承担传统线程模型带来的开销。这使得它特别适合需要高并行度的应用程序,例如 Web 服务器和实时数据处理。
3. 性能:
- Go 专为高性能而设计,其编译型架构可将代码直接转换为机器码。与解释型语言相比,这可以缩短执行时间。此外,Go 的垃圾回收系统非常高效,在内存管理和性能之间实现了良好的平衡。
4. 强类型和可组合性:
- Golang 拥有强大的静态类型系统,提供编译时类型检查,从而降低运行时错误的可能性。这有助于编写更健壮的代码并增强重构能力。此外,Go 支持组合而非继承,允许开发人员使用更简单的组件构建复杂的系统,从而增强代码的可重用性。
5. 标准库:
- Golang 拥有丰富的标准库,其中包含用于处理 Web 服务器、文件操作和数据格式等功能的软件包。这个丰富的库使开发人员无需依赖外部依赖即可实现功能,从而加快了开发过程。
6. 跨平台:
- Go 天生具备跨平台特性,使开发者能够构建可在各种操作系统(包括 Linux、Windows 和 macOS)上运行的应用程序。Go 能够通过单一代码库编译出适用于各种平台的二进制文件,这为其提供了便利。
7. 社区和生态系统:
- 自发布以来,Golang 就拥有一个强大而活跃的社区。Go 生态系统不断发展壮大,通过 Go Module 系统提供了众多库、框架和工具,简化了包管理和依赖项解析。
8. 工具:
- Go 附带一套优秀的工具,支持测试、性能分析和代码格式化,确保开发者能够轻松维护高质量的代码库。`go` 命令是一个强大的工具,可以帮助管理依赖项、编译代码和运行测试。
Golang 已成为现代软件开发的强大语言,尤其是在云原生环境和分布式系统中。 Golang 注重简洁性、性能和高效的并发性,使其成为构建可扩展且可维护应用程序的组织的首选。无论您是开发微服务、处理高性能应用程序还是执行自动化任务,Golang 都能提供丰富的特性和功能,满足您广泛的开发需求。
Kubernetes 简介
Kubernetes,通常缩写为 K8s,是一个开源容器编排平台,最初由 Google 开发。Kubernetes 于 2014 年发布,可自动部署、扩展和管理容器化应用程序。它已迅速成为管理云原生应用程序的基础工具,帮助企业优化资源利用率并提升运营工作流程的自动化程度。
Kubernetes 的用途
Kubernetes 旨在管理跨机器集群的容器化应用程序,确保这些应用程序保持可用性、可扩展性和弹性。Kubernetes 的主要用途包括:
1. 容器编排:
- Kubernetes 自动部署容器化应用程序,管理集群中物理机或虚拟机上的容器调度,优化资源分配,并处理容器的启动和管理。
2. 扩展和负载均衡:
- Kubernetes 支持根据需求对应用程序进行水平扩展。它可以根据不断变化的工作负载自动扩展活动容器实例数量,确保应用程序能够高效地处理不同的负载。此外,Kubernetes 还提供内部负载均衡功能,以便在容器实例之间分配流量。
3. 自我修复:
- Kubernetes 监控容器的健康状况,并在容器发生故障时自动重启或替换容器。这种自我修复功能可增强应用程序的可靠性并最大限度地减少停机时间。
4. 服务发现和网络:
- Kubernetes 提供内置的服务发现功能,使容器之间更容易通信。它为一组容器分配 IP 地址和单个 DNS 名称,使应用程序能够相互发现并无缝通信。
5. 声明式配置:
- Kubernetes 采用声明式方法进行配置和管理。用户定义应用程序的期望状态,Kubernetes 负责维护该状态。这种方法简化了部署和管理,同时允许更轻松地进行更改和回滚。
6. 存储编排:
- Kubernetes 可以管理容器化应用的存储资源,支持使用各种类型的持久化存储,包括云存储和本地存储。这种灵活性使应用程序即使在部署和重新部署容器时也能保持状态。
随着企业越来越多地采用云原生架构,Kubernetes 的重要性也随之提升,原因如下:
1. 微服务架构:
- Kubernetes 支持微服务模型,允许开发人员构建和部署由松散耦合服务组成的应用程序。这种架构增强了服务的灵活性、可扩展性和独立部署能力。
2. 多云策略:
- Kubernetes 为跨不同云提供商和本地环境运行应用程序提供了一个一致的平台。此功能使企业能够采用多云策略,在保持运营一致性的同时利用各种云服务。
3. DevOps 和 CI/CD:
- Kubernetes 与 DevOps 实践无缝集成,促进持续集成和持续部署 (CI/CD) 流水线的构建。其自动化功能可加快更新和部署速度,从而有助于缩短软件交付和开发周期。
4. 资源管理:
- 在基础设施成本不断上涨的时代,Kubernetes 通过确保应用程序仅在需要时运行,并根据需求动态管理资源分配,帮助优化资源使用率。
5. 社区和生态系统:
- Kubernetes 社区充满活力且发展迅速,其工具和扩展程序生态系统不断发展壮大,增强了其功能。Helm(用于包管理)和 Istio(用于服务网格)等热门项目充分展现了 Kubernetes 的灵活性和可扩展性。
6. 来自主要云提供商的支持:
- 包括 Google Cloud、AWS 和 Azure 在内的领先云提供商提供托管 Kubernetes 服务,使组织能够更轻松地部署和管理 Kubernetes 集群,而无需承担维护成本。这种支持显著降低了希望采用云原生实践的组织的准入门槛。
设置开发环境
安装 Golang 并设置 Go 工作区
安装 Golang
1.1 下载 Go
- 访问 Go 官方网站:[https://golang.org/dl/](https://golang.org/dl/)
- 下载适合您操作系统的二进制发行版。Go 支持 Windows、macOS 和 Linux。
1.2 安装 Go
- Windows:
- 运行下载对应的.msi安装程序,并按照提示完成安装。
- macOS:
- 打开终端并使用 Homebrew 软件包管理器:
bash
brew install go
- 或者,如果您下载的是 macOS 二进制文件,请打开下载的文件并将 Go 图标拖放到 `/usr/local` 目录中。
- Linux:
- 解压下载的 tarball。
tar -C /usr/local -xzf go1.17.linux-amd64.tar.gz
- 将 go1.17.linux-amd64.tar.gz 替换为您下载的版本。
- 将 /usr/local/go/bin添加到您的 PATH 环境变量中。您可以通过在 .bash_profile、bashrc或 .zshrc文件中添加以下行来实现:
export PATH=$PATH:/usr/local/go/bin
- 编辑文件后,运行:
source ~/.bashrcsource ~/.bash_profilesource ~/.zshrc
1.3 验证安装
通过在终端中运行以下命令来验证 Go 是否已正确安装:
ninjamac@192 key % go version
go version go1.24.0 darwin/arm64
这将显示已安装的 Go 版本。
设置 Go 工作区
Go 已从传统的 GOPATH 工作区模型转变为基于模块的方法,从而简化了依赖项管理。但是,如果您愿意,仍然可以设置 GOPATH 工作区。
2.1 创建 Go 工作区
如果您使用 Go 模块,则无需创建 GOPATH 工作区,但您可以按照以下方法设置:
1. 定义您的 GOPATH:
- 默认情况下,GOPATH 在 Unix 系统上设置为“$HOME/go”,在 Windows 系统上设置为“%USERPROFILE%\go”。您可以通过设置“GOPATH”环境变量来更改此设置。
2. 创建工作区目录:
创建工作区目录结构。打开终端并运行:
mkdir -p $HOME/go/{bin,pkg,src}
ninjamac@192 ~ % tree -d -L 3 go/
go/
├── bin
├── pkg
│ ├── mod
│ │ ├── al.essio.dev
│ │ ├── cache
│ │ ├── cloud.google.com
│ │ ├── github.com
│ │ ├── go.opencensus.io@v0.23.0
│ │ ├── go.opentelemetry.io
│ │ ├── go.starlark.net@v0.0.0-20231101134539-556fd59b42f6
│ │ ├── go.starlark.net@v0.0.0-20250205221240-492d3672b3f4
│ │ ├── go.uber.org
│ │ ├── golang.org
│ │ ├── gomodules.xyz
│ │ ├── google.golang.org
│ │ ├── gopkg.in
│ │ ├── honnef.co
│ │ ├── k8s.io
│ │ ├── mvdan.cc
│ │ └── sigs.k8s.io
│ └── sumdb
│ └── sum.golang.org
└── src├── github.com│ └── cncamp├── my-bak├── my-pipeline-tutorial-project├── myproject│ ├── cmd│ ├── internal│ ├── pkg│ └── test└── pipeline-tutorial├── blog├── docs├── node_modules├── src└── static39 directories
- bin:用于编译后的二进制文件
- pkg:用于编译后的包对象
- src:用于源文件
3. 设置 GOPATH 环境变量:
将以下内容添加到您的配置文件中:
对于 Linux/macOS,请将以下行添加到您的 .bash_profile、.bashrc 或 .zshrc 中:
export GOROOT="/opt/homebrew/Cellar/go/1.24.0/libexec"
export GOPATH="/Users/ninjamac/go"
export GOPROXY="https://goproxy.cn"
对于 Windows,请在系统设置中的环境变量中进行设置:
- 前往系统属性 -> 环境变量 -> 用户变量,创建一个名为 `GOPATH` 的新变量,值为 C:\Users\YourUsername\go。
2.2 创建 Go 项目
1. 导航到 src 目录:
cd $GOPATH/src
2. 为你的项目创建一个新目录:
mkdir hello
cd hello
3. 创建你的 Go 文件:
创建一个名为 main.go的新文件:
touch main.go
4. 编写你的第一个 Go 程序:
使用你最喜欢的文本编辑器打开 main.go并添加以下代码:
package mainimport "fmt"func main() {
fmt.Println("Hello, World!")
}
5. 构建并运行你的程序:
要运行你的 Go 程序,请在项目目录中执行以下命令:
ninjamac@192 hello % go run main.go
Hello, World!
要构建你的项目,请使用go build,这将创建一个名为 `hello` 的可执行二进制文件,你可以使用以下命令运行它:./hello
ninjamac@192 hello % go build
ninjamac@192 hello % ./hello
Hello, World!
恭喜!你已成功安装 Go
安装和配置Minikube
- macos
brew install minikube
2. linux
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-Linux-amd64
sudo chmod +x minikube
sudo mv minikube /usr/local/bin/
安装 Go 开发的工具和 IDE(vscode goland)
具体安装步骤请参考网站上的链接,在此不在赘述。
构建简单的 Go 应用程序
使用 Go 创建基本的 REST API
1. 创建go-rest-api目录
mkdir go-rest-api
cd go-rest-api
2. 初始化go module
go mod init go-rest-api
3. 编写main.go文件
package mainimport ("encoding/json""net/http""sync"
)type User struct {ID string `json:"id"`Name string `json:"name"`
}var (users = make(map[string]User)mu sync.MutexnextID = 1
)// Get all users
func getUsers(w http.ResponseWriter, r *http.Request) {mu.Lock()defer mu.Unlock()var userList []Userfor _, user := range users {userList = append(userList, user)}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(userList)
}// Create a new user
func createUser(w http.ResponseWriter, r *http.Request) {mu.Lock()defer mu.Unlock()var newUser Userif err := json.NewDecoder(r.Body).Decode(&newUser); err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}newUser.ID = string(nextID)users[newUser.ID] = newUsernextID++w.WriteHeader(http.StatusCreated)json.NewEncoder(w).Encode(newUser)
}// Get a single user by ID
func getUser(w http.ResponseWriter, r *http.Request) {mu.Lock()defer mu.Unlock()id := r.URL.Path[len("/users/"):]user, exists := users[id]if !exists {http.Error(w, "User not found", http.StatusNotFound)return}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(user)
}func main() {http.HandleFunc("/users", getUsers)http.HandleFunc("/users/", getUser) // Note the trailing slash for single userhttp.HandleFunc("/users/create", createUser) // Route for creating a userhttp.ListenAndServe(":8080", nil)
}
4:运行 API
要运行您的 API,请在终端中执行以下命令:
go run main.go
您的 REST API 将启动并监听 http://localhost:8080
curl http://localhost:8080/users //查询所有的用户
ninjamac@ip-192-168-1-101 ~ % curl http://localhost:8080/users | jq .% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed
100 117 100 117 0 0 86156 0 --:--:-- --:--:-- --:--:-- 114k
[{"id": "4","name": "li si"},{"id": "1","name": "Test User"},{"id": "2","name": "John Doe"},{"id": "3","name": "Zhang San"}
]
容器化 Go 应用程序
Docker 安装
编写dockerfile
# syntax=docker/dockerfile:1FROM golang:1.24-alpine AS builderWORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN go build -o main .FROM alpine:3.19WORKDIR /appCOPY --from=builder /app/main .EXPOSE 8088CMD ["./main"]
构建镜像
[ec2-user@ip-172-31-6-119 go-rest-api]$ sudo docker build -t my-gin-app .
[+] Building 36.5s (17/17) FINISHED docker:default=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 431B 0.0s=> [internal] load metadata for docker.io/library/alpine:3.19 1.3s=> [internal] load metadata for docker.io/library/golang:1.24-alpine 1.3s=> [auth] library/alpine:pull token for registry-1.docker.io 0.0s=> [auth] library/golang:pull token for registry-1.docker.io 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [builder 1/6] FROM docker.io/library/golang:1.24-alpine@sha256:7772cb5322baa875edd74705556d08f0eeca7b9c4b5367754ce3f2f00041ccee 0.0s=> [internal] load build context 0.0s=> => transferring context: 2.36kB 0.0s=> [stage-1 1/3] FROM docker.io/library/alpine:3.19@sha256:e5d0aea7f7d2954678a9a6269ca2d06e06591881161961ea59e974dff3f12377 0.0s=> CACHED [builder 2/6] WORKDIR /app 0.0s=> CACHED [builder 3/6] COPY go.mod go.sum ./ 0.0s=> CACHED [builder 4/6] RUN go mod download 0.0s=> [builder 5/6] COPY . . 0.1s=> [builder 6/6] RUN go build -o main . 34.8s=> CACHED [stage-1 2/3] WORKDIR /app 0.0s=> [stage-1 3/3] COPY --from=builder /app/main . 0.0s=> exporting to image 0.1s=> => exporting layers 0.1s=> => writing image sha256:f29bf2f7daa960b15ae094b16901b36eba8456f4702e5ea0544f3233e0707197 0.0s=> => naming to docker.io/library/my-gin-app
运行容器
[ec2-user@ip-172-31-6-119 go-rest-api]$ sudo docker run -p 8088:8088 my-gin-app
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.- using env: export GIN_MODE=release- using code: gin.SetMode(gin.ReleaseMode)[GIN-debug] GET /albums --> main.getAlbums (3 handlers)
[GIN-debug] GET /albums/:id --> main.getAlbumByID (3 handlers)
[GIN-debug] POST /albums --> main.postAlbums (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8088
[GIN] 2025/04/27 - 02:48:51 | 200 | 51.359µs | 172.17.0.1 | GET "/albums"
[GIN] 2025/04/27 - 02:49:39 | 200 | 21.679µs | 172.17.0.1 | GET "/albums/1"
测试验证
[ec2-user@ip-172-31-6-119 ~]$ curl http://localhost:8088/albums
[{"id": "1","title": "Blue Train","artist": "John Coltrane","price": 56.99},{"id": "2","title": "Jeru","artist": "Gerry Mulligan","price": 17.99},{"id": "3","title": "Sarah Vaughan and Clifford Brown","artist": "Sarah Vaughan","price": 39.99}
将 Go 应用程序部署到 Kubernetes
将镜像上传到docker hub
[ec2-user@ip-172-31-6-119 go-rest-api]$ sudo docker tag my-gin-app:latest rockwang415/my-gin-app:latest
[ec2-user@ip-172-31-6-119 go-rest-api]$ sudo docker push rockwang415/my-gin-app:latest
The push refers to repository [docker.io/rockwang415/my-gin-app]
69f968e9f6bc: Pushed
36ee67fc0b34: Pushed
0499fc56f5e2: Mounted from library/alpine
latest: digest: sha256:b662d828445b39ac0a659ec77b629a75d1b298a6c76afdf5296cff64806fc638 size: 945
编写 Kubernetes deployment 和service yaml 文件
apiVersion: apps/v1
kind: Deployment
metadata:name: my-gin-app
spec:replicas: 1selector:matchLabels:app: my-gin-apptemplate:metadata:labels:app: my-gin-appspec:containers:- name: my-gin-appimage: rockwang415/my-gin-app:latestports:- containerPort: 8088 # Change this if your app uses a different port.apiVersion: v1
kind: Service
metadata:name: my-gin-app-service
spec:type: NodePortselector:app: my-gin-appports:- port: 8088 # Port that the service will exposetargetPort: 8088 # Port on the container to forward tonodePort: 30080 # Port on the node to expose (optional)
使用 kubectl 应用清单并管理资源
kubectl apply -f my-deployment-svc.yaml
获取pod 所在的node 信息
controlplane:~$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-gin-app-7cff89d685-mncx9 1/1 Running 0 5m55s 192.168.1.4 node01 <none> <none>//该pod 运行在node01
然后获得node01的IP 地址
controlplane:~$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
controlplane Ready control-plane 35d v1.32.1 172.30.1.2 <none> Ubuntu 24.04.1 LTS 6.8.0-51-generic containerd://1.7.24
node01 Ready <none> 35d v1.32.1 172.30.2.2 <none> Ubuntu 24.04.1 LTS 6.8.0-51-generic containerd://1.7.24
controlplane:~$ curl http://172.30.2.2:30080/albums
[{"id": "1","title": "Blue Train","artist": "John Coltrane","price": 56.99},{"id": "2","title": "Jeru","artist": "Gerry Mulligan","price": 17.99},{"id": "3","title": "Sarah Vaughan and Clifford Brown","artist": "Sarah Vaughan","price": 39.99}
结论
Go,也称为 Golang,是一种静态类型编译型语言,旨在简化和提高效率,使其成为构建强大的 Web 应用程序和微服务的绝佳选择。Kubernetes 是一个开源容器编排平台,可自动部署、扩展和管理容器化应用程序。在本项目中,可以使用 Python Flask 前端创建一个用户友好的界面,该界面可与使用 Go 开发的后端相册 API 进行交互。通过将 Go 作为后端,Flask 作为前端,并将两者部署在 Kubernetes 上,开发人员可以在云原生环境中创建可扩展、高效且易于维护的全栈应用程序。
相关文章:
Golang 遇见 Kubernetes:云原生开发的完美结合
Golang 和 Kubernetes 简介 Golang 概述 Golang,也称为 Go,是由 Google 开发的一种开源编程语言。Go 由 Robert Griesemer、Rob Pike 和 Ken Thompson 设计,于 2009 年首次发布,此后在各个领域都获得了广泛的关注,尤其…...
第三章,GRE和MGRE
VPN---虚拟专用网络 VPN的核心技术----隧道技术---封装 GRE---通用路由封装 配置 GRE的配置: R1: [r1]interface Tunnel 0/0/0 ---创建一个虚拟的隧道接口 [r1-Tunnel0/0/0]ip address 192.168.3.1 24 ---给隧道接口分配一个IP地址 [r1-Tunnel0/0/0]t…...
redis常用集合操作命令
在 Redis 的命令行界面(redis-cli)中, Redis 的集合(Set)是无序的,且集合中的元素是唯一的。Redis 本身没有直接提供获取集合中某个特定属性的命令,因为集合中的元素是简单的值,而不…...
vue3中ref在js中为什么需要.value才能获取/修改值?
文章目录 [TOC](文章目录) 一、ref定义值什么情况下需要.value1. 情况1:在js中需要使用.value2. 情况2:在html模版中不需要使用.value3. 情况31.代码2.效果3. 二、重新了解一下vue2和vue3的响应式1.vue2(Object.defineProperty)2.vue3(proxy&…...
使用vue2 开发一个纯静态的校园二手交易平台-前端项目练习
这篇文章给大家分享一个适合练习学习前端技术的项目:校园二手交易平台系统。 因为最近在学习vue相关的技术,所以就根据学习的前端技术,来写一些纯前端的项目来练习,这篇文章主要是分享一下 我做的这个项目的一些功能,如…...
使用wavesurferJs实现录音音波效果
效果图展示 插件安装 npm i wavesurfer实现过程 <!-- author: weileiming date: 2025-04-26 14:04:08 description: 悬浮音波层 props:isRecord: 录制状态waveOptions: 音波基础配置overlayStyle: 基础蒙层配置 methods:togglePlay: 切换录制状态 --> <template>…...
Golang 类型方法
在 Go 语言中,方法绑定到任意类型的特性可以称为 “类型方法(Type Methods)” 或 “接收者方法(Receiver Methods)”,它体现了以下几种核心编程思想: 1. 官方术语:接收者方法&#x…...
多模态常见面试题
多模态常见面试 一、最近关注的论文,多模态视觉大模型(CLIP,DALLE)?二、blip2的架构,优势和之前多模态模型的区别?三、多模态融合后,怎样知道最终结果受哪种模态影响更大?四、多模态中常见的SOTA模型有哪些…...
LangChain构建大模型应用之RAG
RAG(Retrieval-augmented Generation 检索增强生成)是一种结合信息检索与生成模型的技术,通过动态整合外部知识库提升大模型输出的准确性和时效性。其核心思想是在生成答案前,先检索外部知识库中的相关信息作为上下文依据…...
Git 全面解析:从核心概念到生态应用
Git 一、Git 起源与定位 诞生背景:2005 年由 Linus Torvalds 为管理 Linux 内核开发而设计,因 BitKeeper 许可证争议,急需分布式版本控制系统(DVCS)替代集中式工具(如 SVN)。核心优势&#x…...
国产免费工作流引擎star 5.9k,Warm-Flow版本升级1.7.0(新增大量好用功能)
国产免费工作流引擎star 5.9k,Warm-Flow版本升级1.7.0(新增大量好用功能) 主要更新内容项目介绍功能思维导图设计器流程图演示地址官网Warm-Flow视频 之前大家一直吐槽没有撤销、驳回到上一个任务和拿回等功能,此次版本全都带给大…...
camera知识学习
1、DSP DSP(数字信号处理器),这个是介于sensor和ISP处理的一个处理阶段,会进行一些传感器方面的偏硬件处理,再进行数据格式的转换,将raw数据转换成RGB数据或者YUV数据...
Java高频常用工具包汇总
Java高频常用工具包汇总 Java生态系统中有许多广泛使用的工具包,以下是一些高频常用的工具包分类汇总: 1. 核心工具包 Apache Commons系列 Commons Lang - 提供各种基础工具类Commons IO - 文件/IO操作工具Commons Collections - 集合扩展工具Commons …...
蓝桥杯 16. 密文搜索
密文搜索 原题目链接 题目描述 福尔摩斯从 X 星收到一份资料,全部是小写字母组成。 他的助手提供了另一份资料:许多长度为 8 的密码列表。 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序,从第…...
Spring Boot 中多线程的基础使用
1. 核心机制 Spring Boot 通过 TaskExecutor 和 Async 注解支持多线程编程,结合线程池管理,有效提升应用性能。核心组件包括: EnableAsync:启用异步任务支持。 Async:标记方法为异步执行。 ThreadPoolTaskExecutor&…...
660SJBH企业信息管理系统
第一章 问题来源 1.1 课题提出背景和意义 由于企业规模进一步扩大,企业信息的管理也变得越来越复杂。为此,切实有效的把企业信息管理系统引入企业管理领域中,对于促进企业管理制度和提高企业质量有着显着意义。 Internet的发展使我们的企业…...
OpenCV实验室工具的使用
OpenCV实验室工具是一个调用OpenCV常见函数,让用户调整参数,快速得到试验结果的工具软件。 软件界面中包含三列,第一列是功能菜单,第二列是实现某一功能时需要输入的参数,第三列是图像处理历史。 OpenCV实验室包含了常…...
月之暗面开源-音频理解、生成和对话生成模型:Kimi-Audio-7B-Instruct
一、Kimi - Audio 简介 Kimi - Audio 是一个开源的音频基础模型,在音频理解、生成和对话等方面表现出色。其设计旨在作为一个通用的音频基础模型,能够在单一统一的框架内处理各种音频处理任务,如语音识别(ASR)、音频问…...
依赖于切片级标签,结合信息瓶颈理论,对弱监督病理切片分类模型进行微调
小罗碎碎念 在医学AI领域,病理全切片图像(WSI)分析意义重大,但面临诸多难题。 高分辨率的WSI使得获取精确注释极为困难,且计算成本高昂。 多实例学习(MIL)虽能利用WSI级弱监督缓解注释压力&…...
UE5 NDisplay 单主机打包运行
前言 最近在做UE的左右眼双屏输出,找了半天只有近年来比较火的NDispaly可以做这件事了,看了一下官方的教程写的很全面,但是相对笼统了一些,发现B站和一些博客了也写了有,但是我建议还是好好过一遍官方文档吧࿰…...
Kubernetes/KubeSphere 安装踩坑记:从 context deadline exceeded 到成功部署的完整排障笔记
目录 Kubernetes/KubeSphere 安装踩坑记:从 context deadline exceeded 到成功部署的完整排障笔记 一、问题现象 二、第一手日志采集 三、定位思路 四、分步解决 4-1 处理 pause:3.8 4-2 处理 kube-apiserver:v1.31.0 五、再次安装并验证 六、经验总结 七…...
SpringMVC 静态资源处理 mvc:default-servlet-handler
我们先来看看效果,当我把这一行注释掉的时候: 我们来看看页面: 现在我把注释去掉: 、 可以看到的是,这个时候又可以访问了 那么我们就可以想,这个 <mvc:default-servlet-handler />它控制着我们页面的访问…...
2、Linux操作系统下,ubuntu22.04版本安装搜狗输入法
1.添加中文语言支持,打开此窗口的步骤如下: system setting>language and region>language>install/remove language,之后弹出下面的窗口,点击“reminder me later勾选Chinese(simplified)&#…...
go语言八股文(四)
1.go语言中defer的变量快照在什么情况下会生效 1. 变量在 defer 被注册时的值被捕获 当 defer 被注册时,它会捕获变量在那一刻的值。如果变量是值类型(如基本类型、结构体等),defer 会捕获该值的副本;如果变量是指针类…...
烽火HG680-MC_晨星MSO9385芯片-2+8G_安卓9.0_不分地区通刷卡刷固件包
烽火HG680-MC_晨星MSO9385芯片-28G_安卓9.0_不分地区通刷卡刷固件包 刷机教程: 1、准备一个优盘卡刷强刷刷机,用一个usb2.0的8G以下U盘,fat32,2048块单分区格式化(强刷对U盘非常非常挑剔,usb2.…...
秒杀压测计划 + Kafka 分区设计参考
文章目录 前言🚀 秒杀压测计划(TPS预估 测试流程)1. 目标设定2. 压测工具推荐3. 压测命令示例(ab版)4. 测试关注指标 📦 Kafka Topic 分区设计参考表1. 单 Topic 设计2. 分区路由规则设计(Part…...
跨境电商货物体积与泡重计算器:高效便捷的物流计算工具
跨境电商货物体积与泡重计算器:高效便捷的物流计算工具 工具简介 货物体积与泡重计算器是一款免费的在线工具,专门为物流从业者、跨境电商卖家和需要计算货物运输体积重量的用户设计。这款工具可以帮助您快速计算货物的体积和对应的空运、快递泡重&…...
隧道代理ip的优势
日益复杂的互联网环境中,爬虫技术已经成为大数据不可或缺的一环。提到代理IP,大部分人首先想到的是普通的静态IP或动态代理IP,然而,隧道代理IP――这一更为高效、灵活的选择,在许多场景中能为开发者们提供绝佳的技术支…...
Selenium自动化测试+OCR-获取图片页面小说
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 随着爬虫技术的发展,反爬虫技术也越来越高。 目前有些网站通过自定义字体库的方式实现反爬,主要表现在页面数据显示正常,但是…...
MySQL 锁等待超时问题解析:Lock wait timeout exceeded;try restarting transaction
目录 一、问题背景二、问题原因三、解决方案1. 重启事务2. 优化事务管理3. 调整锁等待超时设置4. 分析并优化锁竞争5. 查找并终止持有锁的操作6. 优化 SQL 语句四、预防措施五、总结在使用 MySQL 数据库时, Lock wait timeout exceeded;try restarting transaction 这个错误…...
学习笔记2(Lombok+算法)
Lombok : 介绍: Lombok 是一个在 Java 开发中广泛使用的开源库,它的主要作用是通过注解的方式,减少 Java 代码中大量的样板代码(如 getter、setter、构造函数等),从而让代码更加简洁、易读和易…...
【音视频】SDL简介
官网:官网 文档:文档 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供数种控制图像、声音、输出入的函数,让开发者只 要用相同或是相似的代码就可以开发出跨多…...
信创系统资产清单采集脚本:主机名+IP+MAC 一键生成 CSV
原文链接:信创系统资产清单采集脚本:主机名IPMAC 一键生成 CSV Hello,大家好啊!今天给大家带来一篇在信创终端操作系统上自动批量采集主机名、IP 和 MAC 并导出为 CSV 表格的实战文章!本方案使用 sshpass 和 Bash 脚本…...
Python爬虫(8)Python数据存储实战:JSON文件读写与复杂结构化数据处理指南
目录 一、背景与核心价值二、JSON基础与核心应用场景2.1 JSON数据结构规则2.2 典型应用场景 三、Python json模块核心操作3.1 基础读写:dump()与load()3.2 字符串与对象的转换:dumps()与loads() 四、处理复杂数据类型4.1 日期时间对象…...
OpenStack私有云详细介绍
引言 企业部署云计算服务的模式有公有云、私有云、混合云三大类。 公有云是云计算服务提供商为公众提供服务的云计算平台,理论上任何人都可以通过授权接入该平台。 私有云是云计算服务提供商为企业在其内部建设的专有云计算系统,私有云系统存在于企业防火…...
6.图的OJ题(1-10,未完)
310. 最小高度树 - 力扣(LeetCode) 分析:n个顶点的无环无向连通图,有n-1条边。 1)任意两点有且只有一条路径 2)路径最远的两顶点必为叶子节点 且根据证明可以得出以下两个性质: 1.最小高度树的根…...
【愚公系列】《Manus极简入门》005-DeepSeek与Manus的创新之处
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! …...
犬面部检测数据集VOC+YOLO格式987张1类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):987 标注数量(xml文件个数):987 标注数量(txt文件个数):987 标注…...
深入解析MyBatis-Plus中的lambdaUpdate与lambdaQuery
一、引言 在现代Java持久层开发中,MyBatis-Plus作为MyBatis的增强工具,提供了许多便捷的功能,其中lambdaUpdate和lambdaQuery是基于Lambda表达式的两种强大操作方式。它们不仅提高了代码的可读性,还减少了SQL编写错误,…...
OneNet云平台
一、基础信息 设备名称:test1 设备密钥:N1drd3BZc0h0WDNWaXRtdjlFbjUxTHFhTGtWcW1VWjQ 产品ID:EcO4iSzv5b url: 端口号:1883 password:version2018-10-31&resproducts%2FEcO4iSzv5b%2Fdevices%2Fte…...
使用Nestjs, Bun 和 NCC 打造高效的 Node.js 应用构建流程
使用Nestjs, Bun 和 NCC 打造高效的 Node.js 应用构建流程 在现代 Node.js 应用开发中,构建和打包流程的效率对项目的迭代速度和部署效果有着重要影响。本文将介绍如何结合 Nestjs ,Bun 和 NCC 工具,构建出高效且优化的 Node.js 应用。 一、项目构建的…...
迷你世界UGC3.0脚本Wiki组件事件管理
迷你世界UGC3.0脚本Wiki Menu On this page Sidebar Navigation 快速入门 首页 组件介绍 MOD、组件介绍 什么是Lua编程 开发者常见问题 组件介绍 组件函数 组件属性 全局函数 对象介绍 触发器脚本交互 脚本方法 二维表介绍 组件说明 事件 触发器事件管理 组件事件管理 函数库 服…...
多层pcb批量工厂哪家好?
在电子产业高速发展的当下,多层PCB作为硬件设备的核心载体,其品质与交付效率直接影响终端产品的市场竞争力。面对从消费电子到航空航天等领域的多元化需求,选择一家技术过硬、服务灵活且具备规模化生产能力的工厂至关重要。经过对当前行业动态…...
【MQ篇】RabbitMQ之死信交换机!
目录 引言:消息不死,只是变成死信?初识死信交换机:死信从哪来?DLX 干啥的?什么是死信?什么是死信交换机 (DLX)?死信的旅程:如何从队列到达 DLX 并被路由?&…...
CI/CD解决方案TeamCity在游戏开发中的应用价值与优势分析
TeamCity是用于游戏开发的最流行的CI/CD工具之一。从独立开发者到3A工作室和游戏发行商,各种规模的公司都在使用。无论您在制作流程中使用何种工具,TeamCity都支持您为任何的工作流程设置全面的构建-测试-发布管道。 TeamCity如何增强您的游戏开发工作流…...
泰迪杯实战案例超深度解析:运输车辆安全驾驶行为分析与安全评价系统设计
(第七届泰迪杯数据挖掘挑战赛C题特等奖案例解析) 一、案例背景与目标 1.1 应用场景与痛点 在道路运输行业,不良驾驶行为(如急加速、急减速、疲劳驾驶)是引发交通事故的主要诱因,占事故总量的70%以上。某运输企业通过车联网系统采集了450辆运输车辆的高频数据(每秒1条)…...
C++初阶-模板初阶
目录 1.泛型编程 2.函数模板 2.1函数模板概念 2.2实现函数模板 2.3模板的原理 2.4函数模板的实例化 2.4.1隐式实例化 2.4.2显式初始化 2.5模板参数的匹配原则 3.类模板 3.1类模板定义格式 3.2类模板的实例化 4.总结 1.泛型编程 对广泛的类型法写代码,我…...
计算机网络自顶向下思维导图
主要就是记录下自己做的1-6章的思维导图,内容包含了每章每节内的重点内容 可能又错别字以及错误,欢迎指出 需要注意使用的是第七版的书 第一章 第二章 第二章二 第三章 第四章 第五章 第六章...
机器学习-入门-线性模型(1)
机器学习-入门-线性模型(1) 文章目录 机器学习-入门-线性模型(1)3.1 线性回归3.2 最小二乘解3.3 多元线性回归 3.1 线性回归 f ( x i ) w x i b 使得 f ( x i ) ≃ y i f(x_i) wx_i b \quad \text{使得} \quad f(x_i) \simeq y_i f(xi)wxib使得f(xi)≃yi 离散属性…...
Spark-Streaming3
无状态转换操作与有状态转换操作 无状态转换操作: 无状态转换操作仅处理当前时间跨度内的数据。例如,设置的采集时间为三秒,则只处理这三秒内的数据。 有状态转换操作(UpdateStateByKey): 有状态转换操作可以跨批次处理数据。涉及…...