Nacos 入门微服务项目实战
Nacos 核心源码精讲 - IT贱男 - 掘金小册全方位源码精讲,深度剖析 Nacos 注册中心和配置中心的核心思想。「Nacos 核心源码精讲」由IT贱男撰写,375人购买https://s.juejin.cn/ds/BuC3Vs9/
Hi,大家好,欢迎大家来学习《Nacos 核心源码精讲》小册。不过,在正式分析之前,考虑到有部分同学没有使用过 Nacos,同时也为了小册的完整性,我们还是先从 Nacos 的一些基础知识开始讲解,如果你已经熟练使用 Nacos 了,可以快速浏览本章内容
。
学习源码之前,首先我们肯定得知道 Nacos 是什么、它有什么功能,以及这些功能是怎么使用的。有了这些基础之后,才能更有效地展开后续的源码学习。那么,本章我们就一起先来看一看 Nacos 官方文档里面有哪些内容,紧接着我们尝试自己动手搭建属于自己的 Nacos 服务,最后我们在微服务当中集成我们的 Nacos。
本章重点
- 掌握 Nacos 核心架构图;
- 掌握动手搭建 Nacos 单机、集群环境搭建;
- 掌握 Spring Cloud 微服务集成 Nacos。
Nacos 介绍
在早期 Spring Cloud 开始流行的时候,Eureka 使用得比较广泛,后来这个项目在 2018 年 7 月份的时候,官方宣布不再维护 Eureka 2.0 了,再来后阿里推出全新 Spring Cloud Alibaba 系列,其中 Nacos 就是一员。
那我们怎么入手开始学习呢?
学习一门新的技术,其实官方文档是最好的途径,也是最权威的途径。很多小伙伴都不喜欢依赖官方文档,比如不知道 Nacos 什么,就直接去搜索一下,搜索出来的结果五花八门,然后随便点击看一看就关闭了。我在这里可以推荐一个学习思路:
- 先找到对应
官方文档
,看看官方介绍; - 然后找到
核心架构图
,架构图是能够很直观看出核心理念的; - 紧接着
动手实战
一波,加深理解; - 最后思考实现原理,尝试通过
源码分析
,找到答案。
为了方便大家学习,我已经把 Nacos 相关的链接地址,都准备好了。
- 官方地址:nacos.io/zh-cn/index…
- 1.x 文档地址:nacos.io/zh-cn/docs/…
- GitHub 地址:github.com/alibaba/nac…
- OpenAPI 文档:nacos.io/zh-cn/docs/…
进入 Nacos 官方,映入眼帘的是很醒目的一句话:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
这句话有三个重点:动态服务发现、配置管理、服务平台。那这三个重点到底是什么?
-
动态服务发现:这个很好理解,我们新增一个微服务实例,Nacos 它能够感知到,也就是
服务治理
,这也是作为注册中心最基本的功能。 -
配置管理:Nacos 它不仅仅是一款注册中心,它还提供了配置管理一大特点,不仅是对服务进行管理,而且还可以管理你项目中对应的配置文件,让你整个微服务项目配置中心化,统一全部放在 Nacos 配置管理中;除此之外,它还是动态化的。那什么是动态化?举个例子,在 Spring Boot 项目中,会包含 properties、yml 配置文件,在项目启动中,如果想要修改对应的配置文件,是需要重启应用,更改后的配置文件才能生效。而 Nacos 的配置管理,它可以让你在更改配置文件后,无需重启应用,即可生效。
-
服务管理平台:Nacos 它提供了一套 Web 管理后台,在这个后台中,我们可以监控整个服务运行状态以及对配置管理进行操作。
通过 Nacos 官方中的介绍,我们已经初步掌握 Nacos 所具备的功能,但还是很抽象,不要紧,我们接着往下看。
在官方链接中,我们找到 Nacos 文档中的架构图:
从架构图中我们能够得到什么信息?
从最上层开始看,首先就是 Provider(提供者)、Consumer(消费者),都需要借助于 Name(服务名称、服务地址),这是最外层。Provider、Consumer 都是需要依赖 Nacos Server。
接着往下看,Nacos Server 最上层,有一层 OpenAPI,对外提供服务。那对外提供什么服务呢?
Naming Service
:注册服务,我们微服务实例的注册、注销、服务管理都是在这一块进行实现的。Config Service
:配置服务,它提供了在微服务架构中,统一配置中心的功能。 Nacos 配置中心为服务配置提供了编辑、存储、分发、变更管理、历史版本管理等功能,并且支持在实例运行中,更改配置。
除此之外,Naming Service、Config Service 也是依赖于 Nacos Core 核心来完成的,并且在 Nacos Core 核心中还包含了Consistency Protocol
(一致性协议),这一块就涉及到分布式一致性协议的内容,包括 CAP 理论、Raft 协议,这些也都是我们在使用微服务架构中需要考虑的问题。
至于 Nacos Console,这一整块相当于服务管理平台,也是依赖于 Nacos 提供的 OpenAPI 来进行扩展的额外功能。
Nacos 架构图我们看完了,要记住重点:Config Server 对应配置管理中心、Naming Service 对应注册中心
,这个在后续看源码的时候会有帮助的。
讲了这么多理论知识,光说不练假把式,那么接下来,我们开始讲解如何在本地环境中搭建 Nacos 服务,并且把 Nacos 集成到 Spring Cloud 项目中,来使用 Nacos 两大核心功能
Nacos 单机搭建
官网看了,架构图也解释了,对于我们刚刚讲解的理论部分,可能还有部分同学对于 Nacos 还是感觉比较抽象,那么接下来我们先把 Nacos 环境搭建起来,具体地去使用 Nacos,再加深一下理解。
本次搭建Nacos1.4.1
版本,系统用的是CentOS 7
,安装好 JDK 1.8 版本或以上,安装 Maven 3.2+ 版本,建议 2 核 CPU/4G 内存及其以上。
Nacos 搭建核心文件 Nacos-server.1.4.1.zip
给同学们准备好了,把文件下载后,解压上传到 CentOS 系统对应目录位置即可。
链接:pan.baidu.com/s/1b7Y2AvaL…
提取码:k1wx
然后进入解压后到 Nacos 目录,执行单机启动命令:bin/startup.sh -m standalone
,这里的 standalone 就是表示单机的意思。如下图所示,就表示启动成功了。
如果你是 Mac、Windows 也一样,解压缩之后,使用控制台执行启动命令,也可以正常使用。Windows 系统使用startup.cmd
这个文件来启动 ,后面命令一样(如下图)。
启动成功之后,Nacos 默认端口是8848
,浏览器中输入http://localhost:8848/nacos/
即可进入登录页面,账号密码默认是 nacos/nacos
。
成功启动之后,又该如何正确关闭 Nacos 呢?同样还是来到解压后的 Nacos 目录下,执行:bin/shutdown.sh
,如下图:
就这样,单机环境的搭建就完成了,还是很简单的!当然这也是前期我先让大家使用 nacos-server 中已经编译好的 Jar 包来启动,在后面的课程中,我会教大家如何使用Nacos 源码的方式
来启动。
在这里提醒一点
,Nacos 建议在内部隔离网络环境中部署,强烈建议不要部署在公共网络环境中。Nacos 属于微服务内部所使用的组件,是没有必要暴露在公网当中。
Nacos 集群搭建
在生产环境当中,我们搭建的 Nacos 肯定是需要保证高可用的,单台一般不建议在生产环境中使用,所以掌握 Nacos 集群搭建也是很有必要的。
先给大家看看 Nacos 集群架构搭建完成之后的架构,如下图所示:
这种架构,官方称之为 “ 域名 + SLB 模式 ” ,其优点可读性好,而且换 IP 方便。
不管是访问 Nacos 后台、还是微服务集成 Nacos,所使用的地址都是域名,因为域名变动性最小,哪怕域名背后的 IP 地址变更了,对于客户端来说是无感知的。
域名是直接解析到负载均衡上,再由负载均衡选择具体 Nacos 实例来进行访问,这种架构也是 Nacos 官方推荐集群模式。
准备工作
在搭建之前,我们得先准备一个可用的 MySQL 数据库
,因为在 Nacos 集群模式下,数据的持久化是需要公用的,每一台 Nacos 实例都需要连接同一个 MySQL 数据库。
有了 MySQL 数据库之后,我们需要在 MySQL 创建一个对应 Nacos 所使用的数据库,并且创建好对应的表结构以及数据。
MySQL 创建数据库,数据库名字可以自定义,但对应的表结构以及数据,我们执行 Nacos 所提供的 SQL 语句即可,在解压后的 Nacos-server.1.4.1.zip
文件中,有一个 conf 文件夹,在 conf 文件夹下有个文件叫 nacos-mysql.sql
,这个 sql 文件里面包含了表结构、数据,我们只需要复制 sql 文件的内容到对应数据库中执行创建表结构、数据即可。
最后结果如下图:
三步法:搭建Nacos集群
本次集群搭建,我们也按照 3 台 Nacos 的规模来搭建,3 台最好放在 3 台不同的服务器上。我这里为了做教学,放在了同一台服务器上搭建的,把 Nacos-server.1.4.1.zip
解压后的文件,复制了 3 份出来,为了做区分,文件名加上了“端口号”(如下图)。
第一步:配置 MySQL 信息 。 把 MySQL 数据库信息配置到 Nacos 配置文件当中,在解压后的 Nacos-server.1.4.1.zip
文件中,有一个 conf 文件夹,修改里面的 application.properties
文件,如下图:
进行如下三个操作:
- spring.datasource.platform=mysql 前面的 # 去掉;
- 把 db.num=1 前面的 # 去掉,默认是注释掉了;
- 把自己 MySQL 连接信息给配置上去。
在application.properties
文件中,也可以修改 Nacos 服务的端口号,对应配置是:server.port=8848
。在不同的服务器上搭建,全部端口都适用 8848 没问题;但如果是在同一台服务器上搭建,那么端口号就需要修改了,否则会出现端口被占用的问题。
第二步:配置集群信息。这一步就是告诉 Nacos,其他节点都部署在哪台服务器上,怎么告诉呢?在 conf 文件夹下,有一个cluster.conf.example
文件,首先我们把文件名改成cluster.conf
,然后编辑这个文件,把 Nacos 每台对应的 IP 以及 Nacos 端口号配置进去。
我这里就只有一台机器,所以 IP 就都是10.0.16.3
,只是把端口号改了。
第三步:修改集群内存大小。修改 bin/start.sh 文件,启动文件默认就是集群模式,但是集群模式下分配的系统内存占用特别大,如果你机器内存很足,那可以忽视。但是我一台机器 hold 不住,所以得改配置文件,小伙伴可以根据电脑本身选择是否修改。
这里我改成 -Xms64m -Xmx64m -Xmn32m
,系统内存省着点花。
JAVA_OPT="${JAVA_OPT} -server -Xms64m -Xmx64m -Xmn32m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
注意
:这三步骤,在每一台 Nacos 实例,都需要进行配置。
启动集群服务
把 3 台 Nacos 节点都启动,如下所示,这次启动的命令就有点不同,不需要带-m standalone
参数了,默认就是集群模式启动。
bin/startup.sh
在 Nacos 管理后台,节点列表中就能看到我们集群的状态了,如下图:
到这里,我们 Nacos 集群环境搭建就成功了,那么接下来就是使用我们 Nacos 服务的两个核心功能了。
Nacos 注册服务
现在假设我们有两个 Spring Boot 项目,一个是订单服务 order-service,一个是库存服务 stock-service,如下图:
这里简单说明一下:Spring Boot 项目的创建过程就不讲解了,查询接口也不详细讲了,都是很简单的例子,代码案例你可自行下载。
链接:pan.baidu.com/s/1c4So_yYF…
提取码:btwq
项目需求分析
现在产品经理说,得加一个功能:
在
订单服务
下单时,需要调用库存服务
查询接口,查询商品库存是否充足。
现在库存服务
有一个查询接口,通过商品编码,就可以查询到商品的库存信息,接口详情如下图:
其实就是一个很简单的查询接口。 那么现在问题来了,这个接口怎么提供给订单服务
使用呢?最简单粗暴的方式,就是使用一个 HttpUtils 工具类,直接 get 方法一下就能调用了。但咱们现在是微服务架构的模式,这么干就有点不妥当了,那么本次我们就利用 Nacos 来实现。
集成 Nacos 注册中心服务
首先,我们需要把订单服务
、库存服务
两个项目都注册到 Nacos 中去。这个就好比卖房子,房东要先去中介那儿登记一下房屋信息,买家找到中介寻找对应的房源,然后通过房东登记的信息,去看对应的房子。
微服务与微服务调用,也是这么个道理,首先库存服务
告诉注册中心:我的 IP 地址是 127.0.0.1:8080,这个时候订单服务
就去问注册中心要库存服务
登记的 IP + Port 信息,这样订单服务
就能直接找到库存服务
了。
那服务注册具体是怎么实现的呢?
- 第一步,在 pom.xml 文件中引入 Nacos 注册中心依赖:
<dependency><groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 第二步,application.properties 中配置 Nacos 服务地址:
spring:application:name: stock-servicecloud: nacos:discovery:server-addr: http://124.223.102.236:8848
本章讲 Nacos 注册中心的实现,其实是很简单的方式,配置也仅仅配置了一个nacos.discovery.server-addr
而已,更多详细配置可以点击查看这个地址。
完成上面两个步骤,直接启动项目即可,这个时候我们来查看 Nacos 的控制台,就多了一个sotck-serivce
服务。
点击详情查看,是不是stock-service
服务 IP 和 Port 都登记好了。
库存服务
注册到 Nacos 中了,那订单服务
当然也要注册到对应的 Nacos 才行。订单服务
也是重复上面两个步骤,注册到 Nacos 当中。
两个服务都注册到 Nacos 中了,那么接下来就可以使用Feign
的方式,进行微服务调用了。
// 指定微服务名称
@FeignClient(name = "stock-service")
public interface StockService {/*** 查询库存* @return*/@GetMapping(value = "/stock/getStockByProductId")Integer selectStockByProductId(@RequestParam("productId") Integer productId);}
Feign 的使用方式我就不展开来讲了,否则文章太长了,Feign 是我们微服务最常见的调用方式。
最后效果如下图,请求的地址是订单服务的下单地址,通过集成 Nacos 注册服务,从而能够以微服务的形式,调用库存服务的查询接口,拿到商品库存结果。
Nacos 配置服务
接下来我们继续讲解实战使用 Nacos 另外一个核心功能:配置服务。 配置服务也是 Nacos 一大亮点,我面试的时候,问面试者:“你们公司为什么要选用 Nacos 呀?” 绝大多数回答中,都会包含说:“ Nacos 对比其他注册中心多了一个配置中心,可以把微服务项目配置文件统一管理,并且能够做到无需重启项目,也能感知配置文件的修改。”
好,那我们就来看看 Nacos 配置服务具体该怎么使用它。
集成 Nacos 配置中心服务
这个配置也比较简单,主要分以下四个步骤。
第一步,在 Nacos 管理中心创建对应配置文件。我们先打开 Nacos 后台,配置管理 → 配置列表,点击 + 号,创建一个新的配置文件。
这里的 Data ID
可以理解为配置文件名字,具有唯一性;groups
相当于分组,可以分不同的环境、不同的业务;配置格式
我这里选择的是 YAML,最后按照所选格式,把配置内容放进去就行了。如下所示:
Nacos 后台操作完成之后,可以看见刚刚创建的配置文件记录。
第二步,引入配种服务依赖,现在我们还需要把 Spring Boot 项目集成 Nacos 配置中心服务,在 pom.xml 文件中,引入 Naocs 配置中心对应的 Maven 依赖。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
第三步,修改配置文件名,把配置文件的文件名改成 bootstrap.yml,默认是 application.yml。
第四步,配置 Nacos 配置服务信息。在 yml 文件中,新增 Nacos 配置中心相关配置:
spring:application:name: stock-servicecloud:nacos:# 配置中心config:server-addr: http://124.223.102.236:8848## 配置文件前缀prefix: stock-service# 配置文件类型file-extension: yml# 注册中心discovery:server-addr: http://124.223.102.236:8848
配置中心演示
下面我们在 stock-service 项目中编写一个User
实体类代码,进行测试一下。@Value
注解的意思就是从配置文件中去读取这个属性;@RefreshScope
这个注解是表示动态刷新,动态感知配置文件变化,不加这个注解的话,修改 Nacos 上的配置文件,是不会有动态刷新的效果。
@Data
@Component
@RefreshScope
public class User {@Value("${user.userName}")private String userName;}
我写了 controller
来测试,原本数据是李四
,在 Nacos 后台管理,把配置文件中 usereName 属性,修改成王五
之后,项目不需要重新启动也能动态改变原来的值,具体演示如下图:
总结
好了,到这里本章就结束了,我们一起来回顾一下本章的重点。
-
首先讲解了如何入门学习一项新的技术,也带大家看了 Nacos 核心架构图,从架构图中能够很直观地反映出 Nacos 具备的核心功能,一个是
Naming Service
,另一个是Config service
。 -
紧接着详细讲解了,利用
Nacos-server.1.4.1.zip
的方式搭建 Nacos 单机版本、集群版本的详细操作步骤。 -
最后通过两个 SpringCloud 微服务集成 Nacos 的
注册中心
、配置中心
演示了两大核心功能,在这个演示案例中,使用方式还是比较简单的,主要是因为本小册的交付核心是源码分析,这里只是让没有使用过 Nacos 的同学,先有一个大致的概念,至少知道 Nacos 它具备什么功能,这样面对后面的源码分析时才不会一头雾水。
思考问题
本小册核心是分析 Nacos 底层源码,前面使用了 Nacos 服务注册功能,不知道现在你在脑海中有没有产生疑问。
- 为什么引入 Nacos 注册中心的依赖,配置好 Nacos 地址,项目启动就能够触发注册这个动作?底层是怎么做的?
- 在 Nacos 后台管理可以看到,
stock-service
的 ip 地址以及端口号,那这些信息是怎么传给 Nacos 服务端的? - Nacos 服务端接收这些信息,又是如何处理的?
这些就是我们需要思考的问题,产生了疑问,说明开始动脑思考了,对于这些问题,你可以先尝试自己找到答案,在后续的文章中,我都会带着大家去分析,吃透源码。
相关文章:

