[单master节点k8s部署]41.部署springcloud项目

在之前的文章中我们配置了mysql和harbor,现在我们可以将一个springcloud部署在k8s集群中了。

项目概述

这个springcloud项目将采用maven进行打包部署。首先安装maven:

yum install java-1.8.0-openjdk maven-3.0.5* -y

然后将该项目上传到k8s集群的master节点,并解压。大概看一眼这个项目的文件目录结构,可以看到每一个功能都是分开建立的文件夹:

basic-common  eureka-service   k8s      lombok.config  pom.xml         product-service  stock-service
db            gateway-service  LICENSE  order-service  portal-service  README.md

将我们安装数据库的地址写入文件中: 

cat /root/microservic-test/stock-service/stock-service-biz/src/main/resources/application-fat.yml
spring:datasource:url: jdbc:mysql://192.168.244.128:3306/tb_stock?characterEncoding=utf-8username: rootpassword: rootdriver-class-name: com.mysql.jdbc.Drivereureka:instance:prefer-ip-address: trueclient:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://eureka-0.eureka.ms:8888/eureka,http://eureka-1.eureka.ms:8888/eureka,http://eureka-2.eureka.ms:8888/eureka

将这里的数据库信息修改为之前设置的信息。 

 需要修改三个地方,另外两个地方是:

cat /root/microservic-test/product-service/product-service-biz/src/main/resources/application-fat.yml
cat /root/microservic-test/order-service/order-service-biz/src/main/resources/ application-fat.yml

 其实在每一个resource目录下有三个文件,分别是:application.yaml,application-fat.yaml和application-dev.yaml。查看application.yaml,可以看到这里规定了目前使用的profile是fat,也就是application-fat.yaml版本。这是我们只修改这个yaml文件的原因,另一个配置文件可能是用在别的环境中。

[root@master resources]# ls
application-dev.yml  application-fat.yml  application.yml
[root@master resources]# cat application.yml 
server:port: 8030
spring:profiles:active: fatapplication:name: stock-service
maven构建

随后进行maven构建项目。 在microservice-test目录下执行:

mvn clean package -D maven.test.skip=true

显示如下则构建成功。 

目录结构

在product service下,可以看到: 

pom.xml  product-service-api  product-service-biz

pom.xml:这是 product-service 的父 pom.xml,用于管理子模块的依赖和构建。它可能包含项目的全局依赖、插件配置等。
product-service-api:这个模块用于定义服务的 API,比如接口、模型类、常量等。这个模块的目的是将服务的公共部分(如客户端调用时需要的接口)与业务逻辑分离。
product-service-biz:这个模块包含了主要的业务逻辑,例如控制器(controller)、数据访问层(mapper)、启动类(ProductServiceApp.java)等。这个模块通常是真正部署到服务器或容器中的服务部分。 

product-service-api/
├── pom.xml
├── src
│   └── main
│       └── java
│           └── com
│               └── ctnrs
│                   └── product
│                       └── api
│                           ├── client
│                           │   └── ProductServiceClient.java
│                           ├── constant
│                           └── model
└── target

 其中这个target是maven生成的,Maven 打包后,通常会生成一个打包文件(如 .jar.war),并且会放在target目录下。

product-service-biz/
├── Dockerfile
├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── ctnrs
│       │           └── product
│       │               ├── controller
│       │               │   └── ProductController.java
│       │               ├── mapper
│       │               └── ProductServiceApp.java
│       └── resources
└── target

 根据这个文件的部分目录结构,可以看到业务和公共部分逻辑的分离理念。

配置harbor

在之前的文章中,我们设置了harbor虚拟机对harbor服务的登录,现在将配置扩大到整个集群。在每一个节点上修改/etc/docker/daemon.json文件为下面的样子,并重新启动docker。

cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.dockercn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hubmirror.c.163.com","http://qtid6917.mirror.aliyuncs.com"],
"insecure-registries":["192.168.244.131","harbor"], 
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts": {"max-size": "100m"},
"storage-driver":"overlay2" }
EOF

给登录habor配置一个secret。创建了一个namespace叫做ms。

kubectl create namespace ms && kubectl create secret docker-registry registry-pull-secret --docker-server=192.168.244.131 --docker-username=admin --docker-password=Harbor12345 -n ms

