doris集群物理部署保姆级教程
doris物理安装
1、安装要求
Linux 操作系统版本需求
查看CentOs版本(>=7.1)
cat /etc/redhat-release
1)设置系统最大打开文件句柄数
vi /etc/security/limits.conf
- soft nofile 65536
- hard nofile 65536
echo ‘’’
- soft nofile 655360
- hard nofile 655360
‘’’ >> /etc/security/limits.conf
2)时钟同步(参考指南)
Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。
vi /etc/chrony.conf
3)关闭交换分区(swap)
Linux交换分区会给Doris带来很严重的性能问题,需要在安装之前禁用交换分区。
使用不重启的方式,禁用swap,立即生效
sudo swap -a
sudo free -m
4)Liunx文件系统
这里我们推荐使用ext4文件系统,在安装操作系统的时候,请选择ext4文件系统。
查看文件系统 xfs(Cent OS之后)
df -hT
2. 软件需求
查看GCC版本(>=4.8.2)
gcc -v
安装并查看JAVA版本(>=1.8)
rpm -qa | grep java
yum list java*
yum install java-1.8.0-openjdk.x86_64 -y
java - version
集群部署
因为我们采用集群部署,所以每台服务器都需要上传解压。
#################################################################
3、FE部署
1)拷贝 FE 部署文件到指定节点
解压压缩包
cd /data/
tar -xvf apache-doris-fe-2.0.0-alpha1-bin-x86_64.tar.xz
mv apache-doris-fe-2.0.0-alpha1-bin-x86_64 fe
2)配置FE
建元数据路径
mkdir -p /data/doris-meta
配置 FE-Config
vi fe/conf/fe.conf
取消 priority_networks 的注释,修改参数
例如当前节点的 IP 地址为 10.10.2.21,则需要更改为 10.10.2.0/24 填入
这里需要填入的是 IP 子网网段地址,并非 IP 地址
priority_networks = 10.10.2.0/24
#配置文件中指定元数据路径:
meta_dir=/data/doris-meta
保存退出
3)启动 FE
在 FE 安装目录下执行下面的命令,来完成 FE 的启动。
./bin/start_fe.sh --daemon
查看 FE 运行状态–等1 min后试:
curl http://127.0.0.1:8030/api/bootstrap
这里 IP 和 端口分别是 FE 的 IP 和 http_port(默认8030),如果是在 FE 节点执行,直接运行上面的命令即可。如果返回结果中带有 “msg”:“success” 字样,则说明启动成功。
4)连接 FE
通过下载免安装的 MySQL 客户端(mysql-client)来连接 Doris FE。
解压刚才下载的 MySQL 客户端,在 bin/ 目录下可以找到 mysql 命令行工具。然后执行下面的命令连接 Doris。
mysql -uroot -P9030 -h127.0.0.1
查看 FE 运行状态(如果 IsMaster、Join 和 Alive 三列均为true,则表示节点正常)
SHOW FRONTENDS\G;
5)停止FE
在 FE 安装目录下执行下面的命令,来完成 FE 的停止。
./bin/stop_fe.sh(doris的fe,be节点没有启动顺序依赖)
#################################################################
4、BE部署
1)拷贝 BE 部署文件到指定节点
解压压缩包
cd /data/
tar -xvf apache-doris-be-2.0.0-alpha1-bin-x86_64.tar.xz
mv apache-doris-be-2.0.0-alpha1-bin-x86_64 be
2)配置BE
#创建data目录
mkdir -p /data/dorisdata
配置 BE-Config
vi be/conf/be.conf
取消 priority_networks 的注释,修改参数
例如当前节点的 IP 地址为 10.10.2.21,则需要更改为 10.10.2.0/24 填入
这里需要填入的是 IP 子网网段地址,并非 IP 地址
priority_networks = 10.10.2.0/24
#配置文件中指定数据存放路径:
storage_root_path=/data/dorisdata
#更快的导入速度,默认为2
flush_thread_num_per_store=5
#修改 BE 的配置文件 be.conf 添加以下配置项,重启BE,以获得更好的查询性能
enable_storage_vectorization=true
enable_low_cardinality_optimize=true
保存退出
3)启动 BE
在 BE 安装目录下执行下面的命令,来完成 BE 的启动。
./bin/start_be.sh --daemon
查看 BE 运行状态
#cat ./log/be.INFO
I1025 20:59:59.367655 26241 data_dir.cpp:350] start to load tablets from /data/dorisapp/newinstall/dorisdata
I1025 20:59:59.367910 26241 data_dir.cpp:343] successfully check incompatible old format meta /data/dorisapp/newinstall/dorisdata
I1025 20:59:59.367916 26241 data_dir.cpp:361] begin loading rowset from meta
启动报错
[root@xlucas4 apache-doris-be-1.2.3-bin-x86_64-noavx2]# bin/start_be.sh --daemon
Please set vm.max_map_count to be 2000000 under root using ‘sysctl -w vm.max_map_count=2000000’.
解决方案:sysctl -w vm.max_map_count=2000000
再次启动报错
[root@xlucas2 apache-doris-be-1.2.3-bin-x86_64-noavx2]# bin/start_be.sh
Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/doris/udf/JniUtil
Caused by: java.lang.ClassNotFoundException: org.apache.doris.udf.JniUtil
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
WARNING: Logging before InitGoogleLogging() is written to STDERR
W0416 01:53:45.238514 2901 doris_main.cpp:382] Failed to initialize JNI: [INTERNAL_ERROR]Failed to find JniUtil class.
原因:安装Java UDF 函数因为从 1.2 版本开始支持 Java UDF 函数,需要从官网下载 Java UDF 函数的 JAR 包放到 BE 的 lib 目录下,否则可能会启动失败。在官网下载依赖的jar包。下载完成后拷贝到BE的lib目录下即可
将包scp到BE节点:scp ./java-udf-jar-with-dependencies.jar root@192.168.18.134:/root/doris/apache-doris-be-1.2.3-bin-x86_64-noavx2/lib
注意:如果不是安装doris-1.2.0以后的版本可以不用下载该jar包
由于端口占用修改be.conf: webserver_port = 8049 curl http://127.0.0.1:8049/api/health
curl http://127.0.0.1:8040/api/health
如果返回: {“status”: “OK”,“msg”: “To Be Added”} 则表示启动成功,其余情况,则可能存在问题。
4)停止BE
在 BE 安装目录下执行下面的命令,来完成 BE 的停止。
./bin/stop_be.sh
#################################################################
5、组建集群
(集群规模两台FE节点,一个follower,二个observer,三台BE节点,一台broker节点)
默认一个集群,只能有一个 Leader,可以有多个 Follower 和 Observer。
其中 Leader 和 Follower 组成一个 Paxos 选择组
如果 Leader 宕机,则剩下的 Follower 会自动选出新的 Leader,保证写入高可用。
Observer 同步 Leader 的数据,但是不参加选举。
如果只部署一个 FE,则 FE 默认就是 Leader
FE 节点的数量:
FE 角色分为 Follower 和 Observer,(Leader 为 Follower 组中选举出来的一种角色,以下统称 Follower)。
FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。
Follower 的数量必须为奇数,Observer 数量随意。
根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署 3 个 Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer
0、配置环境变量
vim /etc/profile
#添加如下内容
echo ‘’’
export DORIS_HOME=/data/dorisapp
export PATH= P A T H : PATH: PATH:DORIS_HOME/be/apache-doris-be-2.0.0-alpha1-bin-x86_64/bin:$DORIS_HOME/fe/apache-doris-fe-2.0.0-alpha1-bin-x86_64/bin
‘’’ >> /etc/profile
source /etc/profile
1、启动FE、BE
./bin/start_fe.sh --daemon
(第一台fe什么都不需要加,后边的fe启动命令为:start_fe.sh --helper leader_fe_host:edit_log_port --daemon)
10.@@@.9 start_fe.sh --daemon (leader)
2、组群配置
在第一台启动的fe节点执行(10.@@@.9为LEADER):
mysql -uroot -P9030 -h10.@@@.9 (第一次进去不用填密码,默认密码为空,修改密码)
#修改密码
SET PASSWORD FOR ‘root’ = PASSWORD(‘123456’);
添加一个FE(FOLLOWER)节点
#添加FOLLOWER
ALTER SYSTEM ADD FOLLOWER “10.@@@.12:9010”;
#删除FOLLOWER
ALTER SYSTEM DROP FOLLOWER “10.@@@.12:9010”
添加二个FE(OBSERVER)节点
#添加OBSERVER
ALTER SYSTEM ADD OBSERVER “10.@@@.10:9010”;
ALTER SYSTEM ADD OBSERVER “10.@@@.11:9010”;
#删除OBSERVER
ALTER SYSTEM DROP OBSERVER “10.@@@.12:9010”;
添加三个BE节点
#添加be
ALTER SYSTEM ADD BACKEND “10.@@@.9:9050”;
ALTER SYSTEM ADD BACKEND “10.@@@.10:9050”;
ALTER SYSTEM ADD BACKEND “10.@@@.11:9050”;
#删除be
ALTER SYSTEM DROP BACKEND “10.@@@.12:9050”;
添加一个broker节点 (暂时没用到)
#添加broker
ALTER SYSTEM ADD BROKER broker_name “0.0.0.0:0000”;
#删除broker
ALTER SYSTEM DROP BROKER broker_name “0.0.0.0:0000”;
3、启动其余服务
10.@@@.10 start_fe.sh --helper 10.@@@.9:9010 --daemon (leader_fe_host:edit_log_port --daemon)
10.@@@.11 start_fe.sh --helper 10.@@@.9:9010 --daemon
start_be.sh --daemon (3台)
4、查看运行状态
访问doris 页面:http://10.@@@.9:8030/home
在第一台启动的fe节点执行(10.@@@.9为LEADER):
mysql -uroot -P9030 -h10.@@@.9
#查看fe
SHOW PROC ‘/frontends’;
SHOW PROC ‘/frontends’\G;
#检查fe
http://10.@@@.9:8030/api/bootstrap
curl http://127.0.0.1:8030/api/bootstrap
#查看be
SHOW PROC ‘/backends’;
SHOW PROC ‘/backends’\G;
#检查be
http://10.@@@.9:8040/api/health
http://10.@@@.10:8040/api/health
http://10.@@@.11:8040/api/health
curl http://127.0.0.1:8040/api/health
#查看broker(暂时没用到)
SHOW PROC “/brokers”;
SHOW PROC ‘/brokers’\G;
6、doris使用
验证:
两个表union,minus一个,找差异
#mysql-client连接doris
mysql -uroot -P9030 -h10.@@@.9
#修改密码
SET PASSWORD FOR ‘root’ = PASSWORD(‘123456’);
#使用密码登陆
mysql -uroot -P9030 -h10.@@@.9 -p123456
#创建一个普通用户
CREATE USER ‘dorisuser’ IDENTIFIED BY ‘123123’;
#数据库授权给用户
CREATE DATABASE dorisdb;
GRANT ALL ON dorisdb to “dorisuser”;
#使用dorisuser用户进行登录并查看数据库
mysql -udorisuser -P9030 -h10.@@@.9 -p123123
MySQL> SHOW DATABASES;
select * from (select 1 from tables union select 2 from tables) as ttt limit 1;
select * from (select TABLE_NAME from columns union all select TABLE_NAME from tables) as untable limit 10;
set enable_profile = true;
set exec_mem_limit = 8G;
set compaction_task_num_per_disk = 4;
set streaming_load_json_max_mb = 150;
set max_segment_num_per_rowset = 500;
set enable_sql_cache = true;
set enable_partition_cache = true;
set enable_pipeline_engine = true;
set parallel_fragment_exec_instance_num = 16;
调优:
############################################FE############################################
stream_load_default_timeout_second: Default stream load timeout,insert into [streaming] 失败时可以设置
sys_log_verbose_modules: 打印debug日志的模块 sys_log_verbose_module=org.apache.doris 代表全部
############################################BE############################################
mem_limit:be最多使用部署机器的内存百分比,默认80%
sys_log_verbose_module: 打印debug日志的模块 sys_log_verbose_module=*代表全部
doris_max_scan_key_num:doris会将可枚举的类型拆分查询,比如id=5 and date>=‘2019-01-01’ and date<='2019-01-31’的查询,doris会将其拆分成31个小查询分别查询[5,2019-01-01]…[5,2019-01-31],但是会有一个阈值(doris_max_scan_key_num),超过这个阈值后不再拆分,可根据业务调整
############################################variable############################################
exec_mem_limit:单条查询最多使用的be内存
query_timeout:查询超时,单位秒
time_zone:时区
1、增大内存
内存不够时, 查询可能会出现‘Memory limit exceeded’, 这是因为doris对每个用户默认设置内存限制为2g
SHOW VARIABLES LIKE “%mem_limit%”;
exec_mem_limit 的单位是 byte,可以通过 SET 命令改变 exec_mem_limit 的值。如改为 8GB。
SET exec_mem_limit = 8589934592;
上述设置仅仅在当前session有效, 如果想永久有效, 需要添加 global 参数
SET GLOBAL exec_mem_limit = 8589934592;
2、修改超时时间
doris默认最长查询时间为300s, 如果仍然未完成, 会被cancel掉
SHOW VARIABLES LIKE “%query_timeout%”;
可以修改为60s
SET query_timeout = 60;
如果需要全局生效需要添加参数 global
set global query_timeout = 60;
3、Broadcast/Shuffle Join
doris在join操作的时候时候, 默认使用broadcast的方式进行join, 即将小表通过广播的方式广播到大表所在的节点, 形成内存hash, 然后流式读出大表数据进行hashjoin
但如果小表的数据量也很大的时候, 就会造成内存溢出, 此时需要通过shuffle join的方式进行, 也被称为partition join. 即将大表小表都按照join的key进行hash, 然后进行分布式join
使用 Broadcast Join(默认)
select sum(table1.pv) from table1 join table2 where table1.siteid = 12;
显示指定braodcast
select sum(table1.pv) from table1 join [broadcast] table2 where table1.siteid = 12;
使用suffle join
select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 12;
9 10 11 划个300G存储,存介质
主机信息:
10.@@@.18
10.@@@.19
10.@@@.20
10.@@@.21
ocdp/Ocdp@1uC2016
fe:
10.@@@.18:8030
be :
10.@@@.18:9050
10.@@@.19:9050
10.@@@.20:9050
10.@@@.21:9050
doris 页面:
http://10.@@@.18:8030/home 用户密码: root 123456
mysql入口:
mysql -uroot -P9030 -h10.@@@.18 密码: 123456
相关文章:

