- 博客(75)
- 资源 (2)
- 收藏
- 关注
转载 Netty学习一——Netty的通信原理
在 Linux 的网络编程这个层次中,客户机和服务器各有一个Socket文件,当两台主机通信时,客户机里的客户端应用进程 A 发送消息,通过 TCP协议数据包头的 SYN 标志位置1,进行主动打开,经 A 主机的 TCP/IP 协议栈发送到 LAN,然后经 WAN 中的路由器传给服务端应用进程 B 的目的主机所在的 LAN,之后经目的主机的 LAN 将报文传给目的主机,最后经目的主机的 TCP/IP 协议栈处理,服务器被动打开,将消息递交给目的应用程序 B。下面的 demo 只一次调用,很简单。
2023-01-11 17:02:08
1273
原创 java并发编程学习八——ReentrantLock原理
基于AQS自定义实现一个不可重入的独占锁try {try {try {再次加锁,当前线程被阻塞 System . out . println(Thread . currentThread() . getName());} /*** 独占锁,不可重入//上锁之后,设置锁的所有者为当前线程 setExclusiveOwnerThread(Thread . currentThread());System . out . println("成功加锁");
2022-10-28 15:12:00
741
转载 kafka怎么保证不丢失消息和不重复消费消息
Leader 维护了一个动态的 in-sync replica set (ISR:同步副本),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 producer 发送 ack。如果 follower长时间未向leader同步数据,则该 follower 将被踢出 ISR,该时间阈值由replica.lag.time.max.ms参数设定。而如果Leader 发生故障,就会从 ISR 中选举出新的 leader。
2022-10-13 11:58:47
6417
1
原创 java并发编程学习六——乐观锁CAS
CAS必须借助volatile才能读到共享变量的最新值,从而完成【比较-交换】的效果,来看看AtomicInteger的源码,其中初始值value就是用volatile修饰的。原子累加器,指的是累加操作是原子的,java8之前只能使用原子整数类的incrementAndGet方法,java8新增了LongAdder(并发大神狗哥,Doug Lea编写),专门用于累加操作,效率提升5倍。,当竞争激烈的时候,累加分散到多个cell减少失败重试,最后将结果汇总,最终减少竞争提高效率。给withdraw加锁即可。
2022-09-22 14:54:12
665
原创 java并发编程学习五——volatile
但是,Java的volatile在实现层面用的不是fence族屏障,而是lock。lock锁用来控制cpu对一个内存区域的访问权限,具体的这里不再深入讨论。他们都能达到内存屏障的效果,在字节码指令层面可以这样理解:- 对volatile变量的写指令后会加入写屏障- 对volatile变量的读指令前会加入读屏障
2022-09-13 15:13:40
310
原创 java并发编程学习四——ReentrantLock使用
可中断意思是,在获取lock失败之后,线程进入lock的阻塞队列,再调用了线程的interrupt方法之后,线程将被中断,不再阻塞并抛出异常InterruptedException。使用ReentrantLock的tryLock(n,TimeUnit)方法,可以设定等待锁的时间,等待期间也可以被interrupt方法打断。看示例代码,t1线程要先睡觉再工作,t2线程要先工作再睡觉就发生了死锁。三个线程t1/t2/t3,t1输出五次a,t2输出5次b,t3输出5次c;执行的结果,程序不能正常退出。
2022-09-05 14:07:22
485
原创 java并发编程学习二——synchronized
每个java对象都可以关联一个Monitor对象,当对象被synchronized(obj)加锁(重量级)之后,对象头中的Mark Word会记录指向Monitor对象的指针,即上图中的ptr_to_heavyweight_monitor。那么什么是轻量级锁呢,轻量级锁是相对于原来使用操作系统互斥量来实现的传统锁而言的,所以才有轻重的区别。下面看下轻量级锁的实现过程。锁膨胀或者叫锁升级,指的是在CAS操作尝试加轻量级锁时失败,说明已经有其他线程加上了轻量级锁(发生了竞争),将轻量级锁变为重量级。......
2022-08-18 16:31:48
257
原创 java并发编程学习一——Thread
Java语言中,在Thread类定义了一个状态枚举,表示线程的状态,有以下六种:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED。如图所示:开始和终止状态一样的,java中将就绪和运行合并为可运行,将阻塞细分为阻塞、等待和超时等待。值得注意的是,操作系统中一部分阻塞,在java中认为是可运行状态,例如IO阻塞。setDaemon将设置线程为守护线程,顾名思义守护其他线程的线程,当没有线程需要守护,自己就强制结束了。加判断让t1线程停止运行。...
2022-08-12 11:57:47
231
原创 Spring Cloud Gateway集成Nacos和Swagger聚合Api文档
服务网关又称API网关,是系统对外的唯一入口,封装了系统的内部架构。所有的客户端和消费端,都通过网关接入微服务,在网关层处理非业务逻辑。API网关不是微服务场景中的必须组件,如图没有网关,微服务一样可以对外提供服务但是对应微服务数量较多,复杂度比较高的系统,使用网关可以带来一些好处聚合接口,使得服务对调研者透明,降低客户端与服务端的耦合度聚合后台服务,节省流量,提升用户体验提供安全,流量控制、API监控、计费等功能。...
2022-08-05 16:10:57
1341
原创 Flyway报错源码分析——Validate failed: Migrations have failed validation
Flyway报错分析,Validate failed: Migrations have failed validation
2022-08-05 12:09:59
8382
原创 SpringBoot2.6.5集成Swagger3和Knife3
代码已在上文给出,有很多文章说加配置spring.mvc.pathmatch.matching-strategy=ant_path_matcher就行,我遇到的情况就不行,查到资料说是因为依赖了spring-boot-starter-actuator,只能多配置一个BeanspringfoxHandlerProviderBeanPostProcessor,配完后又出现依赖冲突,之后再解决冲突(pom排查冲突包),就正常启动了。看似简单的集成,花了三天时间才搞定,记录一下踩过的坑,希望大家能避开。...
2022-07-22 09:55:50
695
原创 ResponseBodyAdvice接口使用导致的报错及解决
ResponseBodyAdvice用于在返回值写入响应之前,将body的内容重新封装,直接上代码。
2022-07-21 14:47:34
2419
1
原创 spring-cloud-starter-oauth2 密码模式认证过程
上文讲到在密码模式下OAuth2主要用于校验客户端合法性、产生token、校验tokenSercurity主要用于用户名密码校验、接口权限控制OAuth2与Sercurity整合之后,校验顺序:获取token请求:校验客户端合法性——校验用户名密码——产生token受保护的接口请求:校验token——校验接口权限下面就来看下,每个步骤在源码中是如何实现的客户端合法性校验,第一步校验client_id、client_secret,就是客户端id和密码;第二步校验grant_type;第三步校验sc
2022-07-12 17:17:55
4542
原创 spring-cloud-starter-oauth2使用
**OAuth2主要用于校验客户端合法性、产生token、校验token****Sercurity主要用于用户名密码校验、接口权限控制**因此OAuth2与Sercurity整合之后,校验顺序:校验客户端合法性——校验用户名密码——产生token——校验token——校验接口权限............
2022-07-02 15:58:39
7949
原创 SpringBoot源码学习四——MVC主流程下
处理@RequestMapping,拦截器链处理,执行接口,匹配@ResponseBody,封装返回值。监听器——过滤器——拦截器
2022-06-27 16:03:35
323
1
原创 SpringBoot源码学习三——MVC主流程上
SpringBoot容器选择,DispatcherServlet装配与初始化,加载到Tomcat,init方法执行
2022-06-20 15:37:14
224
原创 SpringBoot源码学习二——Bean的装配
1. 启动类作为入口也是第一个配置类,首先进行解析 2. 启动类上的@ComponentScan注解扫描到所有@Component注解的类加载到容器 3. SpringBoot将所有@Component注解的类都当做配置类进行处理,每个类都是先处理@Import再处理@Bean,@Import引入的配置类将递归处理。 4. 处理启动类上所有的@Import,@Import可以引入普通类、配置类、实现了ImportSelector的类。普通类直接加载到容器,配置类进行递归处理,实现了ImportSele
2022-06-14 10:22:03
1943
1
原创 SpringBoot源码学习一——run的启动流程
SpringBoot是Spring下的子项目,它是Spring组件集成的一站式解决方案。采用约定优于配置的思想简化了繁重的配置,提供了各种启动器,大大降低使用Spring的难度,使开发者能快速上手。2.2 SpringBoot启动流程...............
2022-06-06 17:00:25
540
2
原创 Spring源码学习七——事务管理主流程
同一个线程,相同的数据源,对于事务的处理使用同一个连接 - 同一个线程,不相同的数据源,使用不同的连接 - 不同的线程,相同的数据源,使用不同的连接 - 不同的线程,不同的数据源,使用不同的连接
2022-05-27 16:26:54
229
1
原创 Spring源码学习六——AOP主流程
一、AOP的作用AOP就是面向切面编程的简称,它里面有一些概念来帮助理解,我觉得那些都不重要。我的理解是利用动态代理增强方法,不侵入原来方法,在方法的执行前后增加逻辑,把这个做到灵活配置就是AOP了。比如给不同的方法增加同样的逻辑,或者给类中所有的方法都增强等等不同场景的使用1.1 JDK动态代理1.2 Cglib动态代理二、代码跟踪三、AspectJ四、总结...
2022-05-24 13:53:35
1163
2
原创 Spring源码学习二——容器启动过程下
文章目录一、容器启动过程上二、容器启动过程下2.1 invokeBeanFactoryPostProcessors()一、容器启动过程上书接上回:容器启动过程上二、容器启动过程下2.1 invokeBeanFactoryPostProcessors()实例化并调用所有注册的BeanFactoryPostProcessor bean,如果给定,则遵循显式顺序。进入getBeanFactoryPostProcessorsbeanFactoryPostProcessors是空的,看了下在sprin
2022-04-28 11:35:11
337
1
原创 Spring源码学习一——容器启动过程上
一、启动容器启动一个注解配置的容器AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);进入构造方法AbstractApplicationContext.refresh()方法将刷新启动容器public void refresh() throws BeansException, IllegalStateException { synchroni
2022-04-24 15:12:15
601
1
原创 MyBatis源码学习五——Mybatis与Springboot整合及Mapper的注入过程
Mybatis与Springboot整合及Mapper的注入过程
2022-04-12 11:41:54
2685
1
原创 MyBatis源码学习四——ParameterHandler与ResultSetHandler
文章目录一、ParameterHandler1.1 实例化1.2 参数处理二、ResultSetParameterHandler2.1 实例化2.2 结果集处理一、ParameterHandlerStatementHandler与拦截器上篇讲到,拦截器继续执行,通过invoke,调用被拦截和代理的对象方法(RoutingStatementHandler的prepare方法)再进入 statement = instantiateStatement(connection);–> return co
2022-04-01 16:02:35
854
原创 MyBatis源码学习三——StatementHandler与拦截器原理
文章目录一、StatementHandler1.1 RoutingStatementHandler1.2 PreparedStatementHandler二、拦截器2.1 InterceptorChain2.2 Intercepts注解三、PaginationInterceptor一、StatementHandler执行器Executer与缓存上篇讲到一级缓存在BaseExecuter的queryFromDatabase()方法,当没有命中缓存时,从数据库中查询doQuery(ms, parame
2022-03-31 10:28:08
3221
1
原创 MyBatis源码学习二——执行器Executer与缓存
文章目录一、执行器Executer1.1 CachingExecutor二、缓存2.1 二级缓存2.1.1 TransactionalCacheManager2.2 一级缓存2.2.1 关闭一级缓存一、执行器Executer注册及获取Mapper上篇讲到mapperMethod.execute(sqlSession, args);执行真正的sql逻辑;调用result = executeForMany(sqlSession, args);–>result = sqlSession.selectLi
2022-03-29 15:24:51
962
原创 MyBatis源码学习一——注册及获取Mapper
文章目录一、搭建环境1.1 pom.xml1.2 BlogMapper.java1.3 BlogMapper.xml1.4 MyBatisDemo.java二、addMapper详细分析2.1 MapperRegistry2.2 MapperProxyFactory三、getMapper详细分析3.1 MapperProxy3.2 MapperMethod一、搭建环境1.1 pom.xml <dependency> <groupId>mysql</
2022-03-28 15:33:30
1930
原创 分布式事务三——seata实战
文章目录一、Seata介绍1.1 支持的事务模型二、AT模式实战2.1 准备数据2.2 工程2.3 准备TC服务一、Seata介绍Seata(Simple Extensible Autonomous Transaction Architecture,简单可扩展自治事务框架)是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。Seata 开源半年左右,就已经有接近一万 star,社区非常活跃。我们热忱欢迎大家参与到 Seata 社区建设中,一同将 Seata 打造成开源分布式事务标
2022-03-15 11:18:07
2279
2
原创 分布式事务二——解决思路
文章目录一、分布式事务的思路1.1 CAP定理1.1.1 Partition tolerance1.1.2 Consistency1.1.3 Availability1.1.4 Consistency 和 Availability 的矛盾1.1.5 几点疑问1.2.Base理论二、分布式事务解决方案2.1 分阶段提交2.1.1 DTP和XA2.1.2 二阶段提交2.2 TCC2.2.1 优势和缺点2.3 可靠消息服务2.3.1 基本原理2.3.2 RocketMQ事务消息2.3.3 RabbitMQ的消息确
2022-03-14 11:39:23
2985
原创 分布式事务一——理论
文章目录一、本地事务1.1 undo和redo1.1.1.undo日志1.1.2.undo日志1.1.3.总结二、分布式事务2.1 跨数据源2.2 跨服务2.3 分布式系统的数据一致性问题一、本地事务本地事务,是指传统的单机数据库事务,必须具备ACID原则:原子性(A)所谓的原子性就是说,在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态。对于事务在执行中发生错误,所有的操作都会被回滚,整个事务就像从没被执行过一样。一致性(C)一致性就是应用系统从一个正确的状态到另一个正确的状态
2022-03-11 14:34:45
178
原创 mybatis+shardingJdbc实现数据库读写分离和分库分表
一、原理介绍下面这篇讲的很完整就不赘述了MySQL数据库的读写分离、分库分表 二、环境准备2.1 数据库环境读写分离必须依赖数据的主从复制,这篇博客有详细的过程mysql主从安装2.2 开发环境本案例使用springboot2.6.4+mybatis3.6.7+sharding-jdbc4.1.12.2.1 pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.
2022-03-10 16:20:16
2127
原创 Docker系列八——Dockerfile学习
一、Dockerfile简介Dockerfile是用来构建Docker镜像的文本文件,它是由一条条构建镜像所需的指令和参数构成的脚本。如图是Dockerfile在Docker架构中的作用二、Dockerfile的构建过程
2022-02-22 15:46:16
472
原创 Docker系列七——3主3从redis集群安装
一、新建6个docker容器实例1.1 架构图2.1新建命令docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381docker run -d --name redis-node-2 --net host --privilege
2022-01-21 11:07:04
737
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人