命令中的docker-registry是一种secret类型,用来存储用于访问私有 Docker 镜像仓库(如 Docker Hub、Harbor 等)的认证信息。包含Docker 注册表服务器地址(--docker-server),用户名(--docker-username),密码(--docker-password),可选的电子邮件地址(--docker-email)。

构建镜像

当我们用maven打包后,在每一个项目里面都会有一个target目录,存放.jar或.war文件。以eureka服务为例,进入目录后,看到Dockerfile文件和target目录。

[root@master microservic-test]# ls
basic-common  eureka-service   k8s      lombok.config  pom.xml         product-service  stock-service
db            gateway-service  LICENSE  order-service  portal-service  README.md
[root@master microservic-test]# cd eureka-service/
[root@master eureka-service]# ls
Dockerfile  pom.xml  src  target
[root@master eureka-service]# cat docker
cat: docker: 没有那个文件或目录
[root@master eureka-service]# cat Dockerfile 
FROM java:8-jdk-alpine
RUN  apk add -U tzdata && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY ./target/eureka-service.jar ./
EXPOSE 8888
CMD java -jar -Deureka.instance.hostname=${MY_POD_NAME}.eureka.ms /eureka-service.jar
  • FROM java:8-jdk-alpine:这是基础镜像,基于 Alpine Linux 的 Java 8 JDK 镜像alpine 是一个轻量级的 Linux 发行版,适合构建小体积的 Docker 镜像。

  • RUN  apk add -U tzdata && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    • 通过apk包管理器安装tzdata,这是一个用于配置时区数据的包。
    • 创建符号链接,将时区设置为中国标准时间Asia Shanghai。
  • COPY ./target/eureka-service.jar ./:这行命令将本地路径target目录下的eureka-service.jar 文件复制到 Docker 容器的当前目录(./),即容器的根文件夹。
  • Expose 8888:表示容器会监听 8888 端口,这是 Eureka 服务的默认端口之一(不过可以根据配置来修改)。

  • CMD java -jar -Deureka.instance.hostname=${MY_POD_NAME}.eureka.ms /eureka-service.jar 这是一个运行命令。

    •  假设你在 Kubernetes 中部署了一个 Pod,Pod 的名字是eureka-1,环境变量MY_POD_NAME就会是eureka-1。因此,最终的-Deureka.instance.host参数会变成:-Deureka.instance.hostname=eureka-1.eureka.ms,这方便eureka服务器找到这个pod。这里的ms是命名空间。

    • 这一行规定了如何启动这个镜像:-jar -Deureka.instance.hostname=${MY_POD_NAME}.eureka.ms /eureka-service.jar

因此,通过docker build生成镜像后,在部署这个镜像的yaml文件中需要传入启动参数,则这个服务可以运行。下面为一个举例说明。

apiVersion: apps/v1
kind: Deployment
metadata:name: eureka-servicelabels:app: eureka
spec:replicas: 1selector:matchLabels:app: eurekatemplate:metadata:labels:app: eurekaspec:containers:- name: eureka-serviceimage: <your-docker-registry>/eureka-service:latestports:- containerPort: 8888env:- name: MY_POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.namecommand: ["java"]args: ["-jar", "-Deureka.instance.hostname=${MY_POD_NAME}.eureka.ms", "/eureka-service.jar"]

 通过查看target目录,可以看到确实有一个jar包。

[root@master eureka-service]# cd target
[root@master target]# ls
classes  eureka-service.jar  eureka-service.jar.original  generated-sources  maven-archiver  maven-status

 创建镜像项目

在之前创建的harbor的网页上新建一个microservice的项目,用于存储需要的镜像。

部署eureka项目
构建eureka镜像

在这里我发现我无法拉取dockerfile中写的java:8-jdk-alpine,所以我下载了openjdk:8-jdk-alpine,并且修改了dockerfile。接下来进行镜像的构建,从这个命令中可以看出,我们要将这个eureka-service构建的镜像标记为eureka:v1的镜像,他的全名为 192.168.244.131/microservice/eureka:v1,参数-t 是tag的意思。

.代表构建上下文(build context) 的路径,它指定了 Docker 在构建镜像时应该从哪里加载构建所需的文件。.(点):表示当前目录,即 Docker 在当前目录下寻找 Dockerfile 和其他相关文件。Docker 会将 . 目录下的所有文件(除 .dockerignore 文件中排除的文件外)打包并发送给 Docker 构建器,作为构建上下文。

