当前位置: 首页 > java >正文

微服务的编程测评系统22-项目部署结束

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 1. 项目部署
    • 1.1 nacos上的项目配置
    • 1.2 其他组件的docker-compose
    • 1.3 后端打包
    • 1.4 组件之间依赖关系
    • 1.5 nginx配置
    • 1.6 docker一些命令
    • 1.7 修改
    • 1.8 第二台机器
    • 1.9 测试
    • 1.10 纠错
  • 总结


前言

1. 项目部署

1.1 nacos上的项目配置

http://192.168.56.107:8848/nacos/就可以了
其中192.168.56.107是公网,外网
一开始会先进入登录页面
在这里插入图片描述
默认密码是nacos和nacos

在这里插入图片描述

这里可以修改密码

        username: nacospassword: nacosckoj_8

在这里插入图片描述

然后是创建命令空间

```java
spring:application:name: oj-gatewayprofiles:active: localcloud:nacos:discovery:namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ecserver-addr: http://你安装nacos的云服务器内网ip:8848username: nacospassword: nacosckoj_8ip: ${HOST_IP}config:namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ecserver-addr: http://你安装nacos的云服务器内网ip:8848file-extension: yamlusername: nacospassword: nacosckoj_8

然后是修改bootstrap.yml
其中内网ip可以在阿里云的控制台查询到,外网ip也可以查询到,但是在浏览器上用nacos就要用外网ip了
因为我用的是本地的ubuntu,所以就是192.168.56.107了

spring:application:name: oj-gatewayprofiles:active: localcloud:nacos:discovery:namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ecserver-addr: http://192.168.56.107:8848username: nacospassword: nacosckoj_8ip: ${HOST_IP}config:namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ecserver-addr: http://192.168.56.107:8848file-extension: yamlusername: nacospassword: nacosckoj_8

记得其他的微服务也要改
因为java的程序都是在一台服务器上跑的,所以可以用内网ip来相互访问的
但是浏览器访问nacos是不能用内网ip的,因为服务器的内网是在阿里云那边的
但是我们的浏览器不在阿里云那边

然后是nacos上面的配置了

server:port: 9201
spring:data:redis:host: 192.168.56.107password: 123456datasource:url: jdbc:mysql://192.168.56.107:3306/ckoj_dev?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8username: ojtestpassword: 123456hikari:minimum-idle: 5 # 最⼩空闲连接数maximum-pool-size: 20 # 最⼤连接数idle-timeout: 30000 # 空闲连接存活时间(毫秒)connection-timeout: 30000 # 连接超时时间(毫秒)elasticsearch:uris: http://192.168.56.107:9200
jwt:secret: zxcvbnmasdfghjkl

在这里插入图片描述
直接复制以前的就可以了,然后把ip改为内网ip,或者公网ip

server:port: 9204
spring:rabbitmq:host: 192.168.56.108port: 5672username: adminpassword: admindatasource:url: jdbc:mysql://192.168.56.108:3306/ckoj_dev?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8username: ojtestpassword: 123456hikari:minimum-idle: 5 # 最⼩空闲连接数maximum-pool-size: 20 # 最⼤连接数idle-timeout: 30000 # 空闲连接存活时间(毫秒)connection-timeout: 30000 # 连接超时时间(毫秒)
jwt:secret: zxcvbnmasdfghjkl
sandbox:docker:host: tcp://172.17.0.1:2375limit:memmory: 100000000memory-swap: 100000000cpu: 1time: 5

注意docker这里我们要用docker0的ip
http://192.168.56.107/是我的内网ip,我这个只有内网ip

1.2 其他组件的docker-compose

因为这些组件之间得到依赖性不强了,所以一起搞

  oj-xxl-job-server:container_name: oj-xxl-job-serverimage: xuxueli/xxl-job-admin:2.4.0# 设置连接MySQL的URL、用户名和密码等配置。environment:- SPRING_DATASOURCE_URL=jdbc:mysql://oj-mysql-server:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai- SPRING_DATASOURCE_USERNAME=ojtest- SPRING_DATASOURCE_PASSWORD=123456# 假设xxl-job监听在8080端口ports:- "8080:8080"# 依赖于 oj-mysql-server 服务,并在其状态为健康时启动。depends_on:oj-mysql-server:condition: service_healthyoj-redis-server:container_name: oj-redis-serverimage: redis:latestports:- "6379:6379"volumes:- ./redis/data:/data# 设置 Redis 的访问密码。environment:REQUIREPASS: 123456healthcheck:test: [ "CMD", "redis-cli", "ping" ]interval: 10stimeout: 5sretries: 10oj-gateway:image: ck/oj-gateway:0.0.1-SNAPSHOT# 提供了构建上下文的路径。这意味着Docker将在./bitoj-jar/gateway/目录中寻找构建所需的文件。build:context: ./ckoj-jar/gateway/container_name: oj-gatewayenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.107ports:- "19090:19090"privileged: truedepends_on:oj-nacos-server:condition: service_healthyoj-redis-server:condition: service_healthyoj-nginx-server:# 使用 nginx:1.21 镜像。image: nginx:1.21# 容器名称为 oj-nginx-servercontainer_name: oj-nginx-servervolumes:# 配置文件挂载- ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf# 前端项目部署核心步骤。这可以用于将一些静态资源(如网页、文件、图片等)从本地主机挂载到容器中,供 Nginx 进行服务。- ./nginx/dist:/home/distenvironment:# 时区上海TZ: Asia/Shanghai# 端口映射ports:- "80:80"- "10030:10030"- "443:443"privileged: true# 表示此服务依赖于 oj-gateway 服务,即 oj-gateway 服务启动后才会启动此服务。depends_on:- oj-gatewayoj-elasticsearch-server:container_name: oj-elasticsearch-serverimage: elasticsearch:8.5.3ports:- "9200:9200"# 挂载本地目录用于存储 Elasticsearch的数据、插件。volumes:- ./elasticsearch/es-plugins:/usr/share/elasticsearch/plugins# 设置为单节点模式,并限制 Java 虚拟机的内存使用。暂时禁用了Elasticsearch的安全特性environment:discovery.type: single-nodeES_JAVA_OPTS: "-Xms256m -Xmx256m"xpack.security.enabled: false# 通过执行 curl 命令检查 Elasticsearch 的集群健康状态。healthcheck:test: [ "CMD", "curl", "-s", "http://localhost:9200/_cluster/health?wait_for_status=green&timeout=1s" ]interval: 30stimeout: 5sretries: 10oj-kibana-server:image: kibana:8.5.3container_name: oj-kibana-serverports:- "10010:5601"# 依赖于 oj-elasticsearch-server 服务,并在其健康时启动。depends_on:oj-elasticsearch-server:condition: service_healthy# 设置系统语言为中文,并指定连接到 Elasticsearch 的 URLenvironment:I18N_LOCALE: zh-CNELASTICSEARCH_URL: http://elasticsearch:9200oj-rabbitMQ-server:container_name: oj-rabbitMQ-serverimage: rabbitmq:3.8.30-managementports:- "5672:5672"- "10020:15672"volumes:- ./rabbit/data:/var/lib/rabbitmq# 设置 RabbitMQ 的默认用户名和密码。environment:RABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: adminhealthcheck:test: [ "CMD", "rabbitmqctl", "status" ]interval: 30stimeout: 10sretries: 10oj-system:image: ck/oj-system:0.0.1-SNAPSHOTbuild:context: ./ckoj-jar/system/container_name: oj-systemenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.107ports:- "9201:9201"privileged: truedepends_on:oj-nacos-server:condition: service_healthyoj-redis-server:condition: service_healthyoj-elasticsearch-server:condition: service_healthyoj-friend:image: ck/oj-friend:0.0.1-SNAPSHOTbuild:context: ./ckoj-jar/friend/container_name: oj-friendenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.107ports:- "9202:9202"privileged: truedepends_on:oj-nacos-server:condition: service_healthyoj-redis-server:condition: service_healthyoj-elasticsearch-server:condition: service_healthyoj-rabbitMQ-server:condition: service_healthyoj-job:image: ck/oj-job:0.0.1-SNAPSHOTbuild:context: ./ckoj-jar/job/container_name: oj-jobenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.107ports:- "9203:9203"privileged: truedepends_on:oj-nacos-server:condition: service_healthyoj-redis-server:condition: service_healthyoj-judge:image: ck/oj-judge:0.0.1-SNAPSHOTbuild:context: ./ckoj-jar/judge/container_name: oj-judge# 将本地目录挂载到容器内的用户代码存储目录volumes:- /user-code-pool:/user-code-poolenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.107privileged: truedepends_on:oj-nacos-server:condition: service_healthyoj-rabbitMQ-server:condition: service_healthy

gateway的HOST_IP应该为http://192.168.56.107/
在这里插入图片描述
这里bootstrap里面的${HOST_IP}指的是环境变量里面的ip

    environment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 服务所在云服务器内网IP

就是这里配置的环境变量

所有的微服务都要配置HOST_IP

    depends_on:oj-nacos-server:condition: service_healthyoj-redis-server:condition: service_healthy

然后是gateway的依赖项有多个,依赖redis和nacos

      - ./nginx/conf/default.conf:/etc/nginx/conf.d/default.conf- ./nginx/dist:/home/dist

然后是nginx,有这个配置文件
静态资源也是用的这个

    volumes:- ./elasticsearch/es-plugins:/usr/share/elasticsearch/plugins

然后是es,我们挂载的是插件
因为有个分词器要挂载上去
在这里插入图片描述
es的鉴权现在暂时不打开

    image: ck/oj-gateway:0.0.1-SNAPSHOT

在这里插入图片描述
build是镜像的来源

1.3 后端打包

mvn clean package -DskipTests

maven安装
安装成功以后,关闭idea,重新启动,因为可能没有反应过来已经更新了path

然后在idea的控制台执行mvn clean package -DskipTests就可以了
在这里插入图片描述
这样就成功了
然后就可以执行脚本了

#rm ../ckoj-jar/gateway/oj-gateway.jar
#rm ../ckoj-jar/friend/oj-friend.jar
#rm ../ckoj-jar/job/oj-job.jar
#rm ../ckoj-jar/judge/oj-judge.jar
#rm ../ckoj-jar/system/oj-system.jar
copy ../../../oj-gateway/target/oj-gateway-1.0-SNAPSHOT.jar ../ckoj-jar/gateway/oj-gateway.jar
copy ../../../oj-modules/oj-judge/target/oj-judge-1.0-SNAPSHOT.jar ../ckoj-jar/judge/oj-judge.jar
copy ../../../oj-modules/oj-friend/target/oj-friend-1.0-SNAPSHOT.jar ../ckoj-jar/friend/oj-friend.jar
copy ../../../oj-modules/oj-job/target/oj-job-1.0-SNAPSHOT.jar ../ckoj-jar/job/oj-job.jar
copy ../../../oj-modules/oj-system/target/oj-system-1.0-SNAPSHOT.jar ../ckoj-jar/system/oj-system.jar
pause

我们用powershell来执行脚本
在这里插入图片描述
直接搜索就可以打开了

cd D:\spring-project\ck-oj\deploy\test\sh
.\copy.ps1

在这里插入图片描述
出现这个按enter就成功了
在这里插入图片描述
如果只有组件,我们是可以docker compose up -d,直接拉取镜像
但是有了微服务的话,就不可以了,是因为镜像这一块,因为mysql和nacos镜像不是我们自定义的,不需要构建这两个镜像的,但是这些微服务的镜像我们是没有的,所以要先构建这些微服务的镜像才可以构建容器

先用docker compose build来构建镜像—》java服务

docker compose build

直接这个命令,然后就可以根据docker compose .yml来构建镜像了
在这里插入图片描述

然后是

docker compose up -d

1.4 组件之间依赖关系

在这里插入图片描述
在这里插入图片描述

1.5 nginx配置

然后是nginx的配置,比如服务器组的配置

upstream ckoj {server 你的云服务器1内网IP:19090;server 你的云服务器2内网IP:19090;
}
server {listen       80;listen  [::]:80;server_name  localhost;#access_log  /var/log/nginx/host.access.log  main;location / {root   /home/dist/oj-fe-c/dist;index  index.html index.htm;try_files $uri $uri/ /index.html;}location /dev-api/ {proxy_pass http://ckoj/friend/;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}
}server {listen       10030;server_name  localhost;#access_log  /var/log/nginx/host.access.log  main;location / {root   /home/dist/oj-fe-b/dist;index  index.html index.htm;try_files $uri $uri/ /index.html;}location  /dev-api/ {proxy_pass http://ckoj/system/;}
}

upstream 中配置服务器组的时候均使⽤服务器的内⽹ip。
在 server 块中配置了两个端⼝的监听:80 和 10030。因为我们有 B 端和 C 端,有各⾃不同的静态资源和动态资源,所以需要分别监听这两个端⼝。
root /home/dist/oj-fe-c/dist : 这段配置指定静态资源的⽬录。这⾥所说的静态资源正是我们前⾯讲nginx 动静分离时提到的静态资源。

upstream配置的是服务器组,后面跟的是网关的端口号

为什么配置两个server呢,因为有b端和c端
b端是10030端口号
c端是80端口号

    location /dev-api/ {proxy_pass http://ckoj/friend/;}

这个就是代理,请求以/dev-api/开头就代理到http://ckoj/friend/

    location / {root   /home/dist/oj-fe-c/dist;index  index.html index.htm;try_files $uri $uri/ /index.html;}

try_files $uri $uri/ /index.html; : 由于我们的前端应⽤是⽤Vue开发的单⻚⾯应⽤(SPA),并使⽤客⼾端路由来管理⻚⾯的不同状态和视图。然⽽,服务器并不识别这些前端路由,只会处理来⾃客⼾端的URL请求,这可能导致404错误。通过添加这段配置,⽆论⽤⼾请求的路径是什么,最终都会被导向SPA的 index.html ⽂件。这个⽂件通常是SPA的⼊⼝点。index.html 就是我们前端项目的入口点

在这里插入图片描述
在这里插入图片描述

挂载的话,自己写了容器就会同步我们写的,我们没有写,就会去同步容器的数据

1.6 docker一些命令

docker images 
docker rmi -f 镜像ID或名称:标签docker ps -a
# 先停止容器(若运行中)
docker stop 容器ID或名称
docker rm 容器ID或名称
docker rm -f 容器ID或名称  # 无需先停止,直接删除docker logs 容器ID或名称 # 看日志docker compose builddocker compose up -ddocker compose downdocker restart id重新启动容器

docker compose down 是 Docker Compose 的一个命令,用于停止并删除当前 Docker Compose 管理的所有容器

它的主要作用是:

停止所有通过 docker compose up 启动的容器
删除这些已停止的容器
删除由 Compose 创建的自定义网络(默认不会删除宿主机的默认网络)
可选删除相关的卷(需加 -v 或 --volumes 参数)
可选删除构建的镜像(需加 --rmi all 或 --rmi local 参数)

常用场景:
想彻底清理当前 Compose 项目的运行环境时使用
对 docker-compose.yml 配置文件做了重大修改后,需要重新部署时使用

镜像一般是最干净的,容器才是受docker-compose.yml污染的
除非我们用jar包创建的容器有错

所以docker compose build
可以不用多次执行,除非jar包有问题

docker compose build 的核心作用是:根据当前目录下 docker-compose.yml 文件中定义的配置,为所有指定了 build 上下文的服务构建本地 Docker 镜像。
它主要解决的问题是“批量构建镜像”,避免了手动为每个服务执行 docker build 命令的繁琐操作,具体包含以下关键行为:

  • 自动识别 docker-compose.yml 中每个服务的 build 配置(如 Dockerfile 路径、构建参数等)。
  • 按配置顺序(或依赖关系)为多个服务并行/串行构建镜像,构建完成的镜像会自动关联到对应的服务。
  • 支持增量构建:若服务的代码、Dockerfile 未修改,会复用之前的构建缓存,加快构建速度。

如果已经有了这个镜像呢,还会构建吗
默认情况下不会重新完整构建,会优先使用构建缓存来加速过程,只有当触发缓存失效的条件时,才会重新构建变化的部分。

具体逻辑如下:

  1. 检查缓存有效性:Docker 会对比服务的 build 上下文(如代码、依赖文件)和 Dockerfile 的内容。若所有文件均未修改,且构建参数( args )等配置也无变化,则直接复用现有镜像层,不进行新构建。
  2. 缓存失效则增量构建:若 Dockerfile 指令(如 COPY 、 RUN )或上下文文件有修改,会从修改指令的那一层开始重新构建,未修改的底层仍复用缓存,而非完全重建整个镜像。
  3. 强制全量构建:若需忽略缓存、强制重新构建所有层,可在命令后加 --no-cache 参数,即 docker compose build --no-cache 。

1.7 修改

修改一些小bug,导致不成功

在这里插入图片描述
第一我们docker-compose.yml文件里面写的是小写s

在这里插入图片描述
第二,没有把ik分词器传进去

在这里插入图片描述
第三elasticsearch是和dotasource同级的配置

1.8 第二台机器

# 指定 Docker Compose ⽂件的版本
#version: '3.8'
#services:定义了服务列表
services:oj-gateway:image: ck/oj-gateway:0.0.1-SNAPSHOT# 提供了构建上下文的路径。这意味着Docker将在./bitoj-jar/gateway/目录中寻找构建所需的文件。build:context: ./ckoj-jar/gateway/container_name: oj-gatewayenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.108ports:- "19090:19090"privileged: trueoj-system:image: ck/oj-system:0.0.1-SNAPSHOTbuild:context: ./ckoj-jar/system/container_name: oj-systemenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.108ports:- "9201:9201"privileged: trueoj-friend:image: ck/oj-friend:0.0.1-SNAPSHOTbuild:context: ./ckoj-jar/friend/container_name: oj-friendenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.108ports:- "9202:9202"privileged: trueoj-job:image: ck/oj-job:0.0.1-SNAPSHOTbuild:context: ./ckoj-jar/job/container_name: oj-jobenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.108ports:- "9203:9203"privileged: trueoj-judge:image: ck/oj-judge:0.0.1-SNAPSHOTbuild:context: ./ckoj-jar/judge/container_name: oj-judge# 将本地目录挂载到容器内的用户代码存储目录volumes:- /user-code-pool:/user-code-poolenvironment:# 时区上海TZ: Asia/ShanghaiHOST_IP: 192.168.56.108privileged: true

先是docker-compose.yml文件,直接复制以前的就可以了,然后去掉depends on
因为第一台机器的依赖项已经启动成功
然后是HOST_IP也要改,HOST_IP是环境变量

  cloud:nacos:discovery:namespace: 7c56d49e-a3b9-41e7-b779-2eccb84c27ecserver-addr: http://192.168.56.107:8848username: nacospassword: nacosckoj_8ip: ${HOST_IP}

会在bootstrap.yml里面用到,这个的意思是指定gateway微服务的jar所在服务器的地址
在这里插入图片描述
第二台虚拟机我们就只需要这两个文件就可以了,只部署虚拟机,不部署组件
但是docker-compose.yml名字改变了

docker compose -f docker-compose2.yml build
docker compose -f docker-compose2.yml up -d

这样就可以了

1.9 测试

访问http://192.168.56.107:10030/就可以访问b端接口了
但是我们要新添加一个管理员用户
我们是有添加管理员用户的接口的—》给网关添加白名单
在这里插入图片描述
在这里插入图片描述

测试一下但是报错了

我们用docker logs id
就可以查看了
在这里插入图片描述
所以我们直接在数据库添加吧

    @Overridepublic int add(SysUserSaveDTO saveDTO) {List<SysUser> sysUsers = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserAccount, saveDTO.getUserAccount()));if(CollectionUtil.isNotEmpty(sysUsers)){throw new ServiceException(ResultCode.AILED_USER_EXISTS);}SysUser sysUser = new SysUser();sysUser.setUserAccount(saveDTO.getUserAccount());sysUser.setPassword(BCryptUtils.encryptPassword(saveDTO.getPassword()));sysUser.setCreateBy(Constants.SYSTEM_USER_ID);return sysUserMapper.insert(sysUser);}

或者我们设置一个系统用户
然后又要重新打包了
但是这次只用重新搞system的jar包了
只用重新启动system,重新部署system

docker compose up -d oj-nacos-server

指定部署的服务名
所以构建build的时候也是可以指定的

docker compose build oj-system

注意这个build是要有build参数的,是我们需要自己创建镜像的,是需要dockerfile的,没有的话,就不会执行,默认有的镜像就不会build了

services:oj-mysql-server:

其中这个oj-system就是services下一级的名字

docker compose build oj-system 
docker compose up -d oj-system
docker compose -f docker-compose2.yml build oj-system
docker compose -f docker-compose2.yml up -d oj-system

在这里插入图片描述
在这里插入图片描述

这样就成功了

http://192.168.56.107:80就可以进入c端了

1.10 纠错

有一些错误
比如nacos上面judge配置的Rabbitmq和mysql的地址,我写的192.168.56.108,其实应该是192.168.56.107

还有一个问题就是
,问题依然是 rabbit_disk_monitor 进程因 df 命令超时反复崩溃,且之前的配置优化未生效 —— 核心原因是 旧版本 RabbitMQ(3.8.x)与你的 Docker 环境存在底层文件系统交互障碍,常规配置调整无法解决
就是说RabbitMQ(3.8.x)与你的 Docker 环境存在底层文件系统交互障碍,会报错的

oj-rabbitMQ-server:container_name: oj-rabbitMQ-serverimage: rabbitmq:3.9.13-managementports:- "5672:5672"- "10020:15672"volumes:- ./rabbit/data:/var/lib/rabbitmq# 设置 RabbitMQ 的默认用户名和密码。environment:RABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: adminhealthcheck:test: [ "CMD", "rabbitmqctl", "status" ]interval: 30stimeout: 10sretries: 10

所以我们更换Rabbitmq的版本为3.9.13

你的当前镜像版本是 3.8.30,而 RabbitMQ 在 3.9 版本 中对「磁盘监控模块」进行了 底层重构,彻底解决了旧版本(3.8.x 及更早)依赖 df 命令导致的超时崩溃问题 —— 这正是你当前遇到的核心痛点。

这样就可以了

在这里插入图片描述
这样以后就成功了

总结

http://www.xdnf.cn/news/20356.html

相关文章:

  • 基于Echarts+HTML5可视化数据大屏展示-图书馆大屏看板
  • 软考 系统架构设计师系列知识点之杂项集萃(142)
  • JVM中如何调优新生代和老生代?
  • 基于LSTM深度学习的网络流量测量算法matlab仿真
  • C++ 内存模型:用生活中的例子理解并发编程
  • linux C 语言开发 (三) 建立云服务器
  • C++ 小游戏:拍桌子
  • Nmap网络扫描工具详细使用教程
  • 算法学习路径
  • 基于 Gemini 的 CI/CD 自动化测评 API 集成实战教程
  • Browser Use:打造你的浏览器自动化助手
  • Python数据可视化科技图表绘制系列教程(六)
  • 【Python自动化】 21 Pandas Excel 操作完整指南
  • 小杰机器学习(two)——导数、损失函数、斜率极值最值、微分规则、切平面与偏导数、梯度。
  • Rust 登堂 之 Deref 解引用(十)
  • 一文掌握工业缺陷检测项目实战(Pytorch算法训练、部署、C++ DLL制作、Qt集成)
  • 微信小程序(uniapp)实现连接蓝牙
  • cuda-NCCL笔记(1)-- 初步了解使用NCCL
  • Python 多线程与多进程入门指南
  • Windows 设备音频录制 | WASAPI 音频数据采集 / 环回录制
  • 【基础-单选】singleton模式下首次进入的执行顺序是
  • C++趣味编程:鸡兔同笼与票务计算
  • cocos2d. 3.17.2 c++如何实现下载断点续传zip压缩包带进度条
  • 【VoNR】VoNR 不等于 VoLTE on 5G
  • vcenter管理的4台安装了esxi机器组成的HA,故障后自恢复理解
  • 飞牛NAS配置FRP内网穿透:实现远程访问
  • DocuAI深度测评:自动文档生成工具如何高效产出规范API文档与数据库表结构文档?
  • 【教学类-36-10】20240905(通义万相)-A4各种大小的鱼制作“吐泡泡的鱼”01版
  • Python反向迭代完全指南:从基础到高性能系统设计
  • C++从入门到精通(视频教程)