- springboot实现参请求参数和返回参数的加密解密(RequestBodyAdvice、ResponseBodyAdvice、HandlerMethodArgumentResolver)
madman1990
boot请求加密解密
前言在前后端分离系统的基础架构中,安全框架、令牌鉴权基本已经能保证数据的安全,但某些场景,仅有鉴权是不够的,一些比较重要的数据,还需要一个针对请求报文加密解密的工具,前端送加密报文,后端直接解密。实现细节参考链接码云上别人写的例子,具有参考意义。https://gitee.com/licoy/encrypt-body-spring-boot-starter?_from=gitee_search第一
- 【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题
指数反对数
Toolsspringboot前端后端
Catalog时间属性格式问题一、需求二、怎么使用时间属性格式问题一、需求对于表中时间字段,后端创建对应的实体类的时间属性需要设定格式(默认的格式不方便阅读),再返回给前端。二、怎么使用导入jackson相关的坐标,SpringBoot工程中,一般默认在web的starter包里面。com.fasterxml.jackson.corejackson-annotations2.12.3com.fas
- debian安装mariadb
Sahas1019
debianmariadb运维
1.使用命令aptinstallmariadb-server2.启动mariadb,systemctlstartmariadb3.安全设置,mariadb-secure-installation4.登录mariadb,mysql-uroot4.远程登录:usemysql;grantallprivilegeson*.*to'root'@'%'identifiedby'password'withgra
- 相关进程名对应的启动命令及其作用
谁偷了我的炒空心菜
前端开发语言sparkhadoophdfs
通过jps命令,可以看到如下进程名,请解释一下它们各自是哪个命令产生的,有什么作用?WorkerNodeManagerDataNodeMasterNameNodeJobHistoryServerHistoryServer这些进程名对应的启动命令及其作用:1.Worker-**产生命令**:在SparkStandalone模式下,通过执行`$SPARK_HOME/sbin/start-worker.
- [IDEA]如何重置IDEA
精神病不行计算机不上班
IDEA的使用intellij-ideajavaide
在File找到ManageIDESettings然后点RestoreDefaultSettings,然后出现这个框点RestoreandRestart即可重置注:图片上演示的IDEA版本示2023版本的
- Spring Boot 3.x集成FastDFS记录
东皋长歌
微服务&Springspringbootjava后端dfs
最近在做一个课程,需要用讲一下SpringBoot使用文件上传的功能,选择了FastDFS作为文件存储OSS。SpringBoot是最新的3.3.0版本,JDK版本是17,中间有一些坑,下面记录一下。org.springframework.bootspring-boot-starter-parent3.3.017一,安装FastDFSFastDFS高可用集群架构配置搭建及使用_fdfs集群使用-C
- Spring boot和cloud升级记录
kenick
javajavaspringcloud
1.升级前版本和升级后版本cloud:Dalston.SR1->Hoxton.SR8boot:1.5.4.RELEASE->2.3.3.RELEASE2.注意事项依赖升级com.alibabadruid1.0.18->1.1.10mybatis-spring-boot-starter1.3.0->2.1.0jasypt-spring-boot-starter1.16->3.0.3配置添加jasyp
- @ds注解多数据源详解
搬砖牛马人
springboot后端java
@DS注解是MyBatis-Plus提供的动态数据源切换注解,以下是其详细使用方法:添加依赖在项目中引入dynamic-datasource-spring-boot-starter依赖,其版本需根据实际使用的SpringBoot版本和MyBatis-Plus版本进行选择,例如: com.baomidou dynamic-datasource-spring-boot-starter 3.5.2
- 【大模型开发解惑】DeepSeek-R1 强化学习(RL)步骤与方法解析
云博士的AI课堂
大模型技术开发与实践哈佛博后带你玩转机器学习深度学习pythonpytorchdeepseek强化学习深度学习RL机器学习
DeepSeek-R1强化学习(RL)步骤与方法解析目录DeepSeek-R1的RL框架概述1.1核心算法:GRPO(GroupRelativePolicyOptimization)1.2奖励机制设计RL训练流程详解2.1冷启动监督微调(ColdStartSFT)2.2推理导向的强化学习(Reasoning-OrientedRL)2.3拒绝采样与多领域微调2.4全场景RL对齐用户可操作用例与代码示
- 【HAL库&CubeMX】关于延时函数的使用
总结所学
嵌入式硬件单片机
1堵塞式延时用这种程序会一直等待不能做其它工作,优点是实现简单,适用于断时的单任务等待。HAL_Delay(1000);//延时1000ms2非堵塞式等待借用系统的开机时间,可以边等待边完成其它任务,不占用CPU,比较推荐这种方式。需要用到函数HAL_GetTick()uint32_tstartTime,now;startTime=HAL_GetTick();while(1){//循环开始now=
- STMG0B1RCT6擦除Flash遇到单片机直接跑死,并无法连接。
月上神明ꦿེ໑
单片机嵌入式硬件stm32
1.现象在使用擦除函数时,碰到直接跑死的情况,此时单片机的自定义的运行灯不闪烁,甚至使用STlink无法再次连接,现象有点像芯片被锁。代码如下:if(App_ExtCanBootErasePage(FW_BACKUP_START_ADDRESS,FW_BACKUP_END_ADDRESS)==HAL_OK){s_u8FwUpFlag=0;}else{s_u8FwUpFlag=1;}HAL_Stat
- Python[问题处理] django-admin.py startproject learning_log .
weixin_30470857
pythonawk操作系统
django-admin.pystartprojectlearning_log.最近在学习Django,在创建工程文件夹的过程中遇到了一些问题django-admin.pystartprojectlearning_log.该语句用于使用django来创建一个名为“learning_log”的工程名。但在cmd中运行这个语句,并不能达到效果。(没有生成一个新文件夹learning)解决办法:djan
- 力扣-189.轮转数组
এ᭄画画的北北
力扣hot100leetcode算法
题目描述给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为O(1)的原地算法解决这个问题吗?classSolution{public:voidreverse(vector&nums,intstart,intend){for(inti=start;i&nums,intk){if(k>n
- 关于Unity一般的输入操作方式
charlsdm
Unityunity游戏引擎
记录Unity一般的输入操作方式下面附上我的代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassTouchInput:MonoBehaviour{publicfloatmoveSpeed=5.0f;publicfloatrotateSpeed=5.0f;//Startiscall
- 使用Redis缓存实现短信登录逻辑,手机验证码缓存,用户信息缓存
今天有个Bug
缓存redisspring登录
引入依赖org.springframework.bootspring-boot-starter-data-redis加配置spring:redis:host:127.0.0.1#redis地址port:6379#端口password:123456#密码,无密码可以注释调database:10#库lettuce:pool:max-active:10#最大连接数max-idle:10#最多空闲min-
- 密码登录,redis缓存验证码和云短信的使用
每天一篇博客
项目redis缓存java
1.相关依赖导入org.springframework.bootspring-boot-starter-data-redis2.UUID生成验证码publicstaticStringgetCapthCode(){returngetCodeByUUId().substring(6);}publicstaticStringgetCodeByUUId(){intvalue=UUID.randomUUID
- Spring Cloud 2023.x模块化改造实战:轻量化与按需加载
sg_knight
springcloudspringcloudspringbootjava微服务
引言:为什么模块化是云原生时代的必选项?传统SpringCloud应用往往因“全家桶式”依赖引入导致镜像臃肿(平均超过800MB)、启动缓慢(超60秒)和依赖冲突频发。SpringCloud2023.x通过JPMS(JavaPlatformModuleSystem)与模块化Starter设计,让开发者能像搭积木一样按需组装微服务。本文将以一个电商系统改造为例,揭示模块化落地的核心技巧与避坑指南。一
- Java生成微信小程序码及小程序短链接
GalenZhang888
小程序java微信小程序
使用wx-java-miniapp-spring-boot-starter生成微信小程序码及小程序短链接在pom.xml文件中引入依赖com.github.binarywangwx-java-miniapp-spring-boot-starter4.7.0org.springframework.bootspring-boot-starter-data-redis在application.yml中配
- IDEA中springboot内置tomcat启动失败问题
hnjwlwj
学习笔记intellijideaspringboot
该问题是基于Springboot之Web+JSP搭建好Web环境后,在eclipse中可以正常运行,可是IDEA中却无法启动tomcat。解决办法如下:因我们在pom.xml配置的scope是providedorg.springframework.bootspring-boot-starter-tomcatprovided所以必须修改运行配置:完成以上配置后,运行App.java。内置Tomcat
- 关闭重定向Tomcat的控制台日志
sd2131512
JAVAtomcatlog4jwindowssystem
公司的项目JIRA里自带了log4j日志,配置了文件和控制台两种日志输出。当以startup.bat启动时,我们可以看到日志文件以及控制台的输出,可是一旦以windows服务启动tomcat后,会生成一个stdout的日志文件,而且日志不断增加,直到重启服务。公司里的硬盘往往都呗日志文件占了10G+,而且影响性能解决办法就是关闭tomcat的控制台重定向,将HKEY_LOCAL_MACHINE/S
- 过滤器选样条曲线和椭圆——转多段线——c#
山水CAD筑梦人
c#开发语言
filterList=newTypedValue[]{newTypedValue((int)DxfCode.Start,"LINE,CIRCLE,ELLIPSE,ARC,SPLINE,POLYLINE")};usingAutodesk.AutoCAD.DatabaseServices;usingAutodesk.AutoCAD.Geometry;usingIfoxDemo;usingSystem.
- rabbitmq常用命令
刘某的Cloud
MQrabbitmq分布式linux运维系统
目录1.查看集群状态2.查看消息对列的堆积3.重启mq服务4.清理mq队列消息1.查看集群状态rabbitmqctlcluster_status2.查看消息对列的堆积rabbitmqctllist_queuesrabbitmqctllist_queues|grep-v0$3.重启mq服务systemctlstatusrabbitmq-server.servicesystemctlrestartra
- 不等待 bat 执行完成,直接进行下一步|优化后的 bat 文件
nongcunqq
笔记笔记
windows专用importos#打开bat文件,不等待os.startfile(r'D:\code\epdii_jean\func\sap\eo_gscm\data_to_gscm_api.bat')#立即执行下一步操作print("继续执行后续代码")subprocesspopenimportsubprocess#不等待执行完成subprocess.Popen(r'D:\code\epdii
- django快速上手admin
难以怀瑾
djangosqliteandroid
1.在PyCharm中创建Django项目打开PyCharm,点击“File”>“NewProject”。在左侧选择“Django”,然后在右侧配置项目的路径和设置。勾选“EnableDjangoAdmin”选项,PyCharm会自动配置Django环境。(相当于django-adminstartprojectxxx)指定Python解释器,通常可以选择一个虚拟环境或系统中的Python版本。点击
- 【密码学基础】【SM2公钥算法】【ECC算法实现】椭圆曲线运算算法、求解椭圆曲线上的点,
cqupyu
算法密码学python
椭圆曲线点集产生方法如下通过该方法得到如下算法:#计算椭圆曲线的点集defcalculate(a,b,p):results=""forxinrange(p):z=(pow(x,3)+a*x+b)%presult=(pow(z,(p-1)/2))%px1=pow(z,(p+1)/4)%px2=p-pow(z,(p+1)/4)%pstart="当x={x}时,\tz={z},z^{t}={result
- vim ideaVim配置与使用
凌霄上卿
工具vimvim
ideaVim的配置""Sourceyour.vimrc"source~/.vimrc""--Suggestedoptions--"Showafewlinesofcontextaroundthecursor.Notethatthismakesthe"textscrollifyoumouse-clicknearthestartorendofthewindow."setscrolloff=5"Doin
- Introduction to Software Development
后端
IntroductiontoSoftwareDevelopmentProject–Implementation&TestingAssignment2Submission:EachgroupshouldassumetheroleofaSoftwareStart-upCompany,andwillsubmitthefollowingtwoitems:•WorkingSoftware:Theindivi
- python调用谷歌Gemini大模型API两种方法(兼容OpenAI)
kkkkkkkkkasey
pythonlinux开发语言
官方文档:(法一)OpenAI兼容:https://ai.google.dev/gemini-api/docs/openai?hl=zh-cn(法二)GeminiAPI:https://ai.google.dev/gemini-api/docs/get-started/tutorial?hl=zh-cn&lang=python目录一、获取API_Key二、编写调用代码方法一:OpenAI兼容方法二
- 前端验证码节流倒计时
验证码登录,获取验证码的按钮是30秒获取一次,按钮点击后变成30秒倒计时,为0时恢复按钮可点击状态0"@click="startCountDown">{{countDown>0?`${countDown}秒后重新获取`:'获取验证码'}}exportdefault{data(){return{countDown:0,timer:null};},methods:{startCountDown(){/
- 【Java】Maven进阶知识
好吃吗
JavaMaven
Maven进阶知识1.${prop…}可以通过XML的路径引用,比如${project.build.finalName}–来自http://maven.apache.org/guides/getting-started/index.html2.maven的标准目录包括:src/main/java,src/main/resources,还有src/main/filters–来自http://mave
- 算法 单链的创建与删除
换个号韩国红果果
c算法
先创建结构体
struct student {
int data;
//int tag;//标记这是第几个
struct student *next;
};
// addone 用于将一个数插入已从小到大排好序的链中
struct student *addone(struct student *h,int x){
if(h==NULL) //??????
- 《大型网站系统与Java中间件实践》第2章读后感
白糖_
java中间件
断断续续花了两天时间试读了《大型网站系统与Java中间件实践》的第2章,这章总述了从一个小型单机构建的网站发展到大型网站的演化过程---整个过程会遇到很多困难,但每一个屏障都会有解决方案,最终就是依靠这些个解决方案汇聚到一起组成了一个健壮稳定高效的大型系统。
看完整章内容,
- zeus持久层spring事务单元测试
deng520159
javaDAOspringjdbc
今天把zeus事务单元测试放出来,让大家指出他的毛病,
1.ZeusTransactionTest.java 单元测试
package com.dengliang.zeus.webdemo.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import
- Rss 订阅 开发
周凡杨
htmlxml订阅rss规范
RSS是 Really Simple Syndication的缩写(对rss2.0而言,是这三个词的缩写,对rss1.0而言则是RDF Site Summary的缩写,1.0与2.0走的是两个体系)。
RSS
- 分页查询实现
g21121
分页查询
在查询列表时我们常常会用到分页,分页的好处就是减少数据交换,每次查询一定数量减少数据库压力等等。
按实现形式分前台分页和服务器分页:
前台分页就是一次查询出所有记录,在页面中用js进行虚拟分页,这种形式在数据量较小时优势比较明显,一次加载就不必再访问服务器了,但当数据量较大时会对页面造成压力,传输速度也会大幅下降。
服务器分页就是每次请求相同数量记录,按一定规则排序,每次取一定序号直接的数据
- spring jms异步消息处理
510888780
jms
spring JMS对于异步消息处理基本上只需配置下就能进行高效的处理。其核心就是消息侦听器容器,常用的类就是DefaultMessageListenerContainer。该容器可配置侦听器的并发数量,以及配合MessageListenerAdapter使用消息驱动POJO进行消息处理。且消息驱动POJO是放入TaskExecutor中进行处理,进一步提高性能,减少侦听器的阻塞。具体配置如下:
- highCharts柱状图
布衣凌宇
hightCharts柱图
第一步:导入 exporting.js,grid.js,highcharts.js;第二步:写controller
@Controller@RequestMapping(value="${adminPath}/statistick")public class StatistickController { private UserServi
- 我的spring学习笔记2-IoC(反向控制 依赖注入)
aijuans
springmvcSpring 教程spring3 教程Spring 入门
IoC(反向控制 依赖注入)这是Spring提出来了,这也是Spring一大特色。这里我不用多说,我们看Spring教程就可以了解。当然我们不用Spring也可以用IoC,下面我将介绍不用Spring的IoC。
IoC不是框架,她是java的技术,如今大多数轻量级的容器都会用到IoC技术。这里我就用一个例子来说明:
如:程序中有 Mysql.calss 、Oracle.class 、SqlSe
- TLS java简单实现
antlove
javasslkeystoretlssecure
1. SSLServer.java
package ssl;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.KeyStore;
import
- Zip解压压缩文件
百合不是茶
Zip格式解压Zip流的使用文件解压
ZIP文件的解压缩实质上就是从输入流中读取数据。Java.util.zip包提供了类ZipInputStream来读取ZIP文件,下面的代码段创建了一个输入流来读取ZIP格式的文件;
ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
&n
- underscore.js 学习(一)
bijian1013
JavaScriptunderscore
工作中需要用到underscore.js,发现这是一个包括了很多基本功能函数的js库,里面有很多实用的函数。而且它没有扩展 javascript的原生对象。主要涉及对Collection、Object、Array、Function的操作。 学
- java jvm常用命令工具——jstatd命令(Java Statistics Monitoring Daemon)
bijian1013
javajvmjstatd
1.介绍
jstatd是一个基于RMI(Remove Method Invocation)的服务程序,它用于监控基于HotSpot的JVM中资源的创建及销毁,并且提供了一个远程接口允许远程的监控工具连接到本地的JVM执行命令。
jstatd是基于RMI的,所以在运行jstatd的服务
- 【Spring框架三】Spring常用注解之Transactional
bit1129
transactional
Spring可以通过注解@Transactional来为业务逻辑层的方法(调用DAO完成持久化动作)添加事务能力,如下是@Transactional注解的定义:
/*
* Copyright 2002-2010 the original author or authors.
*
* Licensed under the Apache License, Version
- 我(程序员)的前进方向
bitray
程序员
作为一个普通的程序员,我一直游走在java语言中,java也确实让我有了很多的体会.不过随着学习的深入,java语言的新技术产生的越来越多,从最初期的javase,我逐渐开始转变到ssh,ssi,这种主流的码农,.过了几天为了解决新问题,webservice的大旗也被我祭出来了,又过了些日子jms架构的activemq也开始必须学习了.再后来开始了一系列技术学习,osgi,restful.....
- nginx lua开发经验总结
ronin47
使用nginx lua已经两三个月了,项目接开发完毕了,这几天准备上线并且跟高德地图对接。回顾下来lua在项目中占得必中还是比较大的,跟PHP的占比差不多持平了,因此在开发中遇到一些问题备忘一下 1:content_by_lua中代码容量有限制,一般不要写太多代码,正常编写代码一般在100行左右(具体容量没有细心测哈哈,在4kb左右),如果超出了则重启nginx的时候会报 too long pa
- java-66-用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。颠倒之后的栈为{5,4,3,2,1},5处在栈顶
bylijinnan
java
import java.util.Stack;
public class ReverseStackRecursive {
/**
* Q 66.颠倒栈。
* 题目:用递归颠倒一个栈。例如输入栈{1,2,3,4,5},1在栈顶。
* 颠倒之后的栈为{5,4,3,2,1},5处在栈顶。
*1. Pop the top element
*2. Revers
- 正确理解Linux内存占用过高的问题
cfyme
linux
Linux开机后,使用top命令查看,4G物理内存发现已使用的多大3.2G,占用率高达80%以上:
Mem: 3889836k total, 3341868k used, 547968k free, 286044k buffers
Swap: 6127608k total,&nb
- [JWFD开源工作流]当前流程引擎设计的一个急需解决的问题
comsci
工作流
当我们的流程引擎进入IRC阶段的时候,当循环反馈模型出现之后,每次循环都会导致一大堆节点内存数据残留在系统内存中,循环的次数越多,这些残留数据将导致系统内存溢出,并使得引擎崩溃。。。。。。
而解决办法就是利用汇编语言或者其它系统编程语言,在引擎运行时,把这些残留数据清除掉。
- 自定义类的equals函数
dai_lm
equals
仅作笔记使用
public class VectorQueue {
private final Vector<VectorItem> queue;
private class VectorItem {
private final Object item;
private final int quantity;
public VectorI
- Linux下安装R语言
datageek
R语言 linux
命令如下:sudo gedit /etc/apt/sources.list1、deb http://mirrors.ustc.edu.cn/CRAN/bin/linux/ubuntu/ precise/ 2、deb http://dk.archive.ubuntu.com/ubuntu hardy universesudo apt-key adv --keyserver ke
- 如何修改mysql 并发数(连接数)最大值
dcj3sjt126com
mysql
MySQL的连接数最大值跟MySQL没关系,主要看系统和业务逻辑了
方法一:进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起MYSQL即可
方法二:MySQL的最大连接数默认是100客户端登录:mysql -uusername -ppass
- 单一功能原则
dcj3sjt126com
面向对象的程序设计软件设计编程原则
单一功能原则[
编辑]
SOLID 原则
单一功能原则
开闭原则
Liskov代换原则
接口隔离原则
依赖反转原则
查
论
编
在面向对象编程领域中,单一功能原则(Single responsibility principle)规定每个类都应该有
- POJO、VO和JavaBean区别和联系
fanmingxing
VOPOJOjavabean
POJO和JavaBean是我们常见的两个关键字,一般容易混淆,POJO全称是Plain Ordinary Java Object / Plain Old Java Object,中文可以翻译成:普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO,但是JavaBean则比POJO复杂很多,JavaBean是一种组件技术,就好像你做了一个扳子,而这个扳子会在很多地方被
- SpringSecurity3.X--LDAP:AD配置
hanqunfeng
SpringSecurity
前面介绍过基于本地数据库验证的方式,参考http://hanqunfeng.iteye.com/blog/1155226,这里说一下如何修改为使用AD进行身份验证【只对用户名和密码进行验证,权限依旧存储在本地数据库中】。
将配置文件中的如下部分删除:
<!-- 认证管理器,使用自定义的UserDetailsService,并对密码采用md5加密-->
- mac mysql 修改密码
IXHONG
mysql
$ sudo /usr/local/mysql/bin/mysqld_safe –user=root & //启动MySQL(也可以通过偏好设置面板来启动)$ sudo /usr/local/mysql/bin/mysqladmin -uroot password yourpassword //设置MySQL密码(注意,这是第一次MySQL密码为空的时候的设置命令,如果是修改密码,还需在-
- 设计模式--抽象工厂模式
kerryg
设计模式
抽象工厂模式:
工厂模式有一个问题就是,类的创建依赖于工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则。我们采用抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
总结:这个模式的好处就是,如果想增加一个功能,就需要做一个实现类,
- 评"高中女生军训期跳楼”
nannan408
首先,先抛出我的观点,各位看官少点砖头。那就是,中国的差异化教育必须做起来。
孔圣人有云:有教无类。不同类型的人,都应该有对应的教育方法。目前中国的一体化教育,不知道已经扼杀了多少创造性人才。我们出不了爱迪生,出不了爱因斯坦,很大原因,是我们的培养思路错了,我们是第一要“顺从”。如果不顺从,我们的学校,就会用各种方法,罚站,罚写作业,各种罚。军
- scala如何读取和写入文件内容?
qindongliang1922
javajvmscala
直接看如下代码:
package file
import java.io.RandomAccessFile
import java.nio.charset.Charset
import scala.io.Source
import scala.reflect.io.{File, Path}
/**
* Created by qindongliang on 2015/
- C语言算法之百元买百鸡
qiufeihu
c算法
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁,母,雏各几何?
代码如下:
#include <stdio.h>
int main()
{
int cock,hen,chick; /*定义变量为基本整型*/
for(coc
- Hadoop集群安全性:Hadoop中Namenode单点故障的解决方案及详细介绍AvatarNode
wyz2009107220
NameNode
正如大家所知,NameNode在Hadoop系统中存在单点故障问题,这个对于标榜高可用性的Hadoop来说一直是个软肋。本文讨论一下为了解决这个问题而存在的几个solution。
1. Secondary NameNode
原理:Secondary NN会定期的从NN中读取editlog,与自己存储的Image进行合并形成新的metadata image
优点:Hadoop较早的版本都自带,