[root@master eureka-service]# docker build -t 192.168.244.131/microservice/eureka:v1 .
[+] Building 347.2s (8/8) FINISHED                                                                                                                docker:default=> [internal] load build definition from Dockerfile                                                                                                        0.0s=> => transferring dockerfile: 288B                                                                                                                        0.0s=> [internal] load metadata for docker.io/library/openjdk:8-jdk-alpine                                                                                     0.0s=> [internal] load .dockerignore                                                                                                                           0.0s=> => transferring context: 2B                                                                                                                             0.0s=> [1/3] FROM docker.io/library/openjdk:8-jdk-alpine                                                                                                       0.0s=> [internal] load build context                                                                                                                           4.8s=> => transferring context: 47.24MB                                                                                                                        4.8s=> [2/3] RUN  apk add -U tzdata &&      ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                                                          345.9s=> [3/3] COPY ./target/eureka-service.jar ./                                                                                                               0.8s => exporting to image                                                                                                                                      0.3s => => exporting layers                                                                                                                                     0.3s => => writing image sha256:fb51d84d96efb708ef534dc356f1210293e01af0f0b1de47e0cfcc1b13cfca50                                                                0.0s => => naming to 192.168.244.131/microservice/eureka:v1                                                                                                     0.0s
您在 /var/spool/mail/root 中有新邮件
[root@master eureka-service]# docker images | grep eureka
192.168.244.131/microservice/eureka                                                                    v1                fb51d84d96ef   4 minutes ago   155MB

构建成功后查看镜像,可以看到我们的镜像已经存在于本地docker仓库。

随后登录harbor,然后进行镜像推送,可以看到eureka镜像已经存在于harbor中。

root@master eureka-service]# docker login 192.168.244.131
Username: admin
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/#credentials-storeLogin Succeeded
您在 /var/spool/mail/root 中有新邮件
[root@master eureka-service]# docker push 192.168.244.131/microservice/eureka:v1
The push refers to repository [192.168.244.131/microservice/eureka]
dbce7a157739: Pushed 
939637c19880: Pushed 
ceaf9e1ebef5: Pushed 
9b9b7f3d56a0: Pushed 
f1b5933fe4b5: Pushed 
v1: digest: sha256:ae13dc24e2f0a3ed98d3aa5178209b28e8531c32557e458364e294ad19ad9284 size: 1370

镜像部署 
[root@master microservic-test]# ls
basic-common  eureka-service   k8s      lombok.config  pom.xml         product-service  stock-service
db            gateway-service  LICENSE  order-service  portal-service  README.md
[root@master microservic-test]# cd k8s/
[root@master k8s]# ls
eureka-service-node.yaml  gateway-service-node.yaml  order.yaml      portal-service-node.yaml  portal.yaml.bak  stock.yaml
eureka.yaml               gateway.yaml               order.yaml.bak  portal.yaml               product.yaml

我们在这个目录中回退一层,然后进入k8s目录,查看eureka的资源清单。由于我使用的是1.30版本的k8s集群,而且容器运行时采用的是containerd,所以很多东西都要重写。

未能成功的使用container的镜像拉取工具来拉取镜像,因此以下采用docker 拉取,重新打包然后导入container的方法。

修改yaml

eureka.yaml资源清单中写了ingress、service和statefulset 三个文件,这里的ingress需要修改,因为在新版的k8s中,ingress的API组已经发生了变化。新的ingress配置如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: eurekanamespace: ms
spec:ingressClassName: "nginx"rules:- host: eureka.ctnrs.comhttp:paths:- path: /pathType: Prefixbackend:service:name: eurekaport:number: 8888

同时,由于我没有成功的配置containerd从harbor拉取镜像,所以修改statefulset的配置为:imagePullPolicy:Never,随后用docker pull从harbor拉取镜像,docker -save打包,随后用ctr导入镜像。

在进行上述的配置后,kubectl apply -f eureka.yaml,随后可以看到三个实例部署成功。(因为资源清单里写的实例数量是3个,事实上我只有两个工作节点,所以有两个实例在同一个node上)

[root@master k8s]# kubectl get pods -n ms -owide
NAME       READY   STATUS    RESTARTS   AGE   IP               NODE    NOMINATED NODE   READINESS GATES
eureka-0   1/1     Running   0          37m   10.244.104.62    node2   <none>           <none>
eureka-1   1/1     Running   0          31m   10.244.166.136   node1   <none>           <none>
eureka-2   1/1     Running   0          29m   10.244.104.63    node2   <none>           <none>

