
java框架
文章平均质量分 78
shuzhou12
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Spring Validation最佳实践及其实现原理,参数校验没那么简单
之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation。本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕到底! 项目源码:spring-validation简单使用Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernate validation是对这个规范的实现,并增加了校验注解如@Email、@Length等。转载 2022-05-14 09:51:10 · 795 阅读 · 0 评论 -
Eureka源码分析
Eureka架构图Eureka核心功能点服务注册(register):Eureka Client会通过发送REST请求的方式向Eureka Server注册自己的服务,提供自身的元数据,比如ip地址、端口、运行状况指标的url、主页地址等信息。Eureka Server接收到注册请求后,就会把这些元数据信息存储在一个双层的Map中。服务续约(renew):在服务注册后,Eureka Client会维护一个心跳来持续通知Eureka Server,说明服务一直处于可用状态,防止被剔除。Eureka原创 2022-03-25 15:53:09 · 1941 阅读 · 0 评论 -
canal学习笔记
EventParser原理原创 2022-01-29 17:28:47 · 324 阅读 · 0 评论 -
kafka学习笔记之概览
介绍Apache Kafka® 是 一个分布式流处理平台. 这到底意味着什么呢?我们知道流处理平台有以下三种特性:可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。可以储存流式的记录,并且有较好的容错性。可以在流式记录产生时就进行处理。Kafka适合什么样的场景?它可以用于两大类别的应用:构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka原创 2021-04-09 14:51:13 · 143 阅读 · 0 评论 -
flume学习笔记
flume体系结构数据流模型Event是Flume定义的一个数据流传输的最小单元。Agent就是一个Flume的实例,本质是一个JVM进程,该JVM进程控制Event数据流从外部日志生产者那里传输到目的地(或者是下一个Agent)学习Flume必须明白这几个概念,Event英文直译是事件,但是在Flume中表示数据传输的一个最小单位。参照下图可以看得出Agent就是Flume的一个部署实例, 一个完整的Agent中包含了三个组件Source、Channel和Sink,Source是指数据的来源和方式,原创 2021-04-08 17:39:42 · 257 阅读 · 0 评论 -
logback学习笔记
logback核心组件Logger:AppenderLayoutLoggerpackage org.slf4j; public interface Logger { // Printing methods: public void trace(String message); public void debug(String message); public void info(String message); public void warn(String mes原创 2021-04-08 10:17:51 · 589 阅读 · 0 评论 -
springcloud读书笔记三 SpringcloudConfig
快速入门创建git仓库创建config服务端创建客户端加密解密动态刷新配置在git仓库对push事件设置一个webhook,当有代码push时,访问注册中心的一个接口 注册中心收到请求后通过springcloud-bus向消息队列的特定的topic发送一个refresh事件 所有的服务都通过springcloud-bus订阅消息队列的这个...原创 2020-04-05 22:09:34 · 178 阅读 · 0 评论 -
springcloud读书笔记二 OpenFeign
Ribbonserver.port=8081spring.application.name=consumer-serviceeureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/#ribbon,制定服务配置,默认配置类为DefaultClientConfigImplribbon.ConnectTimeou...原创 2020-04-05 17:17:10 · 554 阅读 · 0 评论 -
springcloud读书笔记一 Eureka
如何使用启动注册中心集群启动服务提供者客户端注册Eureka中的概念自我保护机制默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,...原创 2020-04-04 17:13:23 · 331 阅读 · 0 评论 -
dubbo源码导读三 dubbo服务引用过程
1. 简介上一篇文章详细分析了服务导出的过程,本篇文章我们趁热打铁,继续分析服务引用过程。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直连的方式引用服务,第二种方式是基于注册中心进行引用。服务直连的方式仅适合在调试或测试服务的场景下使用,不适合在线上环境使用。因此,本文我将重点分析通过注册中心引用服务的过程。从注册中心中获取服务配置只是服务引用过程中的一环,除此之外,...原创 2020-03-29 18:36:46 · 255 阅读 · 0 评论 -
dubbo源码导读二 dubbo服务暴露过程
Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑。整个逻辑大致可分为三个部分,第一部分是前置工作,主要用于检查参数,组装 URL。第二部分是导出服务,包含导出服务到本地 (JVM),和导出服务到远程两个过程。第三部分是向注册中心注册服务,用于服务发现。本篇文章将会对这三个部分代码进行详细的分析。实现细节概览解析服务基于 d...原创 2020-03-29 12:22:44 · 228 阅读 · 0 评论 -
dubbo源码导读一 dubboSPI自适应扩展
dubbo SPIdubbo自适应扩展机制自适应拓展类加载过程加载入口方法加载@SPI接口所有的实现类,如果有实现类有@Adaptive注解,则直接返回此类。 判断@SPI接口中的方法是否至少有一个方法具有@Adaptive注解,如果没有,则抛异常。 通过反射获取接口的方法数组,然后遍历数组生成代理类内部代码。 对于没有@Adaptive注解的方法,生成的代...原创 2020-03-28 15:56:12 · 195 阅读 · 0 评论 -
spring cloud读书笔记一 spring cloud配置文件
springcloud 配置文件优先级解析spring cloud项目的很多功能功能建立在springboot基础之上,启动一个springcloud项目,首先会初始化一个bootstrap applicationContext, 然后会再初始化项目的main applicationContext, 而mainApplicationContext是bootstrapApplicationCon...原创 2020-01-12 19:57:55 · 311 阅读 · 0 评论 -
深入理解jvm读书笔记四 垃圾收集算法
标记-清除算法这个算法分为两个阶段,标记和清除。标记的过程上一篇文档已经讲过了。这是最基础的垃圾收集算法,因为后续的收集算法都是基于这种思路并对其不足进行改进而得到的。它的不足主要有两个:标记和清除两个阶段效率都不高。 容易产生大量不连续的内存碎片,导致分配大对象时无法找到连续的内存空间而不得不触发另一次垃圾回收。复制算法标记-整理算法分代收集算法...原创 2019-12-21 14:59:27 · 180 阅读 · 0 评论 -
zookeeper读书笔记十四 zookeeper应用之实现leader选举
Zookeeper leader选举让我们分析如何在ZooKeeper集合中选举leader节点。考虑一个集群中有N个节点。leader选举的过程如下:所有节点创建具有相同路径 /app/leader_election/guid_ 的顺序、临时节点。 ZooKeeper集合将附加10位序列号到路径,创建的znode将是 /app/leader_election/guid_00...转载 2019-12-08 18:46:58 · 138 阅读 · 0 评论 -
zookeeper读书笔记十三 zookeeper应用之实现两段提交
2PC2PC,二阶段提交协议,即将事务的提交过程分为两个阶段来进行处理:准备阶段和提交阶段。事务的发起者称协调者,事务的执行者称参与者。第一阶段:提交事务阶段(投票阶段)事务询问:协调者会询问所有的参与者结点,是否可以执行提交操作,并等待响应。执行事务:各个参与者执行事务操作,并将Undo和Redo信息记入事务日志中。参与者向协调者反馈事务询问的响应:如果参与者成功执行了事...原创 2019-12-08 17:31:43 · 443 阅读 · 0 评论 -
zookeeper读书笔记十二 zookeeper应用之实现分布式锁
client想要获得锁需要执行以下步骤Callcreate( )with a pathname of "locknode/guid-lock-" and thesequenceandephemeralflags set. Theguidis needed in case the create() result is missed. See the note below. Cal...原创 2019-12-08 15:37:11 · 166 阅读 · 0 评论 -
zookeeper读书笔记十一 zookeeper应用之分布式队列
import java.io.IOException;import java.net.InetAddress;import java.net.UnknownHostException;import java.nio.ByteBuffer;import java.util.List;import java.util.Random;import org.apache.zookeeper...原创 2019-12-08 12:05:59 · 107 阅读 · 0 评论 -
zookeeper读书笔记十 zookeeper实现分布式屏障Barriers
Barriers解决什么问题?当有些操作需要所有参与者全部准备好之后才能开始执行,并且对每个参与者来说必须等待所有参与者全部执行完毕,才算执行完毕。于是就需要一个屏障,来控制所有参与者同时开始,并等待所有参与者全部结束。实现barriers需要注意的问题1.如何控制所有线程同时开始?参与者准备好时就在/barrier父节点下插入顺序临时节点。 调用getChidren方法,并设置wa...原创 2019-12-08 11:49:09 · 314 阅读 · 0 评论 -
zookeeper读书笔记九 zookeeper优化
单独设置transaction log的存放位置,不要和zookeeper的持久化数据放到同一块硬盘上。因为zookeeper所有的更新操作,都会先保存好transaction log才会响应。 正确设置java虚拟机的堆内存,避免发生swapping。因为zookeeper中所有的操作都是顺序的,一旦有一个request发生了swapping保存到的磁盘中,那么后面所有的请求都会保存到磁盘的预...原创 2019-12-07 20:22:34 · 128 阅读 · 0 评论 -
zookeeper读书笔记八 ACL
ACL是什么zookeeper使用Access Control List (ACL) 来控制client对znode的操作权限。ACL的格式为(scheme:expression, permmission),每个znode可以有多个ACL。其中scheme表示zookeeper校验client身份的方式,expression是每种scheme对应的校验表达式,permission表示对znode...原创 2019-12-07 19:54:59 · 154 阅读 · 0 评论 -
zookeeper读书笔记七 watch
可以设置watch的操作getData()getChildren()exists()watch event的类型Created event: 发送到exists()设置的watchDeleted event:发送到exists()、getChildren()、getData()设置的watchChanged event:发送到exists()、getData()设置的w...原创 2019-12-07 18:08:15 · 140 阅读 · 0 评论 -
zookeeper读书笔记六 客户端连接zookeeper集群
配置集群中的zookeeper机器,格式逗号分隔的 host:port,如"127.0.0.1:4545" 或者"127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002"。还可以在端口后面加上一个自定义的path, 例如"127.0.0.1:4545/app/a" or "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002/a...原创 2019-12-07 15:44:24 · 474 阅读 · 1 评论 -
zookeeper读书笔记五 zookeeper数据模型
1、每个znode都包含一个stat structure,这个stat structure包含data和acl的版本信息,每次数据或acl变更,版本都会增加,stat structure还包含一个时间戳。客户端取数据的时候会同时获得这些版本信息,update或delete的时候必须带上版本信息,如果版本信息和要修改的znode不符,则失败。和乐观锁的机制很像。2、可以为每个znode设置一个w...原创 2019-12-07 14:17:25 · 184 阅读 · 0 评论 -
zookeeper读书笔记四 leader选举
过程Leader 选举过程,本质就是广播优先级消息的过程,选出数据最新的服务节点,选出优先级最高的服务节点,基本步骤:各个服务器节点,广播自己的优先级标识 (sid,zxid) 服务器节点收到其他广播消息后,跟自己的优先级对比,自己优先级低,则变更当前节点投票的优先级(sid,zxid) ,并广播变更后的结果 当任意一个服务器节点收到的投票数,超过了法定数量(quorum),则,升级为...原创 2019-12-07 11:07:40 · 170 阅读 · 0 评论 -
zookeeper读书笔记三 zookeeper如何保证数据一致性的
据说Paxos算法的难理解与算法的知名度一样令人敬仰,所以我们先看如何保持数据的一致性,这里有个原则就是: • 在一个分布式数据库系统中,如果各节点的初始状态一致,每个节点都执行相同的操作序列,那么他们最后能得到一个一致的状态。 • Paxos算法解决的什么问题呢,解决的就是保证每个节点执行相同的操作序列。好吧,这还不简单,master维护一个 全局写队列,所有写操作都必须 放入...转载 2019-12-03 21:26:42 · 355 阅读 · 0 评论 -
zookeeper读书笔记二 zookeeper环境搭建
1、启动单台zookeeper创建conf/zoo.cfg文件,并如下配置//单位ms, zookeeper的心跳时间,session timeout这个时间的的2倍tickTime=2000//持久化快照文件的保存目录,如果transaction log保存的目录没有指定,也会保存在这个目录中dataDir=/var/lib/zookeeper//客户端连接端口client...原创 2019-12-01 19:52:09 · 156 阅读 · 0 评论 -
zookeeper读书笔记1 zookeeper概览
1、zookeeper的数据模型,类似于文件系统,不同的是每个节点除了可以拥有子节点,节点本身还可以绑定数据。节点的术语叫znode。每个znode还保存有数据的版本信息,ACL的版本信息,时间戳信息等。2、znode的类型有永久节点和临时节点两种,临时节点在创建它的session消失的时候被删除。临时节点不可以有子节点。这两种节点可以创建为顺序节点。PERSISTENT(持久的)E...原创 2019-12-01 17:17:34 · 201 阅读 · 0 评论 -
redis读书笔记十三 哨兵
1、哨兵机制概述哨兵机制是redis官方的高可用方案,redis主从架构下,master挂掉的情况下,slave不能主动切换为master而是需要哨兵来完成切换过程。这个过程叫failover。哨兵不止有主从切换的作用:Monitoring,监控redis实例的状态。 Notification. 当监控的redis实例的状态异常时,可以通过API通知相关人员。 Automatic ...原创 2019-11-24 17:01:11 · 178 阅读 · 0 评论 -
redis读书笔记十二 持久化
1、redis的两种持久化方式RDB 这种持久化方式每隔一段时间,就把当前时间点的数据快照保存到一个.rdb文件中。 AOF 每次实例接收到写命令时,就会把这条命令追加到AOF文件中。当AOF文件比较大时,redis可以新建一个文件继续写入。 可以同时开启AOF和RDB持久化,此时如果机器重启会使用AOF文件来恢复数据,因为AOF文件的数据更完整。2、RDB持久化方案的优点RDB文件...原创 2019-11-24 10:37:24 · 117 阅读 · 0 评论 -
redis读书笔记十一 redis主从
1、保证redis主从实例,数据一致的机制当客户端对master执行写操作,过期key操作或因为达到最大内存删除key等改变数据集的操作时,只要副本与master连接,master就向副本发送相应的数据修改命令。 当副本与master断开连接后,比如因为网络故障或重启等原因。当副本与master恢复连接后,会尝试与master进行一次部分同步数据,以同步断开连接期间丢失的数据。如果无法达到增...原创 2019-11-19 23:09:40 · 259 阅读 · 0 评论 -
redis读书笔记九 KeySpace通知
客户端可以订阅特定的PUB/SUB 通道,当redis的dataset 发生改变时,redis就会向这些通道发送通知。会发送通知的操作如下影响key的命令 收到LPUSH命令的key 在database0过期的key redis的订阅功能不可靠,如果订阅了某个通道的客户端断开了连接,那么及时后面这个客户端重新连接,断线期间的通知客户端也收不到了,所以如果你的系统要求可靠的通...原创 2019-11-17 16:20:38 · 612 阅读 · 1 评论 -
redis读书笔记八 分布式锁
1、单机架构下实现分布式锁获取锁的命令SET resource_name my_random_value NX PX 30000如果resource_name不存在,则客户端就能set成功,成功获取到锁,过期时间设置为30000ms。客户端处理完业务后,通过DEL命令删除resource_name,从而释放锁。设置过期时间是为了防止死锁,例如由于网络断开,或者客户端业务处理过程...原创 2019-11-17 15:40:51 · 141 阅读 · 0 评论 -
redis读书笔记七 分区
1、为什么要分区?分区可以把redis的数据保存在不同的redis实例上,可以使用多台机器的内存存储数据,同时可以利用多台机器的处理能力处理请求。2、分区的几种算法? 根据key的范围分区。当key是数字时,我们可以把不同范围的key保存到不同的机器上。这种方式需要维护一张映射表,不推荐。 取余法。使用一种hash算法得到key的hash值,假设有n台redis实例,则使用...原创 2019-11-17 14:30:05 · 181 阅读 · 0 评论 -
redis读书笔记六 事务
MULTI,EXEC,DISCARDandWATCH这几个命令是redis事务的基础。1、这些命令可以保证事务中的一组命令的下面两个特点:事务中的命令按输入的顺序执行。在事务执行过程中,其它的命令不能被执行。 要么所有的命令都不执行,要么所有的命令都执行。EXEC命令一旦执行,则事务中的所有命令都会被执行,否则所有的命令都不会被执行。当使用AOF持久化时,redis会保证一次...原创 2019-11-16 20:08:46 · 114 阅读 · 1 评论 -
redis读书笔记五 redis 缓存清除策略
1、设置redis使用的最大缓存,只有设置了redis的最大缓存,当redis缓存达到设置值时才会执行设置的缓存清除策略。可以在redis.conf文件中设置,也可以在redis运行过程中,使用CONFIG SET命令设置。maxmemory 100mb2、redis的缓存清除策略noeviction: 当达到最大缓存后,客户端再执行使缓存增大的操作时直接返回错误。all...原创 2019-11-16 19:08:11 · 766 阅读 · 0 评论 -
redis读书笔记四 EXPIRE
1、什么操作会影响expire设置的过期时间?删除过期时间,只有替换了key对应的value,才会清除key对应的过期时间。如SET、DEL、GETSET命令会清除过期时间,而LPUSH,或INCR等命令不会影响过期时间。使用RENAMEkeynewkey时,key的过期时间会转移到newkey上。PERSIST命令可以清除一个key的过期时间。对一个已经设置过过期时间的k...原创 2019-11-16 17:10:38 · 433 阅读 · 0 评论 -
redis读书笔记三 内存优化
1、Hashes, Lists, Sorted Sets、元素是integers的Sets ,对于这四种集合类型,当它们的元素数量和元素的大小不超过配置值时,reids会以一种特殊的编码保存,最多可以节省10倍空间,平均可以节省5倍空间。下面是相应的配置hashs类型配置hash-max-zipmap-entries 512 (hash-max-ziplist-entries for R...原创 2019-11-16 16:06:36 · 328 阅读 · 0 评论 -
redis读书笔记二 PUB/SUB功能
1、订阅channel,下面的例子订阅了foo bar两个通道。一旦client执行了subscribe命令,就进入pub/sub状态,后续就只能发送SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,PINGandQUIT命令,不能发送其它的命令。并且subscribe和unsubscribe命令的结果也是通过message的形式通知给c...原创 2019-11-16 14:49:10 · 167 阅读 · 0 评论 -
redis读书笔记一 Pipelining
1、为什么要使用pipeliningredis client 向redis server每次发送请求时,client需要收到redis server响应后才能继续发送下一个请求,而每个请求过程中,client需要先把数据传到server, 然后server再把数据传回client,这两个过程都需要时间,网络状态越差,时间越长,这个时间叫RTT (Round Trip Time)。而redi...原创 2019-11-16 12:01:21 · 196 阅读 · 0 评论