使用Kubernetes部署Spring Boot项目

news2025/3/1 6:47:25

目录

前提条件

新建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: null
  labels:
    app: springboothello
  name: springboothello
spec:
  replicas: 1
  selector:
    matchLabels:
      app: springboothello
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: springboothello
    spec:
      containers:
      - image: registry.cn-shenzhen.aliyuncs.com/mytest_ns/springbootdemo:v1
        name: springbootdemo
        resources: {}
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!

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

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

相关文章

C#基础之 继承类相关构造函数使用

类构造函数 作用是为 类中成员变量进行赋值操作 单个类的时候 一般不会有什么思路问题&#xff0c;主要说明一下 有继承关系类的时候 当存在继承关系的类 如 A&#xff1a;B 首先要注意第一点&#xff1a;顺序 那么在构造函数时 顺序是由 B先构造 然后 A在构造 注意第二点方法…

【leetcode刷题】:双指针篇(有效三角形的个数、和为s的两个数)

文章目录 一、有效三角形的个数题目解析算法原理代码编写 二、和为s的两个数题目解析算法原理代码编写 一、有效三角形的个数 题目解析 有效三角形的个数【点击跳转】 题目意思很好理解&#xff1a;就是在一堆非负整数的数组里&#xff0c;随机选三个数进行搭配&#xff0c;…

【Unity3D】apk加密(global-metadata.dat加密)

涉及&#xff1a;apk、aab、global-metadata.dat、jks密钥文件、APKTool、zipalign 使用7z打开apk文件观察发现有如下3个针对加密的文件。 xxx.apk\assets\bin\Data\Managed\Metadata\global-metadata.dat xxx.apk\lib\armeabi-v7a\libil2cpp.so xxx.apk\lib\arm64-v8a\libil…

机器学习之贝叶斯分类器和混淆矩阵可视化

贝叶斯分类器 目录 贝叶斯分类器1 贝叶斯分类器1.1 概念1.2算法理解1.3 算法导入1.4 函数 2 混淆矩阵可视化2.1 概念2.2 理解2.3 函数导入2.4 函数及参数2.5 绘制函数 3 实际预测3.1 数据及理解3.2 代码测试 1 贝叶斯分类器 1.1 概念 贝叶斯分类器是基于贝叶斯定理构建的分类…

前端报告 2024:全新数据,深度解析未来趋势

温馨提示: 此报告为国际版全球报告,其中所涉及的技术应用、工具偏好、开发者习惯等情况反映的是全球前端开发领域的综合态势。由于国内外技术发展环境、行业生态以及企业需求等存在差异,可能有些内容并不完全契合国内的实际情况,请大家理性阅读,批判性地吸收其中的观点与信…

科普CMOS传感器的工作原理及特点

在当今数字化成像的时代&#xff0c;图像传感器无疑是幕后的关键 “功臣”&#xff0c;它宛如一位神奇的 “光影魔法师”&#xff0c;通过光电效应这一奇妙的物理现象&#xff0c;将光子巧妙地转换成电荷&#xff0c;为图像的诞生奠定基础。而在众多类型的图像传感器中&#xf…

word论文排版常见问题汇总

word论文排版常见问题汇总 常用快捷键&#xff1a; Alt F9 正常模式与域代码模式切换 Ctrl F9 插入域代码 F9 刷新域代码显示&#xff0c;要注意选定后刷新才会有效果 word中在当前列表的基础上修改列表 在使用word时&#xff0c;我们会定义一个列表&#xff0c;并将其链接…

使用PVE快速创建虚拟机集群并搭建docker环境

安装Linux系统 这里以安装龙蜥操作系统AnolisOS8.9为例加以说明。 通过PVE后台上传操作系统ISO镜像。 然后在PVE上【创建虚拟机】&#xff0c;选定上传的龙蜥操作系统镜像进行系统安装。 注意&#xff1a;在安装过程中&#xff0c;要设定语言、时区、超管用户root的密码、普…

某音响制造公司发展战略转型项目成功案例纪实

面对产业结构变化、海外订单缩减、劳动力成本攀升、缺乏自主品牌等原因导致的利润空间急剧下降的挑战&#xff0c;面向海外市场的代工厂如何在严峻的经济形势下克服发展障碍&#xff0c;成功实现转型与发展&#xff1f; 某音响制造公司&#xff0c;面临着订单量减少、成本增高…