因为我的ingress controller部署在node1上,所以按理来说所有的ingress发布的端口都在node1的ip上;

[root@master k8s]# kubectl get ingress -n ms
NAME     CLASS   HOSTS              ADDRESS           PORTS   AGE
eureka   nginx   eureka.ctnrs.com   192.168.244.129   80      19m

更改本电脑hosts文件,将eureka的网址写在我们的hosts文件中。

访问eureka网址:eureka.ctnrs.com,可以看到如下页面,这里可以看到列举了所有的eureka的server全名以及端口等信息。eureka是一个服务发现的服务,目前还没有部署其他服务,所以看不到效果。

部署gateway
构建gateway镜像

同理,进入gateway-service的目录,修改Dockerfile中的镜像名称。

可以进入target目录查看gateway-service.jar。

[root@master microservic-test]# ls 
basic-common  eureka-service   k8s      lombok.config  pom.xml         product-service  stock-service
db            gateway-service  LICENSE  order-service  portal-service  README.md
[root@master microservic-test]# cd gateway-service/
[root@master gateway-service]# ls
Dockerfile  pom.xml  src  target
[root@master gateway-service]# cd target/
[root@master target]# ls
classes  gateway-service.jar  gateway-service.jar.original  generated-sources  maven-archiver  maven-status
[root@master target]# cd ..
[root@master gateway-service]# vim Dockerfile 
[root@master gateway-service]# cat Dockerfile 
FROM openjdk:8-jdk-alpine
RUN  apk add -U tzdata && \ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY ./target/gateway-service.jar ./
EXPOSE 9999
CMD java -jar /gateway-service.jar

随后进行Dockerfile构建,成功构建镜像后上传到harbor。

[root@master gateway-service]# docker build -t 192.168.244.131/microservice/gateway:v1 .
[+] Building 3.5s (8/8) FINISHED                                                                                                                  docker:default=> [internal] load build definition from Dockerfile                                                                                                        0.0s=> => transferring dockerfile: 238B                                                                                                                        0.0s=> [internal] load metadata for docker.io/library/openjdk:8-jdk-alpine                                                                                     0.0s=> [internal] load .dockerignore                                                                                                                           0.0s=> => transferring context: 2B                                                                                                                             0.0s=> [1/3] FROM docker.io/library/openjdk:8-jdk-alpine                                                                                                       0.0s=> [internal] load build context                                                                                                                           2.0s=> => transferring context: 43.42MB                                                                                                                        2.0s=> CACHED [2/3] RUN  apk add -U tzdata &&      ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime                                                     0.0s=> [3/3] COPY ./target/gateway-service.jar ./                                                                                                              1.2s=> exporting to image                                                                                                                                      0.1s=> => exporting layers                                                                                                                                     0.1s=> => writing image sha256:1b8d154f901e41a0427cc9b51f80145139df23811700606c964aebcce36a742c                                                                0.0s=> => naming to 192.168.244.131/microservice/gateway:v1                                                                                                    0.0s[root@master gateway-service]# docker images | grep gateway
192.168.244.131/microservice/gateway                                                                   v1                1b8d154f901e   14 seconds ago   151MB
[root@master gateway-service]# docker login harbor
Authenticating with existing credentials...
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/#credentials-storeLogin Succeeded
[root@master gateway-service]# docker push 192.168.244.131/microservice/gateway:v1
The push refers to repository [192.168.244.131/microservice/gateway]
972f1566a1a7: Pushed 
939637c19880: Mounted from microservice/eureka 
ceaf9e1ebef5: Mounted from microservice/eureka 
9b9b7f3d56a0: Mounted from microservice/eureka 
f1b5933fe4b5: Mounted from microservice/eureka 
v1: digest: sha256:16d8b0ee21e4c8cdf1932bf575063e3b4e42284a9c93024e0819c4c4f2e3d918 size: 1370

 对于两个node节点,可以进行docker pull 192.168.244.131/microservice/gateway:v1,随后进行docker save 和ctr import等命令,从而将镜像导入containerd的镜像空间。

[root@node1 images]# docker save -o gateway.v1.tar 192.168.244.131/microservice/gateway:v1
[root@node1 images]# ctr -n k8s.io images import gateway.v1.tar 
unpacking 192.168.244.131/microservice/gateway:v1 (sha256:a3ea34dfccad5ae45f2806acdbe603697fb9d42b4d92b8c8a5699b2d22dc98f4)...done

