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

Linux|服务器|二进制部署nacos(不是集群,单实例)(2025了,不允许还有人不会部署nacos)

一、

前言

naocs是一个服务治理软件,如果没有记错的话,该软件是阿里出品的,后面该软件开源在了apache社区

那么,现在市面上有N多的服务治理,服务管理软件,本文不打算讨论什么consul,etcd,Eureka,zookeeper等等软件和nacos的性能差异,本文只强调一点,nacos可以作为 Spring Cloud Alibaba 的组件,提供动态服务注册与发现功能,支持服务实例的心跳监测和清单更新,帮助实现服务治理的自动化

nacos的软件架构是由java语言编写的j一个jar包,也就是说一个jar包打天下

nacos的部署方式非常多,docker,podman,二进制,源码,rpm等等方式都是支持的,不过需要明确的是,主流部署方式就docker,二进制;源码部署需要很多的条件,难度较高,因此一般不采用的

nacos由于是带有web管理界面的,因此,该软件需要做数据持久化,也就是微服务的版本控制管理功能需要数据持久化,通俗说需要外部数据源

nacos的数据持久化比较特殊,主要是三种方式

第一种是内嵌数据库,也就是derby嵌入式数据库,德比(Apache Derby)是一个开源的关系型数据库管理系统,基于Java语言开发,支持嵌入式数据库应用场景,适用于轻量级数据存储需求。该系统采用嵌入式架构模式,无需独立服务器即可运行,支持标准SQL语法及ACID事务特性。这里需要明确一点,nacos的单节点启动方式才适用使用derby嵌入式数据库,单节点启动也可以使用外部数据源;集群启动方式必须使用下面的两种方式,也就是必须使用外部数据源做数据持久化

如下图所示,Nacos started successfully in stand alone mode. use embedded storage ,这个时候单实例启动才是使用的内嵌德比数据库

第二种是MySQL数据库,nacos从2.2版本包括此版本之后都支持MySQL数据库,无需任何改造,原生支持

如下图,这个时候是单实例启动的nacos,可以使用外部数据源,也就是external storage

第三种是pg数据库,Oracle数据库以及高斯等等其它数据库,nacos从2.2版本包括此版本之后都支持,需要源码改造,二进制部署方式无法使用,改造难度比较高

下面将就如何在Linux下使用二进制nacos部署单实例nacos以及使用二进制nacos部署集群nacos(外部数据源使用MySQL数据库)

二、

naocs的架构

[root@centos14 ~]# ls -alh nacos-server-2.2.3.zip 
-rw-r--r-- 1 root root 143M Jul  3 21:43 nacos-server-2.2.3.zip
[root@centos14 ~]# cd nacos
[root@centos14 nacos]# ll
total 28
drwxr-xr-x 4 root root   123 Jul  6 13:31 bin
drwxr-xr-x 4 root root   296 Jul  5 13:41 conf
drwxr-xr-x 5 root root    54 Jul  3 22:21 data
-rw-r--r-- 1 root root 16583 Mar  6  2023 LICENSE
drwxr-xr-x 2 root root  4096 Jul  3 22:44 logs
-rw-r--r-- 1 root root  1305 May 14  2020 NOTICE
drwxr-xr-x 4 root root    36 Jul  3 22:21 plugins
drwxr-xr-x 2 root root    30 Jul  6 13:30 target

一般下载下来的nacos二进制解压后,大概如上图所示(没有plugins这个目录,这个目录我后面创建的),target目录下就是该软件最主要的部分,一个名为nacos-server.jar的jar包,打开jar包后,就可以知道该软件是哪个版本了:

其它目录比如bin目录,只是启动脚本(Windows下的和Linux下的);conf目录,是jar包运行时候的配置文件以及用于配置集群的文件以及内嵌tomcat用于web管理界面;logs目录当然就是服务运行时的存放目录;整体结构比较简单明了

在启动脚本内,可以看到需要jdk版本为8或者以上

nacos的下载地址如下:

发布历史 | Nacos 官网

三、

nacos二进制安装步骤

1、

jdk环境

验证是否具备jdk环境

jdk环境部署就不在这里过多废话了,太基础的东西,一般安装jdk8就可以了

环境变量如下:

JAVA_HOME=/usr/local/jdk
PATH=.$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export CLASSPATH PATH JAVA_HOME

2、

MySQL数据库

这个也没什么好说的,数据库部署完毕后,可以navicat正常连接就可以了,本次案例使用的服务器IP是192.168.123.14,数据库版本是MySQL-7.43,数据库部署完毕后需要测试远程连接是否正常