redis的学习(三)

6. set集合 集合&#xff1a;把一些有关联的数据放在一起。 1、集合中的元素是无序的&#xff0c;即数据存放顺序不重要&#xff0c;变化一下顺序&#xff0c;集合依旧是之前的集合。 2、集合中的元素是不能重复的&#xff08;唯一性&#xff09;与list类似的是集合中的每一个元…

点赞系统设计(微服务)

点赞业务是一个常见的社交功能&#xff0c;它允许用户对其他用户的内容&#xff08;如帖子、评论、图片等&#xff09;表示喜欢或支持。在设计点赞业务时&#xff0c;需要考虑以下几个方面&#xff1a; 一、业务需求 点赞业务需要满足以下特性&#xff1a; 通用&#xff1a;…

C#进阶-在Ubuntu上部署ASP.NET Core Web API应用

随着云计算和容器化技术的普及&#xff0c;Linux 服务器已成为部署 Web 应用程序的主流平台之一。ASP.NET Core 作为一个跨平台、高性能的框架&#xff0c;非常适合在 Linux 环境中运行。本篇博客将详细介绍如何在 Linux 服务器上部署 ASP.NET Core Web API 应用&#xff0c;包…

设计模式-结构型-桥接模式

1. 什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09; 是一种结构型设计模式&#xff0c;它旨在将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。通过这种方式&#xff0c;系统可以在抽象和实现两方面进行扩展&#xff0c;而无需相互影响…

python学习笔记—16—数据容器之元组

1. 元组——tuple(元组是一个只读的list) (1) 元组的定义注意&#xff1a;定义单个元素的元组&#xff0c;在元素后面要加上 , (2) 元组也支持嵌套 (3) 下标索引取出元素 (4) 元组的相关操作 1. index——查看元组中某个元素在元组中的位置从左到右第一次出现的位置 t1 (&qu…

基础算法--查找

一、线性枚举 1、线性枚举定义 线性枚举指的就是遍历某个一维数组&#xff08;顺序表&#xff09;的所有元素&#xff0c;找到满足条件的那个元素并且返回&#xff0c;返回值可以是下标&#xff0c;也可以是元素本身。 由于是遍历的&#xff0c;穷举了所有情况&#xff0c;所…

G1垃圾回收器的FullGC

如何确定GarbageFirst回收器发生的是FullGC ? 必须出现FullGC字样才算是FUllGC&#xff0c;例如下图&#xff1a;因为内存分配失败&#xff08;Allocation Failure&#xff09;导致 如果不出现FullGC的字样说明它不是FUllGC&#xff0c;并不像Serial GC、ParallelGC的在老年代…

Golang的代码压缩技术应用案例分析与研究实践

Golang的代码压缩技术应用案例分析与研究实践 一、介绍 是一种具有强大性能和便捷开发特性的编程语言&#xff0c;除了其优秀的语法和标准库外&#xff0c;它还拥有很多高级特性&#xff0c;其中之一就是代码压缩技术。本文将从常见的Golang代码压缩技术应用案例出发&#xff0…

【Uniapp-Vue3】image媒体组件属性

如果我们想要在页面上展示图片就需要使用到image标签。 这部分最重要的是图片的裁剪&#xff0c;图片的裁剪和缩放属性&#xff1a; mode 图片裁剪、缩放的模式 默认值是scaleToFill 我将用两张图片对属性进行演示&#xff0c;一张是pic1.jpg&#xff08;宽更长&#xf…

【网络协议】交换机概念与配置(第一部分)

概述 本文将探讨交换机的概念以及交换机的基础配置&#xff0c;并以此引入对 VLAN 的讨论。 文章目录 概述CSMA/CD以太网通信单播&#xff08;Unicast&#xff09;多播&#xff08;Multicast&#xff09;广播&#xff08;Broadcast&#xff09; MAC 地址以太网中的双工设置半双…

oracle位运算、左移右移、标签算法等

文章目录 位运算基础与或非同或同或应用场景 异或异或应用场景 什么是真值表 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用&#xff0c;废弃掉该方案)右移函数(略&#xff0c;有此场景吗?) 实际应用资质字典…