- 博客(26)
- 收藏
- 关注
原创 Java笔记之Eureka
服务提供者会每隔30s向EurekaServer发送心跳请求,报告健康状态,Eureka会更新记录服务列表信息,90s后服务没有发送心跳不正常会剔除服务列表。服务调用方作为客户端注册到注册中心后,拉取注册中心的服务列表,在通过负载均衡调用对应的服务提供方。注册中心创建集群,生成多台实例,注册中心为了检测各个服务的心跳,每30秒向注册的服务发起请求判断。Eureka:服务的注册与发现,把所有服务的信息都告诉服务注册中心,维护所有服务的信息,以便服务之间调用。服务挂掉90秒后将会从服务注册中心剔除。
2024-08-01 17:36:05 285
原创 Java笔记之分布式事务解决方案
二阶段:如果是全局事务是提交状态,先进行放锁操作,然后释放各个分支事务在一阶段加的全局锁,并推进二阶段提交。如果全局事务是回滚状态,TC会触发二阶段回滚操作,收到回滚操作指令,会回滚一阶段已执行的SQL,还原业务数据。一阶段:拦截业务SQL语句,解析SQL,提取表元数据,找到SQL语句要更新的业务数据。执行SQL语句更新后,将其保存成后镜像,并生成seata事务锁数据,构建事务日志插入事务日志表。将写消息表和业务操作放在一个事务中,保证业务和发消息的原子性,要么全部成功,要么全部失败。
2024-08-01 16:56:32 366
原创 Java笔记之ZooKeeper
事务日志:ZooKeeper把执行的命令以日志的形式保存在datalogdir指定的路径中的文件里,如果没有指定datalogdir,则按照datadir指定路径。数据快照:ZooKeeper会在一定得时间间隔内做一次内存数据的快照,把这段时间的内存数据保存到快照文件中。ZooKeeper中的数据保存在节点上,多个znode之间够成一颗树形的目录结构。stat:当前znode的元数据。chlid:当前节点的子节点。ZooKeeper是一种分布式协调服务,用于管理大型主机。data:保存的数据。
2024-07-17 07:52:44 225
原创 Java笔记之Dubbo
5、Invoker通过路由,负载均衡选择了一个最合适的服务提供者,在通过加入各种过滤器,协议层包装生成一个新的DubboInvoker对象;8、这个Invoker对象会调用本地服务,获得结果再通过层层回调返回到服务消费者,服务消费者拿到结果后,再解析获得最终结果。3、服务消费者通过接口开始远程调用服务,ProxyFactory通过初始化Proxy对象,Proxy通过创建动态代理对象;1、服务提供者启动,开启Netty服务,创建Zookeeper客户端,向注册中心注册服务;6、可视化的服务治理与运维。
2024-07-17 07:52:35 439
原创 Java笔记之Seata
二阶段提交:如果全局事务是提交状态,则TC会先进行放锁操作,然后释放各个分支事务在一阶段加的全局锁,并推进二阶段提交。一阶段处理:首先Seata会先拦截业务SQL,解析SQL语句的定义,提取表元数据,找到SQL语句要更新的业务数据。然后,在执行SQL语句更新业务数据,在业务数据更新后,将其保存成后镜像,并生成seata事务锁数据,构建事务日志并且插入事务日志表。TC:事务协调者,维护全局事务和分支事务的状态,推进事务两阶段处理。TM:事务管理器,与TC交互,用于开启、提交、回滚全局事务。
2024-07-17 07:52:23 173
原创 Java笔记之MyBatis
二级缓存:低层是hashmap结构,二级缓存作用域只在mapper级别,无论多少sqlsession去访问这个mapper,都会从缓存中获取已有的数据mapper对应的namespace。一级缓存:基于PerpetualCache的hashmap本地缓存,作用范围为session域内。通过Statement对象执行SQL语句,并获得结果对象ResultSet。工作原理不同,一级缓存访问同一个对象时,不用再去访问数据库。可以对SQL进行优化,并通过配置来决定SQL的映射规则。pojo方式存储结果集。
2024-07-15 16:22:55 204
原创 Java笔记之SpringBoot
Conditional:满足指定条件才向ioc容器注入组件。@ComponentScan:定义扫描路径。@Configuration:定义配置类。提供可选的start依赖,简化构建配置。完全不需要代码生成,也不需要xml配置。自动配置Spring以及第三方功能。外部配置项修改组件行为。创建独立的Spring应用。通过Spring官网创建。@Bean:定义bean。基于maven项目创建。SpringBoot源码。
2024-07-15 15:55:25 165
原创 Java笔记之Elasticsearch
对于每个文档,遍历文档中的每个单词,将单词与包含该单词的文档进行关联。Elasticsearch存储原理是基于倒排索引和分布式存储的结合,使得它能够高效地存储和检索大规模的数据。它提供了一个分布式多用户能力的全文搜索引擎。优点:Elasticsearch是分布式的,支持接近实时的搜索。索引:一个包含了相关文档数据的集合,存储数据的地方。文档:存储在索引中的基本单位,一个文档就是一条记录。词项字典:包含了所有文档中出现过的单词+指向倒排列表的指针。倒排列表:包含了每个单词的文档ID列表+文档中的位置等信息。
2024-07-14 17:22:10 135
原创 Java笔记之ConcurrentHashMap
但实际情况并非总是如此理想,虽然ConcurrentHashMap类默认的加载因子为0.75,但是在数据量过大或者运气不佳的情况下,还是会存在一些队列长度过长的情况,如果还是采用单向列表方式,那么查询某个节点的时间复杂度为O(n);每个HashEntry代表Hash表中的一个节点,在其定义的结构中可以看到,除了value值没有定义final,其余的都定义为final类型,我们知道Java中关键词final修饰的域成为最终域。整个操作是在持有段锁的情况下执行的,空白行之前的行主要是定位到要删除的节点e。
2024-07-14 17:22:00 392
原创 Java笔记之HashMap
当hashmap中的元素越来越多的时候,碰撞的几率也就越来越高(因为数组的长度是固定的),所以为了提高查询的效率,就要对hashmap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,所以这是一个通用的操作,很多人对它的性能表示过怀疑,不过想想我们的“均摊”原理,就释然了,而在hashmap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize。获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
2024-07-12 15:53:59 860
原创 Java笔记之线程池
synchronousQueue:同步移交不放入队列,直接移交给线程,如果没有空闲线程则创建新线程,如果线程达到最大,则执行拒绝策略。ThreadPoolExecutor核心属性主要就是ctl,基于ctl拿到线程池的状态以及工作线程个数。2、当工作线程数大于核心线程数时,需要尝试将任务添加到阻塞队列中。工作线程的数量:ctl的低29位,表示工作线程的个数。线程池的状态:ctl的高3位,表示线程池状态。1、当工作线程数小于核心线程数时,则创建新的核心线程。3、如果队列已满,则尝试创建非核心线程。
2024-07-12 15:28:53 132
原创 Java笔记之多线程
sleep:使当前线程进入休眠状态,不会释放对象锁,到时间自动唤醒。join:调用该方法,当前线程转为阻塞状态,等待其他线程终止。新建状态:thread对象被new出来,还没有执行start方法。wait:调用该方法,会释放锁对象,线程等待被唤醒。notifyAll:唤醒此对象上等待的所有线程。notify:随机唤醒此对象上等待的当个线程。运行状态:thread对象调用start方法。等待状态:调用wait方法,等待被唤醒。销毁状态:run方法执行结束。实现Runnable接口。实现Callable接口。
2024-07-11 17:59:53 241
原创 Java笔记之ThreadLocal
ThreadLocal内存泄露问题:由于ThreadLocalMap中使用的key是ThreadLocal的弱引用,弱引用是只要垃圾回收机制一运行,不管内存是否充足,都会被垃圾回收器回收。ThreadLocal为每个线程提供一个变量副本,使得每个线程在某一时间访问到的并不是同一个对象。定义:ThreadLocal叫做线程变量,该变量对其他线程而言是隔离的,是当前线程独有的变量。ThreadLocal为变量在每一个线程中都创建了一个副本,并且该副本只能当前Thread使用,因此不存在多线程共享的问题。
2024-07-11 17:44:46 593
原创 Java笔记之CPA、BASE理论
base理论是对CAP理论中一致性和可用性的权衡策略,其核心思想是,即使无法做到强制一致性,但可以根据业务特点,采取适当的方式使得系统达到最终一致性。分区容错性:系统必须能够容忍分布式系统中的某个节点或者网络分区出现故障或者延迟。基本可用:当系统出现故障,运行牺牲一定程度的用户体验,但绝不运行系统完全不可用。软状态:运行系统中的数据存在中间状态,并认为该状态不影响系统的整体可用性。最终一致:软状态允许数据备份延迟,但最终这些数据要保证一致性。AP:放弃一致性,追求更好的可用性。
2024-07-10 18:07:19 199
原创 Java笔记之MQ常见问题
生产者:使用同步发送,把ack设置为1或all,并且设置同步的分区大于等于2。4、新建消费者进行转发另一topic,然后配置多个分区和多个消费者。消费者:主题只能设置一个分区,消费组中只能有一个消费者。2、使用分布式锁,以业务ID为锁,保证唯一性。生产者:使用同步发送,设置ack为非0的值。消费者:把自动ack改为手动ack提交。1、数据库表创建唯一主键或联合主键。3、创建多个消费组,多个消费者。1、消费者使用多线程。
2024-07-10 17:54:19 99
原创 Java笔记之RocketMQ
事务消息可以被认为是一个两阶段的提交消息实现,以确保分布式系统的最终一致性。事务消息确保本地事务的执行和消息的发送可以原子执行。TransactionStatus.RollbackTransaction:回滚事务,表示该消息将被删除,不允许消费。TransactionStatus.Unknown:中间状态,表示需要MQ回查才能确定状态。同步消息:生产者发送消息后必须等待broker返回确认信息。异步消息:生产者发送消息后不用等待broker返回确认信息。单向消息:生产者发送消息后不需要任何回复。
2024-07-10 17:41:43 194
原创 Java笔记之kafka
_commit_offsets :消费者提交的offset被封装为了一种特殊的消息被写入到一个由系统创建的、名称为__commit_offstes的特殊topic的partition中,该topic默认包含50个partition,这些offset的默认有效期为一天。1.主题(topic):一个 topic 里保存的是同一类消息,相当于对消息的分类,每个 producer 将消息发送到 kafka 中,都需要指明要存的 topic 是哪个,也就是指明这个消息属于哪一类。AR=ISR+OSR。
2024-07-10 17:41:25 302
原创 Java笔记之集合
采用segment+hashentry的方式实现,一个ConcurrentHashMap里面包含一个segment数组,一个segment包含一个hashentry数组,每个hashentry是一个链表结构的元素,每个segment守护着一个hashentry数组里的元素,当对hashentry数组的数据进行修改时,必须首先获得对应的segment的锁。get元素:获取元素时,直接找到hash值对应下标,在进一步判断key是否相同,从而找到对应值。Set:无序集合,元素不可重复,只运行一个Null元素。
2024-05-09 16:16:08 635 1
原创 Java笔记之MySQL
从库启动后创建SQL线程,从relay日志中读取内容,执行读取到的更新操作,将内容写入到从库。InnoDB:支持事务和外键,支持行锁,属于聚簇索引,数据和索引绑在一起,必须有主键。串行化:最高隔离级别,所有事务逐一执行,互不干涉,可以阻止脏读、不可重复读、幻读。主从复制用途:实时灾备,用于故障切换、读写分离,提高查询、备份,避免影响业务。MyIASM:不支持事务、外键,支持表锁,属于非聚簇索引,数据和索引分离。可重复读:MySQL默认隔离级别,可以阻止脏读、不可重复读,可能导致幻读。
2024-05-09 15:04:47 245
原创 Java笔记之Spring
Spring循环依赖指在实例化A对象时,生成一个objectfactory对象添加到三级缓存,初始化时发现A依赖B对象,但是B对象未创建,因此就去创建B对象,在初始化B时发现,B对象依赖C对象,但C对象未创建,又去创建C对象,在初始化C对象时发现,C依赖A对象,因此此时可以通过objectfactory中的getObject方法拿到A对象。IOC就是控制反转,将创建对象的权利转移到Spring容器中,通过Java反射机制,由容器根据配置文件在运行时动态的创建对象和管理对象,维护各个对象之间的关系。
2024-05-09 15:04:34 608
原创 Java笔记之MyCat
MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的Server,应用可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问。MyCat拦截了用户放送过来的SQL语句,首先对SQL语句做特定分析,然后将SQL发往后端的真实数据库,并将返回结果做适当的处理,最终再返回给用户。路由解析:负责对传入的SQL语句进行语法解析,对符合要求的SQL语句进行优化,最后进行路由计算。监控管理:负责对MyCat中的连接、内存资源进行监控管理。结果集处理:负责对跨分片的结果进行汇聚、排序、截取等。
2024-05-09 10:54:20 331
原创 Java笔记之JVM
JVM中类的加载是由类加载器和它的子类来实现的,类加载器负责在运行时查找和装入类文件中的类,把类的class文件中的数据加载到内存中。加载某个类时,先委托上一级的加载器加载,如果上级加载器还有上级,则继续向上委托。如果该类委托上级没有被加载,子类加载器才尝试加载该类。程序计数器:线程私有的,每个线程一份,内部保存的字节码的行号,用于记录当前正在执行的字节码指令地址。类加载器:启动类加载器、扩展类加载器、应用类加载器、自定义加载器。加载:查找并加载类的二进制数据在堆中创建类的对象。
2024-05-09 10:25:10 543
原创 Java笔记之Redis
RDB:支持手工执行和服务器定期执行,RDB持久化产生的文件是一个经过压缩的二进制文件,对应文件为dump.rdb,因为保存在磁盘上,所以可以用它来还原数据库中的数据。作用:实现了数据的备份,当主节点异常,可以由从节点提供服务,实现快速的故障恢复,配合读写分离,分担服务器的负载,哨兵配合主从复制,实现redis集群的高可用。执行过程:单独创建一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。优点:文件的完整性好,数据丢失最多一秒的数据。
2023-11-13 16:56:56 43
原创 Java笔记之反射
3、使用Class类中的forName()静态方法,即:Class.forName()1、调用类的class属性类获取该类对应的class对象,即:类名.class。反射就是Java程序开发语言的特征之一,允许中的Java程序对自身进行检查。2、调用类对象的getClass()方法,即:对象.getClass()二、类对应的字节码对象获取方式。
2023-11-13 16:52:48 32
原创 Java笔记之常用设计模式
抽象访问者角色:定义了对每一个元素 (Element) 访问的行为,它的参数就是可以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从这点不难看出,访问者模式要求元素类的个数不能改变。定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。具体处理者角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
2023-08-28 13:59:59 381
原创 Java笔记之六大设计原则
通俗点讲,一个类应该对自己需要耦合或调用的类知道的最少,你的内部是如何复杂和我没有关系,那是你的事,我就知道提供的这么多public方法,我就调用这么多,其他的一概不关心。3、任何类都不应该从具体类派生,如果一个项目处于开发状态,确实不应该有从具体类派生出子类的情况,但人总会犯错,因此不超过两层的继承都是可以忍受的。1、接口要尽量小:这是接口隔离原则的核心定义,不出现臃肿接口,但是小是有限度的,首先不能违背单一职责原则。优点:降低类的复杂度、提高类的可读性、提高系统的可维护性、变更引起的风险降低。
2023-08-23 18:15:59 62 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人