需要数据库创建名为nacos的库

3、

修改nacos的配置文件

主要是nacos服务端口放开,开启鉴权,写入MySQL数据库的连接地址

#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Include message field
server.error.include-message=ALWAYS
### Default web server port:
server.port=18848#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false### Specify local server's IP:
# nacos.inetutils.ip-address=#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=mysql
#spring.sql.init.platform=mysql### Count of DB:
#db.num=1### Connect URL of DB:
#db.url.0=jdbc:mysql://192.168.123.14:13306/mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
#db.user.0=root
#db.password.0=密码### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2

下面这一部分注释掉就表示采用内嵌数据库,否则表示使用MySQL数据库,总计是六行:

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
#spring.datasource.platform=mysql
#spring.sql.init.platform=mysql### Count of DB:
#db.num=1### Connect URL of DB:
#db.url.0=jdbc:mysql://192.168.123.14:13306/mysql?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
#db.user.0=root
#db.password.0=密码

MySQL数据库用的脚本通常在conf目录下,放到MySQL服务器下,执行一下即可,我这里没有新建数据库,并且使用的是root用户,当然了,你可以自己创建数据库以及新用户

鉴权(不管是使用内嵌德比数据库还是MySQL等其它数据库,建议鉴权都配置好):

### If turn on auth system:
nacos.core.auth.enabled=true### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=true### Since 1.4.1, Turn on/off white auth for user-agent: nacos-server, only for upgrade from old version.
nacos.core.auth.enable.userAgentAuthWhite=false### Since 1.4.1, worked when nacos.core.auth.enabled=true and nacos.core.auth.enable.userAgentAuthWhite=false.
### The two properties is the white list for auth and used by identity the request from other server.
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=DxeUFmDd4IyWOaFWGozMvQLspivCEmE/d53ADz299dw=### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.cache.enable=false
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
### The default token (Base64 String):
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789

nacos.core.auth.plugin.nacos.token.secret.key= 的值是32位随机数,本文的这个最好不要用,nacos.core.auth.enabled=true是鉴权开关,除了nacos自身鉴权,也可以使用ldap,这里就不展开讲了

4、

postgresql数据库初始化脚本(pg数据库我现在一次没有成功过,这里大家参考就行,不需要仔细看)

