文章目录

    • @[toc]
  • 一.问题
  • 二.解决办法
  • 三.项目升级demo及项目nacos配置
    • 3.1 dubbo-demo-producer生产者端项目POM配置
    • 3.2 dubbo-demo-consumer消费者端项目POM配置
    • 3.3 生产者端nacos配置
    • 3.4 消费者端nacos配置
    • 3.5 服务启动dubbo调用接口验证
    • 3.6 demo代码下载地址
  • 四.源码启动nacos
    • 4.1. 下载源码
    • 4.2. idea的maven配置
      • 4.2.1 maven的线程数和仓库配置
      • 4.2.2 maven的Importing配置
      • 4.2.3 maven的Runner配置
      • 4.2.4 maven的jvm参数如下
      • 4.2.5 maven编译跳过测试配置
      • 4.2.6 install项目
    • 4.3.源码配置
    • 4.4. 启动
      • 4.4.1 单机启动
      • 4.4.2 集群启动
  • 五.nacos镜像制作和使用
    • Common property configuration

一.问题

nacos官网:

https://nacos.io/zh-cn/docs/what-is-nacos.html

问题nacos版本:2.0.3

https://github.com/alibaba/nacos/issues/5343

​   原因:由于之前使用的nacos版本是1.4.x,会出k8s中的服务启动后挂掉然后又被拉起又挂掉这种奇葩的问题,后面领导升级到2.0.3之后就出了好几次线上的问题,都是用于部署在k8s中的nacos集群的节点重启之后导致pod的ip改变了,nacos2.x的JRaft选主失败了,导致nacos脑裂成多个个集群,集群数据不同步,最后应用服务发现不了服务,业务系统就挂了一上午或者一下午,临时的解决办法就是重新启动nacos集群和k8s集群中报错的服务。

​   官方已经关闭了这个两个issues,1.4.x和2.0.x都有这个问题。


二.解决办法

  官方的修复思路:



​    下面这位大佬提交了一段代码,被官方合并到最新的分支上去了,看说明就知道这个是一个极限的操作,降低集群失败的几率

 /*** resetPeers. ## nacos-enhance ##.* <p>只有在非常紧急并且可用性更为重要的情况下使用:https://www.bookstack.cn/read/sofa-jraft/3.md#6.3%20多数节点故障</p>*/RESET_PEERS(JRaftConstants.RESET_PEERS) {@Overridepublic RestResult<String> execute(CliService cliService, String groupId, Node node, Map<String, String> args) {final Configuration newConf = new Configuration();String peers = args.get(JRaftConstants.COMMAND_VALUE);for (String peer : peers.split(",")) {newConf.addPeer(PeerId.parsePeer(peer.trim()));}final PeerId nodePeerId = node.getNodeId().getPeerId();Status status = cliService.resetPeer(groupId, nodePeerId, newConf);if (status.isOk()) {return RestResultUtils.success();}return RestResultUtils.failed(status.getErrorMsg());}};

​    由此办法只有一个就是升级nacos的版本,这个是改动最小的,如果把nacos换成zk/cousle或者其它注册中心的话,那么这种代价是非常的大,学习成本和运维成本都将增大,项目上的改动来说是非常的大。

三.项目升级demo及项目nacos配置

  首先要参看nacos官方版本对应关系,不然又是一堆的坑

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E


​   上面SpringCloudAlibaba2.2.9. 2.2.9.RELEASE 对应的Dubbo的版本没有写,我还纳闷了,在项目demo中试了好久,是支持的,之前是一个dubbo的包没有写版本pom依赖导不会自动拉取这个包导致的maven报错。