当两个工作节点都有镜像后,进行pod的部署。

镜像部署

同理也是修改ingress文件和deployment文件,修改镜像名称以及拉取机制,修改hosts文件。

[root@master k8s]# kubectl get pods -n ms
NAME                       READY   STATUS    RESTARTS   AGE
eureka-0                   1/1     Running   0          70m
eureka-1                   1/1     Running   0          63m
eureka-2                   1/1     Running   0          62m
gateway-6bc9dc7657-7vnt6   1/1     Running   0          3m59s
gateway-6bc9dc7657-nvpgq   1/1     Running   0          3m59s
[root@master k8s]# kubectl get ingress -n ms
NAME      CLASS   HOSTS               ADDRESS           PORTS   AGE
eureka    nginx   eureka.ctnrs.com    192.168.244.129   80      70m
gateway   nginx   gateway.ctnrs.com   192.168.244.129   80      38s

gateway也是可以通过域名访问,但是本身这只是一个网关,所以没有界面。

但是我们可以看到eureka检测到了这个服务。

进入microservic-test/gateway-service/src/main/resources目录下,查看application-fat.yaml文件,可以看到如下内容。

[root@master eureka-service]# cd /root/yaml_file/36microservice/microservic-test/gateway-service/src/main/resources
[root@master resources]# ls
application-dev.yml  application-fat.yml  application.yml
[root@master resources]# cat application-fat.yml 
spring:
  cloud:
    gateway:
      discovery:
        locator:
          #开启以服务id去注册中心上获取转发地址
          enabled: true
          ##小写serviceId
          lower-case-service-id: true
      routes:
        - id: product-service
          uri: lb://product-service
          filters:
            - StripPrefix=1
          predicates:
            - Path=/product/**

        - id: order-service
          uri: lb://order-service
          filters:
            - StripPrefix=1
          predicates:
            - Path=/order/**

        - id: stock-service
          uri: lb://stock-service
          filters:
            - StripPrefix=1
          predicates:
            - Path=/stock/**

eureka:
  instance:
    prefer-ip-address: true
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://eureka-0.eureka.ms:8888/eureka,http://eureka-1.eureka.ms:8888/eureka,http://eureka-2.eureka.ms:8888/eureka

eureka:instance:prefer-ip-address: trueclient:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://eureka-0.eureka.ms:8888/eureka,http://eureka-1.eureka.ms:8888/eureka,http://eureka-2.eureka.ms:8888/eureka

这一部分与eureka的配置有关,可以看到这里使用的eureka的实例是写死的。

在实际生产环境中一般会采用更加灵活的写法,只写上eureka的服务名称。

service-url:defaultZone: http://eureka.ms:8888/eureka
 部署前端portal服务
构建portal镜像

同上,修改Dockerfile镜像名称,然后构建镜像。

上传镜像到harbor。

镜像部署

把镜像都下载导入到containerd的镜像空间,然后修改portal.yaml文件,并部署资源清单文件。

[root@master k8s]# kubectl get pods -n ms
NAME                       READY   STATUS    RESTARTS   AGE
eureka-0                   1/1     Running   0          98m
eureka-1                   1/1     Running   0          92m
eureka-2                   1/1     Running   0          91m
gateway-6bc9dc7657-7vnt6   1/1     Running   0          32m
gateway-6bc9dc7657-nvpgq   1/1     Running   0          32m
portal-54c8496c79-j6vxw    1/1     Running   0          88s
[root@master k8s]# vim portal.yaml
[root@master k8s]# kubectl get ingress -n ms
NAME      CLASS   HOSTS               ADDRESS           PORTS   AGE
eureka    nginx   eureka.ctnrs.com    192.168.244.129   80      99m
gateway   nginx   gateway.ctnrs.com   192.168.244.129   80      29m
portal    nginx   portal.ctnrs.com    192.168.244.129   80      64s

修改hosts文件,可以通过网页浏览这个服务。

同时发现该服务也被eureka发现。

查看portal的application文件,可以看到配置了eureka。 

[root@master resources]# cd /root/yaml_file/36microservice/microservic-test/portal-service/src/main/resources
[root@master resources]# cat application-fat.yml 
eureka:instance:prefer-ip-address: trueclient:service-url:defaultZone: http://eureka-0.eureka.ms:8888/eureka,http://eureka-1.eureka.ms:8888/eureka,http://eureka-2.eureka.ms:8888/eurekaregister-with-eureka: truefetch-registry: truespring:freemarker:allow-request-override: falseallow-session-override: falsecache: truecharset: UTF-8check-template-location: truecontent-type: text/htmlenabled: trueexpose-request-attributes: falseexpose-session-attributes: falseexpose-spring-macro-helpers: trueprefer-file-system-access: truesuffix: .ftltemplate-loader-path: classpath:/templates/
部署product、order和stock服务

这三个服务没有ingress和service,只需要修改Dockerfile以及deployment文件,构建镜像和pod之后,就可以被eureka发现。

值得注意的是,这三个文件夹里面会有两个子文件夹,进入后缀为biz的文件夹,就可以看到dockerfile等文件。

[root@master microservic-test]# ls
basic-common  eureka-service   k8s      lombok.config  pom.xml         product-service  stock-service
db            gateway-service  LICENSE  order-service  portal-service  README.md
[root@master microservic-test]# cd product-service/
[root@master product-service]# ls 
pom.xml  product-service-api  product-service-biz
[root@master product-service]# cd product-service-biz/
[root@master product-service-biz]# ls
Dockerfile  pom.xml  src  target


此时我已经部署完所有的服务,可以正常使用这个电商网站了。


 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#编写的各类应用程序

001 课程简介&#xff0c;C# 语言简介&#xff0c;开发环境准备 (yuque.com)https://www.yuque.com/yuejiangliu/dotnet/timothy-csharp-001 一个Solution里包含多个Project 一、见识 C# 编写的各类应用程序 二、类库的引用&#xff08;黑/白盒引用&#xff09; 1、黑盒引用&a…

C++从入门到起飞之——(multi)set与(multi)map的的使用 全方位剖析!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a;C从入门到起飞 &#x1f516;克心守己&#xff0c;律己则安 目录 1. 序列式容器和关联式容器 2. set系列的使⽤ 2.1 set和multiset参考⽂档 2.2 set类的介绍 2.3 se…

打印自然常数E

自然常数E 自然常数&#xff0c;符号e&#xff0c;为数学中一个常数&#xff0c;是一个无限不循环小数&#xff0c;且为超越数&#xff0c;其值约为2.718281828459045。它是自然对数函数的底数。 我们打印表达式(11/x)的x次方的值以及获取第一次大于2.718的正整数 新建C#控制…

Linux系统:Ubuntu上安装Chrome浏览器

Ubuntu系统版本&#xff1a;23.04 在Ubuntu系统上安装Google Chrome浏览器&#xff0c;可以通过以下步骤进行&#xff1a; 终端输入以下命令&#xff0c;先更新软件源&#xff1a; sudo apt update 或 sudo apt upgrade终端输入以下命令&#xff0c;下载最新的Google Chrome .…

HarmonyNext保存Base64文件到Download下

本文介绍如何保存Base64的文件到Download下 参考文档地址&#xff1a; 保存用户文件-Harmony Next 用到的是DOWNLOAD模式保存文件 用户在使用save接口时&#xff0c;可以将pickerMode配置为DOWNLOAD模式&#xff0c;该模式下会拉起授权接口&#xff0c;用户确认后会在公共路径…

net core 微信公众号发送模板消息完整实现

第一完整看一下微信官方的文档 链接&#xff1a;开发前必读 / 首页 (qq.com) 想要发送模板消息分为一下几步 第一步&#xff1a;想要发消息需要有这几个参数&#xff0c; openid&#xff0c;这是给谁发消息 access_token&#xff0c;调用接口必要的 appid、secret 这两个是生…

如何替换OCP节点(二):使用 antman脚本 | OceanBase应用实践

前言&#xff1a; OceanBase Cloud Platform&#xff08;简称OCP&#xff09;&#xff0c;是 OceanBase数据库的专属企业级数据库管理平台。 在实际生产环境中&#xff0c;OCP的安装通常是第一步&#xff0c;先搭建OCP平台&#xff0c;进而依赖OCP来创建、管理和监控我们的生…

开放式蓝牙耳机哪个品牌好用?开放式耳机排行榜测评!

开放式耳机&#xff0c;因其特殊的不入耳佩戴模式&#xff0c;让使用者在享受音乐或者进行通话的过程中&#xff0c;依然可以对外界声音保持敏感。在户外运动场景下&#xff0c;这种特性优势尽显&#xff0c;既保证了耳机佩戴的稳定和舒适&#xff0c;又提高了运动的安全性。为…

如何做好项目管理,实现高效协作?

项目管理难&#xff0c;难于上青天&#xff01; 小卫&#xff0c;某服装生产企业项目经理&#xff0c;说到项目难管理&#xff0c;他有话要说&#xff1a; 做项目&#xff0c;看似简单&#xff0c;不同部门各司其职&#xff0c;但也正因为涉及跨部门协作&#xff0c;管理难度也…

Qt:图片文字转base64程序

目录 一.Base64 1.编码原理 2.应用场景 3.优点 4.限制 5.变种 二.文字与Base64互转 1.ui设计 2.文字转Base64 3.Base64转文字 三.图片与Base64互转 1.ui设计 2.选择图片与图片路径 3.图片转Base64 4.Base64转图片 四.清空设置 五.效果 六.代码 base64conver…

基于SpringBoot+Vue+uniapp的时间管理小程序的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

大厂面试一上来就手撕 Transformer,心凉半截

在这两年&#xff0c;尤其是大模型问世之后&#xff0c;有关 Transformer 的面试题不仅数量众多&#xff0c;而且颇具新意。 今日&#xff0c;我将分享 18 道 Transformer 高频面试题&#xff08;如需获取更多专业面试题&#xff0c;扫描文末二维码即可&#xff09;&#xff0…

关于为什么蒸馏后的小模型和一开始的小模型的区别是什么?

起初&#xff0c;我想写这个博客是因为无意间看到了一个采访&#xff0c;无意间浏览才发现这段说的给我一种恍然大悟的感觉。 主持人提问&#xff1a;训练一个大模型&#xff0c;然后再将其压缩蒸馏成一个小模型&#xff0c;那和直接训练一个小模型&#xff0c; 这两者的区别是…

再Android10上实现检测AHD摄像头是否接入

项目有个需要&#xff0c;需要知道tp9951是否接入AHD摄像头 1&#xff0c;驱动层可以通过读取寄存器的值来检测是否接入AHD摄像头 tp9951_write_reg(0x40, 0x00); //select decoder page tp9951_write_reg(0x41, ch); val tp9951_read_reg(TP_INPUT_STATUS_REG);…

【含文档】基于Springboot+Vue的仓库管理系统设计与实现(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

ZBrush和3D-Coat各自的优缺点是什么?

zbrush支持的模型面数高英文界面&#xff0c;3d coat支持的模型面数比zbrsh低有中文界 ZBrush优缺点 1、ZBrush优点&#xff1a; zbrush是高精度建模poser制作的首选。可搭配雕刻版使用&#xff0c;主要为烘焙高细节的铁图建模。因为是高精度模型&#xff0c;不适用于动画和游…

MySQL【知识改变命运】08

数据库约束 1&#xff1a;约束的几个类型2&#xff1a;NOT NULL非空约束3&#xff1a;UNIQUE 唯⼀约束4&#xff1a;PRIMARY KEY 主键约束4.1:回顾 5&#xff1a;FOREIGN KEY 外键约束5.1&#xff1a;创建班级表(主表)&#xff0c;并初始化数据5.2&#xff1a;重构学⽣表(从表)…

移动云智算平台,斩获两大国际知名设计奖项

近日&#xff0c;移动云一站式智算平台从全球激烈的竞争中脱颖而出&#xff0c;斩获2024年缪斯设计奖与法国设计奖两项国际知名设计大奖。这两大奖项在全球设计与创新领域颇具影响力&#xff0c;致力于表彰来自全球的优秀和原创设计作品。此次获奖&#xff0c;体现了移动云出色…

5. Node.js Http模块

2.4 Http模块 2.4.1创建Http服务端 //1.导入http模块 let http=require(http)//2.创建服务对象 let server=http.createServer((request,response)=>{console.log(request.method) //获取请求方式console.log(request.url) //获取请求url(路径和参数部份…

JavaWeb Servlet--09深入:注册系统04--修改页面

修改页面 分析&#xff1a;点击修改超链接&#xff0c;就跳转到一个修改界面&#xff0c;要显示原本的数据&#xff0c;且密码显示出来&#xff0c;在该页面将对用户的数据的进行修改&#xff0c;最后提交。 开始业务&#xff1a; 1.在web下创建一个修改界面update.jsp 写法…