cat /var/lib/pgsql/pg_schema.sql 
/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info   */
/******************************************/
CREATE TABLE config_info (id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,data_id varchar(255) NOT NULL,group_id varchar(128) DEFAULT NULL,content text NOT NULL,md5 varchar(32) DEFAULT NULL,gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,src_user varchar(128) DEFAULT NULL,src_ip varchar(50) DEFAULT NULL,app_name varchar(128) DEFAULT NULL,tenant_id varchar(128) DEFAULT '',c_desc varchar(256) DEFAULT NULL,c_use varchar(64) DEFAULT NULL,effect varchar(64) DEFAULT NULL,type varchar(64) DEFAULT NULL,c_schema text DEFAULT NULL,UNIQUE (data_id, group_id, tenant_id)
);CREATE INDEX configinfo_dataid_key ON config_info(data_id);
CREATE INDEX configinfo_groupid_key ON config_info(group_id);
CREATE INDEX configinfo_md5_key ON config_info(md5);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_aggr   */
/******************************************/
CREATE TABLE config_info_aggr (id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,data_id varchar(255) NOT NULL,group_id varchar(128) NOT NULL,datum_id varchar(255) NOT NULL,content text NOT NULL,gmt_modified timestamp NOT NULL,app_name varchar(128) DEFAULT NULL,tenant_id varchar(128) DEFAULT '',UNIQUE (data_id, group_id, tenant_id, datum_id)
);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_beta   */
/******************************************/
CREATE TABLE config_info_beta (id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,data_id varchar(255) NOT NULL,group_id varchar(128) NOT NULL,app_name varchar(128) DEFAULT NULL,content text NOT NULL,beta_ips varchar(1024) DEFAULT NULL,md5 varchar(32) DEFAULT NULL,gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,src_user varchar(128) DEFAULT NULL,src_ip varchar(50) DEFAULT NULL,tenant_id varchar(128) DEFAULT '',UNIQUE (data_id, group_id, tenant_id)
);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_info_tag   */
/******************************************/
CREATE TABLE config_info_tag (id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,data_id varchar(255) NOT NULL,group_id varchar(128) NOT NULL,tenant_id varchar(128) DEFAULT '',tag_id varchar(128) NOT NULL,app_name varchar(128) DEFAULT NULL,content text NOT NULL,md5 varchar(32) DEFAULT NULL,gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,src_user varchar(128) DEFAULT NULL,src_ip varchar(50) DEFAULT NULL,UNIQUE (data_id, group_id, tenant_id, tag_id)
);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = config_tags_relation   */
/******************************************/
CREATE TABLE config_tags_relation (id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,tag_name varchar(128) NOT NULL,tag_type varchar(64) DEFAULT NULL,data_id varchar(255) NOT NULL,group_id varchar(128) NOT NULL,tenant_id varchar(128) DEFAULT ''
);CREATE INDEX config_tags_relation_dataid_idx ON config_tags_relation(data_id);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = group_capacity   */
/******************************************/
CREATE TABLE group_capacity (id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,group_id varchar(128) NOT NULL DEFAULT '',quota int NOT NULL DEFAULT 0,usage int NOT NULL DEFAULT 0,max_size int NOT NULL DEFAULT 0,max_aggr_count int NOT NULL DEFAULT 0,max_aggr_size int NOT NULL DEFAULT 0,max_history_count int NOT NULL DEFAULT 0,gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,UNIQUE (group_id)
);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = his_config_info   */
/******************************************/
CREATE TABLE his_config_info (id bigint NOT NULL,nid bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,data_id varchar(255) NOT NULL,group_id varchar(128) NOT NULL,app_name varchar(128) DEFAULT NULL,content text NOT NULL,md5 varchar(32) DEFAULT NULL,gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,src_user varchar(128) DEFAULT NULL,src_ip varchar(50) DEFAULT NULL,op_type char(10) DEFAULT NULL,tenant_id varchar(128) DEFAULT ''
);CREATE INDEX his_config_info_dataid_key ON his_config_info(data_id);
CREATE INDEX his_config_info_groupid_key ON his_config_info(group_id);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_capacity   */
/******************************************/
CREATE TABLE tenant_capacity (id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,tenant_id varchar(128) NOT NULL DEFAULT '',quota int NOT NULL DEFAULT 0,usage int NOT NULL DEFAULT 0,max_size int NOT NULL DEFAULT 0,max_aggr_count int NOT NULL DEFAULT 0,max_aggr_size int NOT NULL DEFAULT 0,max_history_count int NOT NULL DEFAULT 0,gmt_create timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,gmt_modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,UNIQUE (tenant_id)
);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = tenant_info   */
/******************************************/
CREATE TABLE tenant_info (id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,kp varchar(128) NOT NULL,tenant_id varchar(128) DEFAULT '',tenant_name varchar(128) DEFAULT '',tenant_desc varchar(256) DEFAULT NULL,create_source varchar(32) DEFAULT NULL,gmt_create bigint NOT NULL,gmt_modified bigint NOT NULL,UNIQUE (kp, tenant_id)
);CREATE INDEX tenant_info_tenantid_idx ON tenant_info(tenant_id);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = users   */
/******************************************/
CREATE TABLE users (username varchar(64) NOT NULL PRIMARY KEY,password varchar(256) NOT NULL,enabled boolean NOT NULL DEFAULT true
);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = roles   */
/******************************************/
CREATE TABLE roles (username varchar(64) NOT NULL,role varchar(64) NOT NULL,PRIMARY KEY (username, role)
);/******************************************/
/*   数据库全名 = nacos_config   */
/*   表名称 = permissions   */
/******************************************/
CREATE TABLE permissions (role varchar(64) NOT NULL,resource varchar(64) NOT NULL,action varchar(8) NOT NULL,PRIMARY KEY (role, resource, action)
);-- 初始化用户数据 (用户名: nacos, 密码: nacos)
INSERT INTO users (username, password) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu');
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');

5、

集群设置

cluster.conf 文件内写入集群所有节点和开放的web端口就可以了,nacos集群没有什么启动顺序

[root@centos14 ~]# cat nacos/conf/cluster.conf 
#2025-07-13T17:53:01.822
192.168.123.14:18848
192.168.123.15:18848
192.168.123.16:18848

6、

启动nacos服务以单实例方式运行

[root@centos14 bin]# ./startup.sh -m standalone
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre/bin/java -Djava.ext.dirs=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre/jre/lib/ext:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jre/lib/ext  -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/nacos/logs/java_heapdump.hprof -XX:-UseLargePages -Dnacos.member.list= -Xloggc:/root/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/root/nacos/plugins,/root/nacos/plugins/health,/root/nacos/plugins/cmdb,/root/nacos/plugins/selector -Dnacos.home=/root/nacos -jar /root/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/root/nacos/conf/ --logging.config=/root/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with cluster
nacos is starting,you can check the /root/nacos/logs/start.out