3.1 dubbo-demo-producer生产者端项目POM配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dy</groupId><artifactId>dubbo-demo-producer</artifactId><version>0.0.1-SNAPSHOT</version><name>dubbo-demo-producer</name><description>dubbo-demo-producer</description><packaging>pom</packaging><modules><module>producer-api</module><module>producer-service</module></modules><repositories><repository><id>nexus</id><url>xxxxxxxx</url><releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases><snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots></repository></repositories><distributionManagement><repository><id>nexus-snapshots</id><name>Nexus snapshots</name><url>xxxxxx</url></repository><snapshotRepository><id>nexus-snapshots</id><url>xxxxxxx</url></snapshotRepository></distributionManagement><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring.boot.version>2.3.12.RELEASE</spring.boot.version><spring-cloud.version>Hoxton.SR12</spring-cloud.version><spring-cloud-alibaba.version>2.2.9.RELEASE</spring-cloud-alibaba.version><dubbo.version>2.7.15</dubbo.version><mybatisplus-version>3.4.2</mybatisplus-version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatisplus-version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version><configuration><skipTests>true</skipTests></configuration></plugin><!-- 要将源码放上去,需要加入这个插件 --><plugin><artifactId>maven-source-plugin</artifactId><version>3.0.1</version><configuration><attach>true</attach></configuration><executions><execution><phase>compile</phase><goals><goal>jar</goal></goals></execution></executions></plugin></plugins></build></project>

3.2 dubbo-demo-consumer消费者端项目POM配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.dy</groupId><artifactId>dubbo-demo-consumer</artifactId><version>0.0.1-SNAPSHOT</version><name>dubbo-demo-consumer</name><description>dubbo-demo-consumer</description><packaging>pom</packaging><modules><module>consumer-api</module><module>consumer-service</module></modules><repositories><repository><id>nexus</id><url>xxxxx</url><releases><enabled>true</enabled><updatePolicy>always</updatePolicy></releases><snapshots><enabled>true</enabled><updatePolicy>always</updatePolicy></snapshots></repository></repositories><distributionManagement><repository><id>nexus-snapshots</id><name>Nexus snapshots</name><url>xxxxxx</url></repository><snapshotRepository><id>nexus-snapshots</id><url>xxxxxxxx</url></snapshotRepository></distributionManagement><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring.boot.version>2.3.12.RELEASE</spring.boot.version><spring-cloud.version>Hoxton.SR12</spring-cloud.version><spring-cloud-alibaba.version>2.2.9.RELEASE</spring-cloud-alibaba.version><dubbo.version>2.7.15</dubbo.version><mybatisplus-version>3.4.2</mybatisplus-version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring.boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatisplus-version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>${dubbo.version}</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.22.2</version><configuration><skipTests>true</skipTests></configuration></plugin><!-- 要将源码放上去,需要加入这个插件 --><plugin><artifactId>maven-source-plugin</artifactId><version>3.0.1</version><configuration><attach>true</attach></configuration><executions><execution><phase>compile</phase><goals><goal>jar</goal></goals></execution></executions></plugin></plugins></build>
</project>

3.3 生产者端nacos配置

server:port: 9998
dubbo:consumer:check: falsecloud:subscribed-services: 'dubbo-demo-producer'scan:base-packages: com.dy.producer.service.service.dubboprotocol:name: dubboport: -1registry:address: spring-cloud://localhostapplication:version: 1.0.0spring:cloud:config:#相同配置 本地优先override-none: true redis:host: xxxxxxport: 6379pass: xxxxxdatabase: 5jedis:pool:max-active: 200max-idle: 20max-wait: 2000min-idle: 5servlet:multipart:max-file-size: 50MBmax-request-size: 50MBmanagement:health:rabbit:enabled: false    logger:level:root: infooos:endpoint: xxxxxaccessKeyId: xxxxxxxaccessKeySecret: xxxxxxxbucketName: xxxxxx

3.4 消费者端nacos配置