doris集群物理部署保姆级教程
doris物理安装 1、安装要求 Linux 操作系统版本需求 查看CentOs版本(>7.1) cat /etc/redhat-release 1)设置系统最大打开文件句柄数 vi /etc/security/limits.conf soft nofile 65536hard nofile 65536 echo ‘’’ soft nofile 655360hard nofile 655…...

探囊取物之多形式登录页面(基于BootStrap4)
基于BootStrap4的登录页面,支持手机验证码登录、账号密码登录、二维码登录、其它统一登录 低配置云服务器,首次加载速度较慢,请耐心等候;演练页面可点击查看源码 预览页面:http://www.daelui.com/#/tigerlair/saas/pr…...

【ONLYOFFICE】| 桌面编辑器从0-1使用初体验
目录 一. 🦁 写在前面二. 🦁 在线使用感受2.1 创建 ONLYOFFICE 账号2.2 编辑pdf文档2.3 pdf直接创建表格 三. 🦁 写在最后 一. 🦁 写在前面 所谓桌面编辑器就是一种用于编辑文本、图像、视频等多种自媒体的软件工具,具…...

20、PHP字符串的排列(含源码)
题目: PHP字符串的排列? 描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述: 输入一个字符串,长度不超过9(可…...

Linux 标准IO的fopen和fclose
getchar(),putchar() ‐‐‐‐ 一个字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一个字符,一串字符都可以 fopen函数的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打开一个文件 * param ‐ path…...

一个计算密集小程序在不同CPU下的表现
本文比较了几款CPU对同一测试程序的比较结果,用的是Oracle公有云OCI上的计算实例,均分配的1 OCPU,内存用的默认值,不过内存对此测试程序运行结果不重要。 本文只列结果,不做任何评价。下表中,最后一列为测…...

圈子系统搭建教程,以及圈子系统的功能特点,圈子系统,允许二开,免费源码,APP小程序H5
圈子是一款社区与群组的交友工具。你可以在软件内创造一个兴趣的群组从而达到按圈子来交友的效果用户可以根据自己的兴趣爱好。 1. 创建圈子 轻松创建专属圈子,支持付费型社群。 2. 加入圈子 加入不同圈子,设置不同名片,保护隐私。 3. 定…...

递归算法练习
112. 路径总和 package Tree;import java.util.HashMap; import java.util.Map;class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val val;} }/*** 求 树的路径和* <p>* 递归 递减* <p>* 询问是否存在从*当前节点 root 到叶…...

WebDriver 类的常用属性和方法
目录 🎍简介 🎊WebDriver 核心概念 🎉WebDriver 常用属性 🎁WebDriver 常用方法 🐷示例代码 🎪注意事项 🎐结语 🧣参考资料 🎍简介 Selenium WebDriver 是一个用…...

基于x86+FPGA+AI轴承缺陷视觉检测系统,摇枕弹簧智能检测系统
一、承缺陷视觉检测系统 应用场景 轴类零件自动检测设备,集光、机、软件、硬件,智能图像处理等先进技术于一体,利用轮廓特征匹配,目标与定位,区域选取,边缘提取,模糊运算等算法实现人工智能高…...

短剧小程序系统cps分销开发搭建
短剧小程序系统CPS分销开发搭建是一个相对复杂但具有广阔商业前景的过程。以下是关于短剧小程序系统CPS分销开发搭建的详细步骤和要点: 需求分析与市场调研: 深入了解市场需求、用户画像和竞品分析,明确产品定位和功能需求。研究目标用户的消…...

代理IP的10大误区:区分事实与虚构
在当今的数字时代,代理已成为在线环境不可或缺的一部分。它们的用途广泛,从增强在线隐私到绕过地理限制。然而,尽管代理无处不在,但仍存在许多围绕代理的误解。在本博客中,我们将探讨和消除一些最常见的代理误解&#…...

数组-长度最小的子数组
M长度最小的子数组(leetcode209) /*** param {number} target* param {number[]} nums* return {number}*/ var minSubArrayLen function(target, nums) {const n nums.length;let ans n 1;let sum 0; // 子数组元素和let left 0; // 子数组…...

深度学习之交叉验证
交叉验证(Cross-Validation)是一种用于评估和验证机器学习模型性能的技术,尤其是在数据量有限的情况下。它通过将数据集分成多个子集,反复训练和测试模型,以更稳定和可靠地估计模型的泛化能力。常见的交叉验证方法有以…...

使用 Python 五年后,我发现学 python 必看这三本书!少走一半弯路
第一本 《Python编程-从入门到实践》 适合零基础的读者 豆瓣评分:9.1 推荐指数:5颗星 推荐理由: 本书是针对所有层次的 Python 读者而作的 Python 入门书。全书分为两部分: 第一部分介绍使用Python 编程所必须了解的…...

React@16.x(45)路由v5.x(10)源码(2)- history
目录 1,作用1.1,createBrowserHistory1.2,createHashHistory1.3,createMemoryHistory 2,history 对象的属性2.1,action2.2,push / replace / go / goBack / goForward2.3,location2.…...

grpc学习golang版( 八、双向流示例 )
系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写client客…...

SpringBoot学习05-[SpringBoot的嵌入式Servlet容器]
SpringBoot的嵌入式Servlet容器 嵌入式Servlet容器servlet容器-嵌入式servlet容器配置修改通过全局配置文件修改修改添加实现了WebServerFactoryCustomizer接口的bean来进行修改 servlet容器-注册servlet三大组件应该如何注册呢?servlet3.0规范提供的注解方式进行注…...

查看Oracle是哪个Oracle_home 下启动的
[rootrac1 ~]# ps -ef|grep smon root 413 24903 0 22:30 pts/0 00:00:00 grep --colorauto smon root 27165 1 0 22:11 ? 00:00:09 /u01/app/19.0.0/grid/bin/osysmond.bin grid 27784 1 0 22:12 ? 00:00:00 asm_smon_ASM1 oracl…...

重温react-06(初识函数组件和快速生成格式的插件使用方式)
开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…...

【高考志愿】仪器科学与技术
目录 一、专业介绍 1.1 专业概述 1.2 专业方向 1.3 主要课程 二、专业技能与素质培养 三、就业前景 四、个人发展规划建议 五、仪器科学与技术专业排名 六、总结 一、专业介绍 1.1 专业概述 仪器科学与技术专业是一门综合性极强的学科,它融合了测量、控制…...

Elasticsearch的Mapping
Elasticsearch的Mapping Mapping是什么 Mapping定义了ES的索引结构、字段类型、分词器等,是索引的一部分。类似于关系型数据库中“表结构”的概念,在 Mapping 里也包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评分、是否创建…...

【vocabulary in use (elementary)】6 Health and Illness
very well / fine 很好 ill sick 生病 I feel terrible 感觉很差 headache 头疼 toothache 牙疼 dentist medicine 药 pills 片药 caps 胶囊 aspirin 阿司匹林 antibiotic 抗生素 vitamin 维生素 painkiller 止痛药 dentist 牙医 got a cold 感冒 for many years 很多年 all th…...

探囊取物之多形式注册页面(基于BootStrap4)
基于BootStrap4的注册页面,支持手机验证码注册、账号密码注册 低配置云服务器,首次加载速度较慢,请耐心等候;演练页面可点击查看源码 预览页面:http://www.daelui.com/#/tigerlair/saas/preview/ly4gax38ub9j 演练页…...

【C++进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫
二叉树1:深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客 二叉树2:深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作-CSDN博客 二叉树3:深入理解数据结构第三弹——二叉树…...

【RabbitMQ实战】Springboot 整合RabbitMQ组件,多种编码示例,带你实践 看完这一篇就够了
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、对RabbitMQ管理界面深入了解1、在这个界面里面我们可以做些什么? 二、编码练习(1)使用direct exchange(直连型交换机)&a…...

【你也能从零基础学会网站开发】理解DBMS数据库管理系统架构,从用户到数据到底经历了什么
🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 其实前面我们也…...

Vue.js 中的API接口封装实战与详解
在开发Web应用的过程中,我们常常需要和服务器进行数据交互,这就涉及到了API接口的调用。在Vue.js项目中,为了提高代码复用性、可维护性和降低错误率,我们将API接口进行合理的封装显得尤为重要。本文将详细介绍如何在Vue.js项目中实…...

职场内卷、不稳定、没前景……怎么破?
经济下行期,大家普遍反映混职场艰难。 再深究下,发现造成职场艰难的原因主要有三个: 1.内卷:狼多肉少 2.不稳定:裁员总是不期而遇 3.没前景:明知过几年会被优化,但无法改变,死气沉沉…...

LeetCode 算法:将有序数组转换为二叉搜索树 c++
原题链接🔗:将有序数组转换为二叉搜索树 难度:简单⭐️ 题目 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9]…...