7、启动naocs服务以集群方式运行:

[root@centos14 ~]# nacos/bin/startup.sh -m cluster
/usr/local/jdk/bin/java -Djava.ext.dirs=/usr/local/jdk/jre/lib/ext:/usr/local/jdk/lib/ext  -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/nacos/logs/java_heapdump.hprof -XX:-UseLargePages -Dnacos.member.list= -Xloggc:/root/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/root/nacos/plugins,/root/nacos/plugins/health,/root/nacos/plugins/cmdb,/root/nacos/plugins/selector -Dnacos.home=/root/nacos -jar /root/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/root/nacos/conf/ --logging.config=/root/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with cluster
nacos is starting,you can check the /root/nacos/logs/start.out
[root@centos14 ~]# vim /root/nacos/logs/start.out 

看到successfully字样表示nacos服务启动正常,否则需要排查;nacos就两种启动方式,一个是不带参数的集群启动,一个是单实例模式,也就是./startup.sh -m standalone,如果集群没有设置或者启动节点不足,那么,都会导致nacos启动失败

web管理的登陆界面如下(IP:端口/nacos):


由于nacos是一个非常重要的服务,因此,尽量不要把这个服务暴露到公网上,并且使用nacos/nacos 登陆进去后,尽快修改一个复杂密码

四、

二进制部署的nacos服务的优化

优化工作主要是在启动脚本那里做,也就是jvm那一块:

#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; thenJAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
elseif [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; thenJAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"fiJAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"fiif [[ "${FUNCTION_MODE}" == "config" ]]; thenJAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=config"
elif [[ "${FUNCTION_MODE}" == "naming" ]]; thenJAVA_OPT="${JAVA_OPT} -Dnacos.functionMode=naming"
fi

以上的内存数值按自己的服务器的实际情况修改即可,修改完毕后,重启nacos服务就算完事了

五、

nacos的数据库设置

-- 创建专属用户(禁止超级用户权限)
CREATE USER nacos_app WITH PASSWORD 'Rtg8$kL!9qW#mZ2pYvE*';
GRANT CONNECT ON DATABASE nacos TO nacos_app;-- 仅赋予必要表权限
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO nacos_app;
REVOKE CREATE, DROP, ALTER ON DATABASE nacos FROM nacos_app;

nacos使用pg数据库作为外部数据源以后在说,现在总是失败

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

相关文章:

  • 学习C++、QT---23(QT中QFileDialog库实现文件选择框打开、保存讲解)
  • DVWA靶场通关笔记-XSS DOM(Medium级别)
  • 教程:如何查看浏览器扩展程序的源码
  • 飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构开发生态
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十三课——图像浮雕效果的FPGA实现
  • JAVA生成PDF(itextpdf)
  • 互联网大厂Java面试:从Spring Boot到微服务的场景应用
  • HTML 初体验
  • HarmonyOS组件/模板集成创新活动-元服务小云体重管理引入案例(步骤条UI组件)
  • HarmonyOS组件/模板集成创新活动-开发者工具箱
  • 【设计模式】备忘录模式(标记(Token)模式)
  • 为什么玩游戏用UDP,看网页用TCP?
  • 融合开源AI大模型与MarTech:AI智能名片与S2B2C商城小程序源码赋能数字化营销新生态
  • 【QT】使用QSS进行界面美化
  • 【Linux | 网络】应用层
  • Rust赋能文心大模型4.5智能开发
  • Leetcode 3615. Longest Palindromic Path in Graph
  • 操作系统-第四章存储器管理和第五章设备管理-知识点整理(知识点学习 / 期末复习 / 面试 / 笔试)
  • 笔记/sklearn中的数据划分方法
  • 滑动窗口-76.最小覆盖子串-力扣(LeetCode)
  • 【保姆级图文详解】MCP架构(客户端-服务端)、三种方式使用MCP服务、Spring AI MCP客户端和服务端开发、MCP部署方案、MCP安全性
  • 【Datawhale夏令营】用AI做带货视频评论分析
  • Spring-----MVC配置和基本原理
  • QCustomPlot绘图保存成PDF文件
  • office-ai整合excel
  • 特征选择方法
  • 数据库3.0
  • Java SE--图书管理系统模拟实现
  • PHP语法高级篇(二):文件处理
  • JVM 锁自动升级机制详解