server:port: 9999
dubbo:consumer:check: falsecloud:subscribed-services: 'dubbo-demo-producer'scan:base-packages: com.dy.consumer.service.service.dubboprotocol:name: dubboport: -1registry:address: spring-cloud://localhostapplication:version: 1.0.0spring:cloud:config:#相同配置 本地优先override-none: true redis:host: xxxxxport: 6379pass: xxxxxxdatabase: 5jedis:pool:max-active: 200max-idle: 20max-wait: 2000min-idle: 5servlet:multipart:max-file-size: 50MBmax-request-size: 50MBmanagement:health:rabbit:enabled: false    logger:level:root: infooos:endpoint: xxxxxxxxxxxaccessKeyId: xxxxxxxxaccessKeySecret: xxxxxxxxxbucketName: xxxxxxx

3.5 服务启动dubbo调用接口验证

3.6 demo代码下载地址

链接:https://pan.baidu.com/s/1EzG8aasLOVRzbeO1JDAWEg
提取码:z6mm

四.源码启动nacos

4.1. 下载源码

https://github.com/alibaba/nacos/releases

4.2. idea的maven配置

4.2.1 maven的线程数和仓库配置

4.2.2 maven的Importing配置

4.2.3 maven的Runner配置

4.2.4 maven的jvm参数如下

-Xmx1024m -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -Xss2m -Dmaven.test.skip=true -Dmaven.compile.fork=true

4.2.5 maven编译跳过测试配置

4.2.6 install项目

4.3.源码配置

console模块的配置

# nacos.core.member.lookup.type=[file,address-server]
nacos.core.member.lookup.type=file

distribution中有nacos的mysql库文件要事先导入自己的mysql库中

4.4. 启动

4.4.1 单机启动

  单机启动参数

-Dnacos.standalone=true

4.4.2 集群启动

cluster.conf的内容如下:

​   这个几个目录是各个节点启动的家目录的位置,集群启动的时候从cluster.conf里面读取各自节点的ip和端口信息然后用来组建集群

启动参数

-Dserver.port=8848 -Dnacos.home=D:\Downloads\n8848
-Dserver.port=8847 -Dnacos.home=D:\Downloads\n8847
-Dserver.port=8846 -Dnacos.home=D:\Downloads\n8846

​    然后同时点击配置好的Nacos8848/Nacos8847/Nacos8846的debug启动启动集群,最后启动后集群是可以正常使用,但是有个很奇怪的问题就是,第二个几点启动会失败,只用两个节点启动起来了,报错绑定ip绑定失败了,不知道咋个搞的,估计是个bug,要不要给官方提个bug?哈哈


五.nacos镜像制作和使用

https://nacos.io/zh-cn/docs/quick-start-docker.html

  参考官网,先clone项目

git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker

  然后进入到build目录下执行:xxx是版本号

docker build -t nacos/nacos-server-xxxx .

​    这个构建千万不要在windows环境下安装的docker环境里构建,否则,构建好的镜像会报找不到sh启动脚本的错误,所以要在Linux环境下构建,最好是centOs上,其它Linux也行。

如果不想构建可以去docker官网搜索,就是会很慢:

 docker search nacos/nacos-server:v2.1.0docker pull nacos/nacos-server:v2.1.0

​ 我为大家准备了两个镜像,可以直接拉取使用,并且拉取速度很快:

registry.cn-hangzhou.aliyuncs.com/bigfei/zlf:nacos-server2.1.1
registry.cn-hangzhou.aliyuncs.com/bigfei/zlf:nacos-server2.1.0

启动命令:

# nacos-server2.1.0
docker run -d --name nacos2.1.0 -e MYSQL_SERVICE_HOST=xxxxx -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=xxx!@#xxx -e MYSQL_SERVICE_DB_NAME=nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 registry.cn-hangzhou.aliyuncs.com/bigfei/zlf:nacos-server2.1.0#nacos-server2.1.1
docker run -d --name nacos2.1.0 -e MYSQL_SERVICE_HOST=xxxxx -e MYSQL_SERVICE_PORT=3306 -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=xxx!@#xxx -e MYSQL_SERVICE_DB_NAME=nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 registry.cn-hangzhou.aliyuncs.com/bigfei/zlf:nacos-server2.1.1

  在云服务上启动MYSQL_SERVICE_PASSWORD=xxx!@#xxx数据库的密码含有特殊字符需要转义处理:

