使用Kubernetes部署Spring Boot项目
目录
前提条件
新建Spring Boot项目并编写一个接口
新建Maven工程
导入 Spring Boot 相关的依赖
启动项目
编写Controller
测试接口
构建镜像
打jar包
新建Dockerfile文件
Linux目录准备
上传Dockerfile和target目录到Linux
制作镜像
查看镜像
测试镜像
上传镜像
准备yaml文件
创建deployment
应用springbootdemo.yaml创建deployment
查看deployment
查看deployment详情
查看pod
访问测试
扩容deployment pod
公布应用程序
对外暴露应用
查看服务
访问测试
前提条件
- 拥有Kubernetes集群环境,可参考:Kubernetes集群搭建
- 掌握Docker镜像知识,可参考:Docker镜像的使用
- 理解Kubernetes基本部署知识,可参考:使用Kubernetes部署第一个应用
- 有一定的Java、Spring Boot编程基础
新建Spring Boot项目并编写一个接口
新建Spring Boot项目及编写相关功能,这里编写一个Hello World接口。
环境说明:jdk8+, maven3+, IDEA2022
新建Maven工程
打开IDEA,File–>New,新建Maven项目,项目名称例如springbootdemo
导入 Spring Boot 相关的依赖
在该 Maven 项目的 pom.xml 中添加以下配置,在 一行之前添加Spring Boot 相关的依赖及打包插件。
<!-- 打包格式 --><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</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><configuration><executable>true</executable><layout>JAR</layout></configuration><executions><execution><goals><goal>repackage</goal></goals><configuration><attach>false</attach></configuration></execution></executions></plugin></plugins></build>
刷新依赖
在src/main/java目录下,新建包org.example
在org.example
包下新建启动类HelloWorldApplication
package org.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class HelloWorldApplication {public static void main(String[] args) {SpringApplication.run(HelloWorldApplication.class, args);}
}
启动项目
点击HelloWorldApplication.java第7行或第8行的绿色三角形启动项目
或者命令方式运行如下:
MacOS/Linux:
./mvnw spring-boot:run
Windows:
mvnw spring-boot:run
编写Controller
为了看到效果,在org.example
下新建controller
包,然后新建一个控制类HelloController
package org.example.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class HelloController {@ResponseBody@RequestMapping("/hello")public String hello(){return "Hello World";}
}
测试接口
重新运行项目
浏览器访问
http://localhost:8080/hello
效果如下:
看到Hello World,说明接口正常。
停止运行项目。
构建镜像
打jar包
在项目的target目录下看到jar包如下
本地命令行运行jar包
cmd进入jar包所在目录,执行如下命令
D:codespringbootspringboot2springbootdemo arget>java -jar springbootdemo-1.0-SNAPSHOT.jar
浏览器访问
http://localhost:8080/hello
返回数据正常,说明jar包可用。
在cmd命令行按Ctrl+c停止项目,或者直接关闭cmd命令窗口。
新建Dockerfile文件
在工程目录下,新建Dockerfile文件,文件内容如下
FROM openjdk:8-jdk-alpine
ADD ./target/springbootdemo-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar", "&"]
Docker在Linux下,需要把Dockerfile和target的jar包上传到Linux,再构建镜像。
Linux目录准备
在Linux下创建工作目录
[root@k8s-master01 ~]# mkdir -p test/springbootapp
[root@k8s-master01 ~]# cd test/springbootapp
[root@k8s-master01 test]#
上传Dockerfile和target目录到Linux
上传Dockerfile和target目录到Linux的/test/springbootapp目录
[root@k8s-master01 springbootapp]# ls
Dockerfile target
[root@k8s-master01 springbootapp]# ls target/
classes generated-test-sources maven-status springbootdemo-1.0-SNAPSHOT.jar.original
generated-sources maven-archiver springbootdemo-1.0-SNAPSHOT.jar test-classes
[root@k8s-master01 springbootapp]#
制作镜像
docker build -t springbootdemo:v1 .
操作过程
[root@k8s-master01 springbootapp]# docker build -t springbootdemo:v1 .
[+] Building 579.2s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 163B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:8-jdk-alpine 169.8s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 17.07MB 0.1s
=> [1/2] FROM docker.io/library/openjdk:8-jdk-alpine@sha256:94792824df2df33402f201713f932b58cb9de94a0cd524164a0f228334 407.7s
=> => resolve docker.io/library/openjdk:8-jdk-alpine@sha256:94792824df2df33402f201713f932b58cb9de94a0cd524164a0f22833435 0.0s
=> => sha256:f910a506b6cb1dbec766725d70356f695ae2bf2bea6224dbe8c7c6ad4f3664a2 238B / 238B 38.2s
=> => sha256:c2274a1a0e2786ee9101b08f76111f9ab8019e368dce1e325d3c284a0ca33397 70.73MB / 70.73MB 402.1s
=> => sha256:94792824df2df33402f201713f932b58cb9de94a0cd524164a0f2283343547b3 1.64kB / 1.64kB 0.0s
=> => sha256:44b3cea369c947527e266275cee85c71a81f20fc5076f6ebb5a13f19015dce71 947B / 947B 0.0s
=> => sha256:a3562aa0b991a80cfe8172847c8be6dbf6e46340b759c2b782f8b8be45342717 3.40kB / 3.40kB 0.0s
=> => sha256:e7c96db7181be991f19a9fb6975cdbbd73c65f4a2681348e63a141a2192a5f10 2.76MB / 2.76MB 42.6s
=> => extracting sha256:e7c96db7181be991f19a9fb6975cdbbd73c65f4a2681348e63a141a2192a5f10 0.4s
=> => extracting sha256:f910a506b6cb1dbec766725d70356f695ae2bf2bea6224dbe8c7c6ad4f3664a2 0.0s
=> => extracting sha256:c2274a1a0e2786ee9101b08f76111f9ab8019e368dce1e325d3c284a0ca33397 4.6s
=> [2/2] ADD ./target/springbootdemo-1.0-SNAPSHOT.jar app.jar 1.4s
=> exporting to image 0.2s
=> => exporting layers 0.2s
=> => writing image sha256:00bb52a626f8e486a884f956ff944bcbecedb39329476a41fa7f5dbb1587dd5f 0.0s
=> => naming to docker.io/library/springbootdemo:v1 0.0s
[root@k8s-master01 springbootapp]#
查看镜像
[root@k8s-master01 springbootapp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springbootdemo v1 00bb52a626f8 About a minute ago 122MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.31.1 6bab7719df10 2 months ago 94.2MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.31.1 175ffd71cce3 2 months ago 88.4MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.31.1 9aa1fad94157 2 months ago 67.4MB
registry.aliyuncs.com/google_containers/kube-proxy v1.31.1 60c005f310ff 2 months ago 91.5MB
calico/typha v3.28.1 a19ab150aded 3 months ago 71.3MB
calico/kube-controllers v3.28.1 9d19dff735fa 3 months ago 79.3MB
calico/cni v3.28.1 f6d76a1259a8 3 months ago 209MB
calico/node v3.28.1 8bbeb9e1ee32 3 months ago 365MB
registry.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5 3 months ago 61.8MB
registry.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc0 3 months ago 148MB
registry.aliyuncs.com/google_containers/pause 3.10 873ed7510279 5 months ago 736kB
hello-world latest d2c94e258dcb 18 months ago 13.3kB
registry.aliyuncs.com/google_containers/pause 3.8 4873874c08ef 2 years ago 711kB
能看到springbootdemo:v1
镜像。
测试镜像
使用Docker命令测试运行镜像
docker run -d -p 8080:8080 --name springbootdemo springbootdemo:v1
命令行访问
[root@k8s-master01 springbootapp]# curl localhost:8080/hello
Hello World[root@k8s-master01 springbootapp]#
浏览器访问虚拟机ip:8080/hello
http://192.168.204.101:8080/hello
能访问,说明镜像正常。
删除容器
[root@k8s-master01 springbootapp]# docker rm -f springbootdemo
上传镜像
上传镜像到镜像仓库,这里使用阿里云镜像仓库为例。
登录阿里云,进入控制台,找到容器镜像服务,创建命名空间,创建创库名称,根据操作指南进行操作,详细步骤可参考:Docker镜像的使用
上传镜像命令
$ docker login --username= registry.cn-shenzhen.aliyuncs.com
$ docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo:[镜像版本号]
$ docker push registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo:[镜像版本号]
注意:需要换成自己的账号名称
操作
# 登录阿里云
[root@k8s-master01 springbootapp]# docker login --username= registry.cn-shenzhen.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
查看docker镜像id
[root@k8s-master01 springbootapp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
springbootdemo v1 00bb52a626f8 15 minutes ago 122MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.31.1 6bab7719df10 2 months ago 94.2MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.31.1 9aa1fad94157 2 months ago 67.4MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.31.1 175ffd71cce3 2 months ago 88.4MB
registry.aliyuncs.com/google_containers/kube-proxy v1.31.1 60c005f310ff 2 months ago 91.5MB
calico/typha v3.28.1 a19ab150aded 3 months ago 71.3MB
calico/kube-controllers v3.28.1 9d19dff735fa 3 months ago 79.3MB
calico/cni v3.28.1 f6d76a1259a8 3 months ago 209MB
calico/node v3.28.1 8bbeb9e1ee32 3 months ago 365MB
registry.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5 3 months ago 61.8MB
registry.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc0 3 months ago 148MB
registry.aliyuncs.com/google_containers/pause 3.10 873ed7510279 5 months ago 736kB
hello-world latest d2c94e258dcb 18 months ago 13.3kB
registry.aliyuncs.com/google_containers/pause 3.8 4873874c08ef 2 years ago 711kB
对镜像打标签
[root@k8s-master01 springbootapp]# docker tag 00bb52a626f8 registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo:v1
[root@k8s-master01 springbootapp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo v1 00bb52a626f8 16 minutes ago 122MB
springbootdemo v1 00bb52a626f8 16 minutes ago 122MB
registry.aliyuncs.com/google_containers/kube-apiserver v1.31.1 6bab7719df10 2 months ago 94.2MB
registry.aliyuncs.com/google_containers/kube-scheduler v1.31.1 9aa1fad94157 2 months ago 67.4MB
registry.aliyuncs.com/google_containers/kube-controller-manager v1.31.1 175ffd71cce3 2 months ago 88.4MB
registry.aliyuncs.com/google_containers/kube-proxy v1.31.1 60c005f310ff 2 months ago 91.5MB
calico/typha v3.28.1 a19ab150aded 3 months ago 71.3MB
calico/kube-controllers v3.28.1 9d19dff735fa 3 months ago 79.3MB
calico/cni v3.28.1 f6d76a1259a8 3 months ago 209MB
calico/node v3.28.1 8bbeb9e1ee32 3 months ago 365MB
registry.aliyuncs.com/google_containers/coredns v1.11.3 c69fa2e9cbf5 3 months ago 61.8MB
registry.aliyuncs.com/google_containers/etcd 3.5.15-0 2e96e5913fc0 3 months ago 148MB
registry.aliyuncs.com/google_containers/pause 3.10 873ed7510279 5 months ago 736kB
hello-world latest d2c94e258dcb 18 months ago 13.3kB
registry.aliyuncs.com/google_containers/pause 3.8 4873874c08ef 2 years ago 711kB
上传镜像
[root@k8s-master01 springbootapp]# docker push registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo:v1
The push refers to repository [registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo]
7217cf1a65b2: Pushed
ceaf9e1ebef5: Pushed
9b9b7f3d56a0: Pushed
f1b5933fe4b5: Pushed
v1: digest: sha256:360f8ce8a2358fca237f6fd884cf58a3f9184c3fa08f9b475a35fe0bc2bb93bc size: 1159
[root@k8s-master01 springbootapp]#
查看上传成功的镜像
镜像大小是压缩过后的大小。
准备yaml文件
# 生成springbootdemo.yaml
[root@k8s-master01 ~]# kubectl create deployment springboothello --image=registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo:v1 --dry-run=client -o yaml > springbootdemo.yaml# 查看yaml文件
[root@k8s-master01 ~]# ls
... springbootdemo.yaml ...# 查看springbootdemo.yaml内容
[root@k8s-master01 ~]# cat springbootdemo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: springboothelloname: springboothello
spec:replicas: 1selector:matchLabels:app: springboothellostrategy: {}template:metadata:creationTimestamp: nulllabels:app: springboothellospec:containers:- image: registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo:v1name: springbootdemoresources: {}
status: {}
创建deployment
应用springbootdemo.yaml创建deployment
[root@k8s-master01 ~]# kubectl apply -f springbootdemo.yaml
deployment.apps/springboothello created
查看deployment
[root@k8s-master01 ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
springboothello 0/1 1 0 12s
查看deployment详情
[root@k8s-master01 ~]# kubectl describe deployment springboothello
Name: springboothello
Namespace: default
CreationTimestamp: Thu, 14 Nov 2024 12:28:11 +0800
Labels: app=springboothello
Annotations: deployment.kubernetes.io/revision: 1
Selector: app=springboothello
Replicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app=springboothello
Containers:
springbootdemo:
Image: registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo:v1
Port:
Host Port:
Environment:
Mounts:
Volumes:
Node-Selectors:
Tolerations:
Conditions:
Type Status Reason
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets:
NewReplicaSet: springboothello-747b759b88 (1/1 replicas created)
Events:
Type Reason Age From Message
Normal ScalingReplicaSet 103s deployment-controller Scaled up replica set springboothello-747b759b88 to 1
查看pod
[root@k8s-master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
springboothello-747b759b88-v8t54 1/1 Running 0 2m59s
[root@k8s-master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
springboothello-747b759b88-v8t54 1/1 Running 0 3m52s 10.244.85.192 k8s-node01
[root@k8s-master01 ~]#
访问测试
集群内,命令访问
[root@k8s-master01 ~]# curl 10.244.85.192:8080/hello
Hello World[root@k8s-master01 ~]#
[root@k8s-node01 ~]# curl 10.244.85.192:8080/hello
Hello World[root@k8s-node01 ~]#
[root@k8s-node02 ~]# curl 10.244.85.192:8080/hello
Hello World[root@k8s-node02 ~]#
注意:此时只能在集群内部使用。如果用集群外的浏览器访问,访问不了
扩容deployment pod
# pod扩容为3
[root@k8s-makubectl scale deployment springboothello --replicas=3
deployment.apps/springboothello scaled
查看pods,还有容器正在创建
[root@k8s-master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
springboothello-747b759b88-cs9dv 1/1 Running 0 6s 10.244.85.196 k8s-node01
springboothello-747b759b88-jzlpm 0/1 ContainerCreating 0 6s k8s-node02
springboothello-747b759b88-v8t54 1/1 Running 0 112m 10.244.85.192 k8s-node01
查看pods,成功如下
[root@k8s-master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
springboothello-747b759b88-cs9dv 1/1 Running 0 3m8s 10.244.85.196 k8s-node01
springboothello-747b759b88-jzlpm 1/1 Running 0 3m8s 10.244.58.194 k8s-node02
springboothello-747b759b88-v8t54 1/1 Running 0 115m 10.244.85.192 k8s-node01
[root@k8s-master01 ~]#
公布应用程序
对外暴露应用
# 对外暴露应用
[root@k8s-master01 ~]# kubectl expose deployment springboothello --port=8080 --target-port=8080 --type=NodePort
命令参数说明
-
expose
:这是kubectl
的一个子命令,用于创建一个新的服务来暴露一个资源(如 Deployment、Pod 等)。 -
deployment springboothello
:指定要暴露的资源是名为springboothello
的 Deployment。这意味着该服务会将流量路由到这个 Deployment 所管理的 Pod 集合上。 -
--port=8080
:定义了服务在集群内部监听的端口号为 8080。当其他服务或 Pod 在集群内部要访问这个服务时,会使用这个端口。 -
--target-port=8080
:指定了流量最终要被转发到后端 Pod 上的端口号也是 8080。也就是说,从服务的 8080 端口接收到的流量会被转发到对应的 Deployment 所管理的 Pod 的 8080 端口上。 -
--type=NodePort
:设置服务的类型为 NodePort。这种类型的服务会在集群中的每个节点(Node)上开放一个指定范围(通常是 30000 - 32767)内的随机端口,外部客户端可以通过访问集群中任意节点的该随机端口来访问到服务背后的应用(这里就是springboothello
Deployment 所管理的 Pod 运行的应用)。
查看服务
# 查看service
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 443/TCP 60d
springboothello NodePort 10.1.199.196 8080:30582/TCP 8s
[root@k8s-master01 ~]#
从service中,可以看到springboothello的Service CLUSTER-IP为10.1.199.196
,PORT8080
映射为30582
端口
访问测试
命令访问ServiceCLUSTER-IP:8080/hello
[root@k8s-master01 ~]# curl 10.1.199.196:8080/hello
Hello World[root@k8s-master01 ~]#
命令访问K8S机器IP:30582
[root@k8s-master01 ~]# curl 192.168.204.101:30582/hello
Hello World[root@k8s-master01 ~]#
[root@k8s-master01 ~]# curl 192.168.204.102:30582/hello
Hello World[root@k8s-master01 ~]#
[root@k8s-master01 ~]# curl 192.168.204.103:30582/hello
Hello World[root@k8s-master01 ~]#
浏览器访问
192.168.204.101:30582/hello
192.168.204.102:30582/hello
192.168.204.103:30582/hello
看到能正常返回数据,说明公布应用程序成功。
至此,已成功使用Kubernetes部署Spring Boot项目。
完成! enjoy it!
相关文章:
使用Kubernetes部署Spring Boot项目
目录 前提条件 新建Spring Boot项目并编写一个接口 新建Maven工程 导入 Spring Boot 相关的依赖 启动项目 编写Controller 测试接口 构建镜像 打jar包 新建Dockerfile文件 Linux目录准备 上传Dockerfile和target目录到Linux 制作镜像 查看镜像 测试镜像 上传镜…...
LC77. 组合
LC77. 组合 题目要求(一)回溯1. 解决思路2. 具体步骤3. 代码实现4. 复杂度分析5. 示例解释示例 1:示例 2: 6. 总结 LC77. 组合 题目要求 (一)回溯 要解决这个问题,我们需要生成从 [1, n] 范围内选择 k 个数的所有可能组合。组合的顺序不重要…...
Android中的ANR(Application Not Responding)现象
Android中的ANR(Application Not Responding)现象是指应用程序未能在规定的时间内响应系统或用户的输入事件,从而触发系统弹出的无响应对话框。以下是关于ANR现象的详细解释: 一、ANR现象的定义 ANR通常发生在以下情况ÿ…...
操作系统启动——前置知识预备
文章目录 1. 理解冯诺依曼体系结构1.1 简单见一见冯诺依曼1.2 进一步认识1.3 为什么一定要有内存的存在? 2. 操作系统2.1 概念2.2 设计OS的目的2.3 OS的核心功能2.4 如何理解“管理”二字?(小故事版)2.5 系统调用和库函数概念 3. 进程简述3.1 基本概念3.…...
Unity中VFX烟雾特效与场景中的碎片物体重叠时闪烁问题
双击Unity项目中vfx特效文件,选中VFX编辑器中的Output Particle节点,看右侧的Inspector窗口 这个图的BlendMode是Alpha, 意味着渲染队列是3000要关闭Z Write Mode, 其值设置为off最后一个属性Sorting Priorty 设置为50,意味着渲染队列在3000…...
[RN]React Native知识框架图详解
React Native 是一个基于 React 的跨平台移动应用开发框架。以下是 React Native 知识框架图的详细解析: React Native 知识框架 1. 核心概念 JSX:JavaScript XML 语法,类似 HTML 的语法,用于描述 UI 组件。组件(Com…...
每日OJ_牛客_游游的字母串_枚举_C++_Java
目录 牛客_游游的字母串_枚举 题目解析 C代码 Java代码 牛客_游游的字母串_枚举 游游的字母串 描述: 对于一个小写字母而言,游游可以通过一次操作把这个字母变成相邻的字母。a和b相邻,b和c相邻,以此类推。特殊的࿰…...
解锁MacOS开发:环境配置与应用开发全攻略
✨✨✨这里是小韩学长yyds的BLOG(喜欢作者的点个关注吧) ✨✨✨想要了解更多内容可以访问我的主页 小韩学长yyds-CSDN博客 目录 引言 一、MacOS 开发环境配置 (一)必备工具安装 (二)集成开发环境(IDE)选…...
IDEA 2025最新版2024.3.3软件安装、插件安装、语言设置
IntelliJ IDEA是一款由JetBrains公司开发的集成开发环境(IDE),主要用于Java语言的开发,它通过提供丰富的功能如智能代码补全、代码分析、版本控制集成等来提高开发效率。 IDEA有社区版和专业版两个版本,社区版是免费开…...
leetcode 0018 四数之和-medium
1 题目:四数之和 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复&#x…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_add_dump
ngx_conf_add_dump 定义在src\core\ngx_conf_file.c static ngx_int_t ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename) {off_t size;u_char *p;uint32_t hash;ngx_buf_t *buf;ngx_str_node_t *sn;ngx_conf_dump_t *cd;has…...
家政预约小程序用例图分析
在和客户进行需求沟通的时候,除了使用常规的问答的形式,我还使用图形化工具更深入的沟通。比如借助UML的用例图来开展系统分析,并且按照角色详细拆解了家政预约小程序的各个用例。在分析阶段思考的越多,沟通的越多,在系…...
unity学习62,尝试做第一个小游戏项目:flappy bird
目录 学习参考 1 创建1个unity 2D项目 1.1 2D项目模板选择 1.1.1 2D(built-in-Render pipeline) 1.1.2 universe 2D 1.1.3 这次选择 2D(built-in-Render pipeline) 1.2 创建项目 1.2.1 注意点 1.2.2 如果想修改项目名 2 导入美术资源包 2.1 下载一个flappy bird的…...
Windows10下本地搭建Manim环境
文章目录 1. 简介2. Python环境3. uv工具4. Latex软件5. 安装Manim数学库6. 中文支持参考 1. 简介 manim是个一科普动画的库, 本文用到的是社区版本。 2. Python环境 这个不用多说,可以参考其他的文章。记得把pip也安上。 3. uv工具 上面的pip是老…...
zabbix“专家坐诊”第277期问答
在线答疑:乐维社区 问题一 Q:这个怎么解决呢? A:缺少这个依赖。 Q:就一直装不上。 A:装 zabbix-agent2-7.0.0-releasel.el7.x86 64 需要前面提示的那个依赖才可以装。 问题二 Q:大佬,如果agen…...
解决git clone下载慢或者超时问题
在网上找了很多办法,直接最简单的使用镜像网站下载。 国内可用的镜像网站有: https://github.com.cnpmjs.org # 服务器位于香港https://gitclone.com # 服务器位于杭州https://doc.fastgit.org # 服务器位于香港 例如:将 git clone https:…...
机器学习:强化学习的epsilon贪心算法
强化学习(Reinforcement Learning, RL)是一种机器学习方法,旨在通过与环境交互,使智能体(Agent)学习如何采取最优行动,以最大化某种累积奖励。它与监督学习和无监督学习不同,强调试错…...
MySQL-高级查询
查询处理 排序(默认不是按主键排序的) order by 字段1[,字段2] [asc|desc] 默认是升序排序也可以指定 select 列表中列的序号进行排序如果是多个字段,那么在上一个字段排序完的基础上排序下一个 限制数量 limit 行数࿰…...
NModbus 连接到Modbus服务器(Modbus TCP)
1、在项目中通过NuGet添加NModbus,在界面中添加一个Button。 using NModbus.Device; using NModbus; using System.Net.Sockets; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Docu…...
value_counts()和unique()
我今天发现一个很有意思的问题哈 import scanpy as sc import numpy as npX np.random.randn(10,3) adata1 sc.AnnData(X) adata1.obs["sample"] "H1" print(adata1)X np.random.randn(20,3) adata2 sc.AnnData(X) adata2.obs["sample"] &…...
FinRobot:一个使用大型语言模型进行金融分析的开源AI代理平台
文章目录 前言一、生态系统1. 金融AI代理(Financial AI Agents)2. 金融大型语言模型(Financial LLMs)3. LLMOps4. 数据操作(DataOps)5. 多源LLM基础模型(Multi-Source LLM Foundation Models&am…...
示例:在WPF中如何使用Segoe MDL2 Assets图标和使用该图标的好处
一、目的:分享在WPF中如何使用Segoe MDL2 Assets图标和使用该图标的好处 在WPF中使用Segoe MDL2 Assets字体,可以通过设置控件的FontFamily属性来实现。Segoe MDL2 Assets是一个包含许多图标的字体,通常用于Windows应用程序的图标显示。 二、…...
使用UA-SPEECH和TORGO数据库验证自动构音障碍语音分类方法
使用UA-SPEECH和TORGO数据库验证自动构音障碍语音分类方法 引言 原文:On using the UA-Speech and TORGO databases to validate automatic dysarthric speech classification approaches 构音障碍简介 构音障碍是一种由于脑损伤或神经疾病(如脑瘫、肌萎缩侧索硬化症、帕金森…...
容器与虚拟机:云时代的底层架构博弈
容器与虚拟机:云时代的底层架构博弈 在数字化浪潮席卷的当下,云技术已成为企业和开发者不可或缺的基础设施。在云环境中,容器和虚拟机作为两种关键的底层技术,犹如双子星般备受瞩目。它们究竟谁能在这场技术较量中脱颖而出&#x…...
解决android studio(ladybug版本) gradle的一些task突然消失了
今天不知道干了啥,AS(ladybug版本)右边gradle的task有些不见了,研究了半天解决了,这里记录下: 操作: File -->Settings-->Experimental--> 取消选项“Enable support for multi-vari…...
Wpf-ReactiveUI-Usercontrol交互
文章目录 1、使用属性绑定UserControl 部分(MyUserControl.xaml.cs)UserControl 视图模型部分(MyUserControlViewModel.cs)主界面部分(MainWindow.xaml)主界面视图模型部分(MainWindowViewModel.cs)2、使用消息传递UserControl 视图模型部分(MyUserControlViewModel.c…...
Unity插件-Mirror使用方法(四)组件介绍(Network Manager HUD)
目录 一、插件介绍 二、主要组件 Network Manager 三、Network Manager HUD 1、组件介绍 2、NetworkManagerHUD 的核心功能 快速操作按钮 状态信息显示 场景切换支持 调试辅助 3、关键属性与配置 4、HUD 界面详解 【主机模式(服务器客户端)…...
UDP协议(20250303)
1. UDP UDP:用户数据报协议(User Datagram Protocol),传输层协议之一(UDP,TCP) 2. 特性 发送数据时不需要建立链接,节省资源开销不安全不可靠的协议 //一般用在实时性比较高…...
【量化金融自学笔记】--开篇.基本术语及学习路径建议
在当今这个信息爆炸的时代,金融领域正经历着一场前所未有的变革。传统的金融分析方法逐渐被更加科学、精准的量化技术所取代。量化金融,这个曾经高不可攀的领域,如今正逐渐走进大众的视野。它将数学、统计学、计算机科学与金融学深度融合&…...
振弦采集仪多通道振弦采集终端 物联网振弦监测 智能振弦监测系统
振弦采集仪多通道振弦采集终端 物联网振弦监测 智能振弦监测系统 VD416_DIN 多通道振弦温度综合采集仪采用模块化设计,配备 32 通道传感器接口,支持两种高效工作模式:16 通道振弦频率与 16 通道温度同步采集,或 32 通道振弦频率专…...
Synchronized解析
一、底层原理:Monitor机制 对象锁与Monitor关联 synchronized通过对象锁实现互斥,每个Java对象都可以关联一个Monitor(监视器),其底层由JVM用C实现。当线程进入synchronized代码块时,会尝试获取与锁对象关联…...
别再瞎学!C 语言入门看这篇就够了
目录 1. 如何学好C语言 2. C语言是什么? 3. C语⾔的历史和辉煌 4. 编译器的选择 4.1 编译和链接 4.2 编译器大比拼,VS2022 脱颖而出 4.3 VS2022 优缺点大揭秘 5. VS项⽬ 和 源⽂件、头⽂件介绍 6. 第一个C语言程序 7. main 函数:程序…...
Linux操作系统5-进程信号2(信号的4种产生方式,signal系统调用)
上篇文章:Linux操作系统5-进程信号1(信号基础)-CSDN博客 本篇Gitee仓库:myLerningCode/l25 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重点:信号的4种产生 目录 一. signal系统调用 …...
【Groovy】Array、List、Set、Map简介
1 Array 1.1 创建数组 1.1.1 创建一维数组 int[] arr1 new int[2] arr1[0] 1 arr1[1] 2float[] arr2 new float[] { 1f, 2f, 3f } String[] arr3 ["abc", "xyz"] as String[] 1.1.2 创建二维数组 int[][] arr1 new int[2][2] arr1[0][0] 1 arr…...
DeepSeek与数据分析:现状、挑战与未来展望
在当今数字化时代,人工智能(AI)的浪潮正以前所未有的速度席卷各个领域,数据分析作为众多行业决策的关键支撑,也不可避免地受到AI技术发展的深刻影响。近期,AI话题持续火热,不少企业老板要求员工…...
【通俗讲解电子电路】——从零开始理解生活中的电路(三)
实际应用案例:生活中的电子电路 ——拆解你身边的“隐形工程师” 1. 手电筒电路:最简单的直流系统 电路组成 电源:2节1.5V电池(串联3V)。 开关:按钮控制回路通断。 LED:发光二极管ÿ…...
JVM基本概念及内存管理模型
一、JVM基本概念 JVM(Java Virtual Machine,Java 虚拟机)是 Java 程序运行的核心组件。它负责将 Java 字节码转换为特定平台的机器指令,并提供内存管理、垃圾回收、安全性等功能。JVM 的主要功能包括以下: 加载和执行…...
【CPP面经】科大讯飞 腾讯后端开发面经分享
文章目录 C 面试问题整理基础问题简答1. 内存对齐2. this 指针3. 在成员函数中删除 this4. 引用占用内存吗?5. C 越界访问场景6. 进程通信方式7. 无锁队列实现8. ping 在哪一层?实现原理?9. HTTPS 流程10. GDB 使用及 CPU 高使用定位11. 智能…...
2.反向传播机制简述——大模型开发深度学习理论基础
在深度学习开发中,反向传播机制是训练神经网络不可或缺的一部分。它让模型能够通过不断调整权重,从而将预测误差最小化。本文将从实际开发角度出发,简要介绍反向传播机制的核心概念、基本流程、在现代网络中的扩展,以及如何利用自…...
使用Word时无法粘贴,弹出错误提示:运行时错误‘53‘:文件未找到:MathPage.WLL
报错说明 使用Word时无法粘贴,粘贴时弹出提示如下: 一般出现这种情况时,我想你是刚装完MathType不久,博主装的是MathType7版本,出现了这个问题。 出现这个问题的原因是"mathpage.wll"这个文件在Office的插…...
详解matplotlib隐式pyplot法和显式axes法
Python的matplotlib提供了pyplot隐式方法和显式Axes方法,这让很多人在选择时感到困惑。本文用9000字彻底解析两种方法的区别与适用场景,节选自👉Python matplotlib保姆级教程 matplotlib隐式绘图方法(pyplot) matplot…...
100天精通Python(爬虫篇)——第113天:爬虫基础模块之urllib详细教程大全
文章目录 1. urllib概述2. urllib.request模块 1. urllib.request.urlopen()2. urllib.request.urlretrieve()3. urllib.request.Request()4. urllib.request.install_opener()5. urllib.request.build_opener()6. urllib.request.AbstractBasicAuthHandler7. urllib.request.…...
FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
Leetcode LRU缓存
LRU 缓存算法思想及代码解析 算法思想 LRU(Least Recently Used,最近最少使用)缓存 需要满足以下要求: 在 O(1) 时间复杂度内完成 get 和 put 操作。当缓存满时,删除最近最少使用的元素(即最久没有被访问…...
结合PyMuPDF+pdfplumber,删除PDF指定文本后面的内容
🚀 一、需求场景解析 在日常办公中,我们经常会遇到这样的痛点: 合同处理:收到上百份PDF合同,需要找到"签署页"之后的内容并删除报表加工:批量移除财务报表中的敏感数据区域文档归档:快速提取技术文档的关键章节传统的手动操作方式存在三大致命缺陷: ❗ 耗时…...
【NLP 30、文本匹配任务 —— 传统机器学习算法】
目录 一、文本匹配任务的定义 1.狭义解释 2.广义解释 二、文本匹配的应用 1.问答对话 2.信息检索 3.文本匹配任务应用 三、智能问答 1.智能问答的基本思路 依照基础资源划分: 依照答案产出方式划分 依照NLP相关技术划分 四、智能问答的价值 1.智能客服 2.Faq知识库问…...
修改hosts文件,修改安全属性,建立自己的DNS
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
springboot + mybatis-plus + druid
目录架构 config MyMetaObjectHandler.java package com.example.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component;import java.util.Date;Com…...
【零基础到精通Java合集】第十一集:List集合框架与泛型
课程标题:List集合框架与泛型(15分钟) 目标:掌握泛型在List中的应用,理解类型安全的重要性,熟练操作泛型集合 0-1分钟:泛型List的意义引入 以“分类储物箱”类比泛型List:明确容器内元素类型(如只能放书籍)。说明泛型的核心作用——编译时类型检查,避免运行时类型…...
计算机网络——子网掩码
一、子网掩码是什么?它长什么样? 子网掩码的定义 子网掩码是一个32位的二进制数字,与IP地址“配对使用”,用于标识IP地址中哪部分属于网络地址,哪部分属于主机地址。 示例:IP地址 192.168.1.10,…...