Nacos 入门微服务项目实战
Nacos 核心源码精讲 - IT贱男 - 掘金小册全方位源码精讲,深度剖析 Nacos 注册中心和配置中心的核心思想。「Nacos 核心源码精讲」由IT贱男撰写,375人购买https://s.juejin.cn/ds/BuC3Vs9/ Hi,大家好,欢迎大家来学习《Nacos 核心源…...

【c++】类和对象:让你明白“面向一个对象有多重要”:构造函数,析构函数,拷贝构造函数的深入学习
文章目录 什么是面向对象?一:类是什么? 1.类的访问限定符 2.封装 3.类的实例化 4.this指针二:类的6个默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数什么是面向对象? c语言是面向…...

职场IT老手教你3步教你玩转可视化大屏设计,让领导眼前一亮!
我是制造企业的IT中心的研发人员,平常工作就是配合业务部门出出报表,选型一些商业软件,并在内部负责实施运维。最近领导出去参观了一些数字化转型比较领先的工厂和制造企业,回来就甩给我几张图,问能不能我们也做几个这…...

【光伏功率预测】基于EMD-PCA-LSTM的光伏功率预测模型(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

大数据Kylin(二):Kylin安装使用
文章目录 Kylin安装使用 一、Kylin安装要求 二、Kylin安装 1、Kylin安装前环境准备...

我们的微服务中为什么需要网关?
说起 Spring Cloud Gateway 的使用场景,我相信很多小伙伴都能够脱口而出认证二字,确实,在网关中完成认证操作,确实是 Gateway 的重要使用场景之一,然而并不是唯一的使用场景。在微服务中使用网关的好处可太多了&#x…...

互联网医院源码 线上问诊 智慧医院源码 C#源码
互联网医院平台源码 智慧医院管理系统源码 开发环境:ASP.NET C# VS2019 SQL2008 依托于实体医院利用互联网技术对接院内业务信息系统,向患者提供基于线上问诊、预约挂号、缴费结算、医患互动、诊后随访、健康科普和复诊等全面的医疗健康互联网服务。…...

基于昇腾计算语言AscendCL开发AI推理应用
01 初始AscendCL AscendCL(Ascend Computing Language,昇腾计算语言)是昇腾计算开放编程框架,是对底层昇腾计算服务接口的封装,它提供运行时资源(例如设备、内存等)管理、模型加载与执行、算子…...

JS document.write()换行
换行效果: 通过传递多个参数,即可实现换行效果: document.write("<br>",ar) 效果: 示例源码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…...

Java高级-集合-Collection部分
本篇讲解java集合 集合 集合框架的概述 集合、数组都是对多个数据进行存储操作的结构,简称Java容器。 说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt,.jpg,.avi,数据库中…...

Android性能优化:getResources()与Binder交火导致的界面卡顿优化
欢迎:https://juejin.cn/post/7198430801851531324/ 欢迎:https://nasdaqgodzilla.github.io/2023/02/10/Android%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%EF%BC%9AgetResources-%E4%B8%8EBinder%E4%BA%A4%E7%81%AB%E5%AF%BC%E8%87%B4%E7%9A%84%E7%95%8C%E…...

常见的内存操作函数
👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&a…...

python关键字
文章目录1 and、or、not2 if、elif、else3 for、while4 True、False5 continue、break6 pass7 try、except、finally、raise8 import、from、as9 def、return10 class11 lambda12 del13 global、nonlocal14 in、is15 None16 assert17 with18 yield1 and、or、not and、or、not…...

C语言 | 预处理知识详解 #预处理指令有哪些?他们如何使用?宏和函数有哪些区别?...#
文章目录前言预定义符号介绍预处理指令#define#define替换规则预处理指令 #undef宏和函数的对比宏和函数的对比图命名约定命令行定义条件编译预处理指令 #include嵌套文件包含其他预处理指令写在最后前言 上篇文章介绍了一个程序运行的 编译与链接 ,其中编译阶段有个…...

如何实现LFU缓存(最近最少频率使用)
目录 1.什么是LFU缓存? 2.LFU的使用场景有哪些? 3.LFU缓存的实现方式有哪些? 4.put/get 函数实现具体功能 1.什么是LFU缓存? LFU缓存是一个具有指定大小的缓存,随着添加元素的增加,达到容量的上限&…...

【C++之容器篇】精华:vector常见函数的接口的熟悉与使用
目录前言一、认识vector1. 介绍2. 成员类型二、默认成员函数(Member functions)1. 构造函数2. 拷贝构造函数vector (const vector& x);3. 析构函数4. 赋值运算符重载函数三、迭代器(Iterators)1. 普通对象的迭代器2. const对象…...

InstructGPT
文章目录Abstract 给定人类的命令,并且用人工标注想要的结果,构成数据集,使用监督学习来微调GPT-3。 然后,我们对模型输出进行排名,构成新的数据集,我们利用强化学习来进一步微调这个监督模型。 我们把产…...

RTOS之一环境搭建(基于TM4C123GXL)
硬件TM4C123GXLBOOSTXL-EDUMKII keil5micriumOSA软件安装:1 ARM-MDK(MDK538aMDK_Stellaris_ICDI_AddOn)MDK538a链接:https://www.keil.com/demo/eval/arm.htmICDI链接:https://documentation-service.arm.com/static/60509bd61da8f8344a2ca1b…...

151、【动态规划】AcWing ——2. 01背包问题:二维数组+一维数组(C++版本)
题目描述 原题链接:2. 01背包问题 解题思路 (1)二维dp数组 动态规划五步曲: (1)dp[i][j]的含义: 容量为j时,从物品1-物品i中取物品,可达到的最大价值 (2…...

DS期末复习卷(二)
选择题 1.下面关于线性表的叙述错误的是( D )。 (A) 线性表采用顺序存储必须占用一片连续的存储空间 (B) 线性表采用链式存储不必占用一片连续的存储空间 © 线性表采用链式存储便于插入和删除操作的实现 (D) 线性表采用顺序存储便于插…...

大数据技术架构(组件)31——Spark:Optimize--->JVM On Compute
2.1.9.4、Optimize--->JVM On Compute首要的一个问题就是GC,那么先来了解下其原理:1、内存管理其实就是对象的管理,包括对象的分配和释放,如果显式的释放对象,只要把该对象赋值为null,即该对象变为不可达.GC将负责回…...

ETL基础概念及要求详解
ETL基础概念及要求详解概念ETL与ELT数据湖与数据仓库ETL应用场景ETL具体流程及操作要求抽取清洗转换加载ETL设计模式SQL脚本语言ETL工具设计ETL工具SQLETL接口设计要求明确接口属性约定接口形式确定接口抽取方法规范接口格式概念 ETL即Extract(抽取)Tra…...

刷题记录:牛客NC23054华华开始学信息学 线段树+分块
传送门:牛客 题目描述: 题目latex公式较多,此处省略 输入: 10 6 1 1 1 2 4 6 1 3 2 2 5 7 1 6 10 2 1 10 输出: 3 5 26这道题让我体验到的线段树相对于树状数组的常数巨大 我们倘若直接用单点修改的话,如果D过小比如1那么我们足足要加n次,时间复杂度爆…...

二叉搜索树(查找,插入,删除)
目录 1.概念 2.性质 3.二叉搜索树的操作 1.查找 2.插入 3.删除(难点) 1.概念 二叉搜索树又称二叉排序树.利用中序遍历它就是一个有顺序的一组数. 2.性质 1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 2.若它的右子树不为空,则右子树上所有节点的值都…...

C# PictureEdit 加载图片
方法一: 如果要加载的图片的长宽比不是太过失衡, 1.可以改变picturebox的SizeMode属性为 PictureBoxSizeMode.StretchImage, 2.或者Dev控件 PictureEdit的SizeMode属性为Zoom。(zoom:缩放;clip剪短;stret…...

3种方法设置PDF“打开密码”,总有一种适合你
PDF文件是我们工作中经常用到的文件之一,对于重要的文件,设置“打开密码”是一种很好的保护方式。下面就来说说,设置PDF“打开密码”有哪三种方法? 方法一:在线网站加密 市面上有很多可以直接在线上加密PDF文件的产品…...

第三章 数据链路层(点到点的传输服务)-计算机网络(笔记)
计算机网络 第三章 数据链路层(点到点的传输服务) 数据链路层属于计算机网络的低层。数据链路层使用的信道主要有以下两种类型: (1)点到点信道。这种信道使用一对一的点到点通信方式。 (2)广…...

volatile关键字与CAS机制
volatile关键字 volatile关键字可以对类的成员变量与静态变量进行修饰 volatile关键字的作用 1.保证被修饰属性的可见性,被修饰后的属性如果被更改后其他线程是会立即可见的 2.保证被修饰属性的有序性,被修饰后的属性禁止修改指令执行的顺序 注意:volatile关键字不能保证属性…...

LeetCode题解 动态规划(四):416 分割等和子集;1049 最后一块石头的重量 II
背包问题 下图将背包问题做了分类 其中之重点,是01背包,即一堆物件选哪样不选哪样放入背包里。难度在于,以前的状态转移,多只用考虑一个变量,比如爬楼梯的阶层,路径点的选择,这也是能用滚动数组…...

【FFMPEG源码分析】从ffplay源码摸清ffmpeg框架(二)
demux模块 从前面一篇文章中可以得知,demux模块的使用方法大致如下: 分配AVFormatContext通过avformat_open_input(…)传入AVFormatContext指针和文件路径,启动demux通过av_read_frame(…) 从AVFormatContext中读取demux后的audio/video/subtitle数据包…...