MYSQL_SERVICE_PASSWORD=xxx\!\@\#xxx

  不然执行不成功,在windows环境中可以不用转义可以正常运行。

https://nacos.io/zh-cn/docs/quick-start-docker.html

  官网docker章节有如下启动配置参数可以给我们配置,参考配置即可:

Common property configuration

属性名称 描述 选项
MODE 系统启动方式: 集群/单机 cluster/standalone默认 cluster
NACOS_SERVERS 集群地址 p1:port1空格ip2:port2 空格ip3:port3
PREFER_HOST_MODE 支持IP还是域名模式 hostname/ip 默认 ip
NACOS_SERVER_PORT Nacos 运行端口 默认 8848
NACOS_SERVER_IP 多网卡模式下可以指定IP
SPRING_DATASOURCE_PLATFORM 单机模式下支持MYSQL数据库 mysql / 空 默认:空
MYSQL_SERVICE_HOST 数据库 连接地址
MYSQL_SERVICE_PORT 数据库端口 默认 : 3306
MYSQL_SERVICE_DB_NAME 数据库库名
MYSQL_SERVICE_USER 数据库用户名
MYSQL_SERVICE_PASSWORD 数据库用户密码
MYSQL_SERVICE_DB_PARAM 数据库连接参数 default : characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
MYSQL_DATABASE_NUM 数据库编号 默认 :1
JVM_XMS -Xms 默认 :1g
JVM_XMX -Xmx 默认 :1g
JVM_XMN -Xmn 默认 :512m
JVM_MS -XX:MetaspaceSize 默认 :128m
JVM_MMS -XX:MaxMetaspaceSize 默认 :320m
NACOS_DEBUG 是否开启远程DEBUG y/n 默认 :n
TOMCAT_ACCESSLOG_ENABLED server.tomcat.accesslog.enabled 默认 :false
NACOS_AUTH_SYSTEM_TYPE 权限系统类型选择,目前只支持nacos类型 默认 :nacos
NACOS_AUTH_ENABLE 是否开启权限系统 默认 :false
NACOS_AUTH_TOKEN_EXPIRE_SECONDS token 失效时间 默认 :18000
NACOS_AUTH_TOKEN token 默认 :SecretKey012345678901234567890123456789012345678901234567890123456789
NACOS_AUTH_CACHE_ENABLE 权限缓存开关 ,开启后权限缓存的更新默认有15秒的延迟 默认 : false
MEMBER_LIST 通过环境变量的方式设置集群地址 例子:192.168.16.101:8847?raft_port=8807,192.168.16.101?raft_port=8808,192.168.16.101:8849?raft_port=8809
EMBEDDED_STORAGE 是否开启集群嵌入式存储模式 embedded 默认 : none
NACOS_AUTH_CACHE_ENABLE nacos.core.auth.caching.enabled default : false
NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE nacos.core.auth.enable.userAgentAuthWhite default : false
NACOS_AUTH_IDENTITY_KEY nacos.core.auth.server.identity.key default : serverIdentity
NACOS_AUTH_IDENTITY_VALUE nacos.core.auth.server.identity.value default : security
NACOS_SECURITY_IGNORE_URLS nacos.security.ignore.urls default : /,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**

  k8s相关的可以参考k8s章节

https://nacos.io/zh-cn/docs/use-nacos-with-kubernetes.html

Nacos2.0.3版本线上bug导致整个集群挂掉从而导致业务系统挂掉的解决办法相关推荐

  1. Kubernetes 纳管节点卡住导致加入集群失败问题解决

    问题现象 之前自己搭建了一个k8s集群,配置如下: os: centos8 master: 8U8G 192.168.2.106 worker1: 4U4G 192.168.2.240 worker2 ...

  2. 线上BUG 处理并分析原因

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户的 ...

  3. 测试金融软件出现线上bug的原因及解决方法

    小编热衷于收集整理资源,记录踩坑到爬坑的过程.希望能把自己所学,实际工作中使用的技术.学习方法.心得及踩过的一些坑,记录下来.也希望想做软件测试的你一样,通过我的分享可以少走一些弯路,可以形成一套自己 ...

  4. 走完线上 BUG 定位最后一公里

    简介:因为线上线下环境隔离的问题,线上的输入很多时候难以在日常环境中构造,定位 bug 效率低下.是否有简单快捷的办法呢? 一个小故事 周末12点的闹钟在回龙观均价3000的出租屋急促的响起,程序员小 ...

  5. 听说”双11”是这么解决线上bug的

    听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...

  6. OpenV2X Beihai版本线上分享会

    12月6日下午,OpenV2X Beihai版本线上分享会成功举办.共有32名来自社区的小伙伴参加了本次线上会议交流.OpenV2X社区的小伙伴为大家带来了4个方面的主题分享:Beihai新版本功能d ...

  7. JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署

    JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署 JAVA计算机毕业设计政府采购线上招投标平台Mybatis+源码+数据库+lw文档+系统+调试部署 ...

  8. java毕业设计线上花店购物商城源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计线上花店购物商城源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计线上花店购物商城源码+lw文档+mybatis+系统+mysql数据库+调试 本源码技术栈 ...

  9. java毕业设计线上旅行信息管理系统源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计线上旅行信息管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计线上旅行信息管理系统源码+lw文档+mybatis+系统+mysql数据库+调试 本源 ...

最新文章

  1. ACMNO.10打印出所有水仙花数,所谓水仙花数是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 Output: 153 ???
  2. Android短信拦截
  3. UIGraphicsBeginImageContext系列知识
  4. 同步、异步、阻塞、非阻塞、BIO、NIO、AIO
  5. php smarty安装,php smarty 安装 、配置、使用 及缓存cache的配置使用
  6. 【Ubuntu】 Ubuntu 16.04 安装经典菜单 0.10
  7. python做图片浏览器_python操作浏览器及截图小结
  8. 八皇后(N皇后)问题算法程序(回溯法)
  9. 【数论】—— 多边形数的计算(三角形数,五边形数)
  10. 关于MD5加密,及linux环境获取文件MD5值的脚本
  11. 栈——栈的定义及基本操作(初始化、判空、进栈、出栈、遍历栈、销毁栈等)
  12. jquery版本之间的冲突
  13. GPS同步时钟(NTP时钟服务器)常见故障解决与价格差异分析
  14. 使用CPN Tools工具做简单的登录模型(初学者)
  15. 信号完整性(SI)电源完整性(PI)学习笔记(二十)传输线的串扰(四)
  16. Stanford Alpaca (羊驼):ChatGPT 学术版开源实现
  17. 捉迷藏之二-第10届蓝桥杯Scratch国赛真题第6题程序2
  18. SQL查询------模糊查询
  19. 优化问题---最优性条件
  20. SHU语义网与知识图谱

热门文章

  1. 服装连锁店铺管理软件大盘点!秦丝、日进斗金、商陆花谁更强?
  2. 【看板】ajax动态获取后台传来json数据,加载到页面表格中
  3. 二氧化钛纳米片负载MIL100(Fe)|bmim][Tf2N]离子液体(IL)负载UiO-66-PEI(齐岳)
  4. KD2671系列智能数字绝缘电阻测试仪
  5. 测试潮流之 --UI自动化测试
  6. Premiere导出视频文件太大怎么办
  7. 三十天学会绘画pdf_《30天学会绘画》我从零基础开始
  8. 2015071802 - 欢乐谷年卡
  9. 使用matplotlib的axes画图
  10. ESP32开发:从入门到精通的全面指南