自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 spring session + redis 实现分布式session

引言通常情况下,生产环境的web应用为了解决单点故障,都会多台部署,这样就会存在一个问题,当我们登录后,会将登录信息存储到session中,如果依赖原生的web容器中的session,当负载均衡到不同服务器会出现不同登录状态的情况,如下图: 当用户首次访问服务时,假设被Nginx代理到Server A,用户填写账户信息进行登录,此时,会在Server A上创建一个session保存登录信息,当用户继续访问服...

2020-06-09 10:07:31 1024 1

原创 CAS实现SSO单点登录详解

一. 基本概念1. SSO单点登录 (Single Sign-On) 是目前比较流行的服务于企业多系统整合的解决方案之一,使得在多个系统中,用户只需要登录/退出一次就可以访问/退出所有相互信任的应用系统。2. CAS认证中心 (Central Authentication Service) 是SSO的一种实现,Yale大学开源了一个CAS项目(感兴趣的可以自行学习),本文实现了一个简化版的CAS(github源码地址)二. 原理...

2020-05-28 13:25:59 1361

原创 Eureka系列 - 常用配置

1. 常用资源客户端:JerseyApplicationClient/JerseyReplicationClient服务端:资源 功能 url ApplicationsResource 全量/增量获取应用实例信息 GET /apps GET /apps/delta ApplicationResource 1. 获取单个应用实例信息 2. 注册实例信息 GET /apps/{appName}

2020-05-21 09:53:12 197

原创 Eureka系列 - 多节点广播 Acceptor - Worker 模式

1. Eureka 节点列表管理Eureka中PeerEurekaNodes类负责node节点列表管理,DefaultEurekaServerContext上下文构建时会调用PeerEurekaNodes的start方法,初始化一个"Eureka-PeerNodesUpdater"定时器,默认每10min调用updatePeerEurekaNodes(resolvePeerUrls())方法进行一次更新操作,如下图所示:默认情况下,读取的是配置文件中的eureka.client.serviceU

2020-05-19 17:31:45 658

原创 Eureka系列 - 高可用配置

引言:前面文章中介绍的都是Eureka的单机用法,要想在生产环境中使用的话,必须要求高可用,下面我们来看一下Eureka的高可用使用。1. 项目配置先看一下之前Eureka单机版配置:spring: security: basic: enabled: true user: name: zhang password: 123 server: port: 8761 eureka: client: re

2020-05-15 16:39:33 299

原创 Eureka系列 - 缓存机制解析

引言Eureka是Netflix开源的、用于实现服务注册和发现的服务。Spring Cloud Eureka基于Eureka进行二次封装,添加了更人性化的UI,使用更加方便。但由于Eureka本身存在缓存比较多,服务状态更新滞后,最常见的状况是:服务下线后状态没有及时更新,服务消费者调用到已下线的服务导致请求失败。1. AP特性从CAP理论来看,Eureka是一个AP系统,优先保证可用性(A)和分区容错性(P),不保证强一致性(C),不保证最终一致性,因此在架构中设计了较多缓存。2. .

2020-05-14 17:08:34 703

原创 Eureka系列-服务端接收心跳请求与自动过期

1. 心跳续约心跳续约机制:当服务端接收到客户端的心跳请求后,首先在当前服务端上更新续约事件,如果成功,则将心跳广播给其它服务端节点续约有两种情况: (1) 客户端发起的心跳续约(isReplication=false) (2) 服务端消息广播时发起的心跳续约(isReplication=true)1.1 接收心跳请求 - renewLeaseInstanceResource#renewLease 接收心跳请求 PUT http://{ip}:{port}/eurek...

2020-05-13 17:30:30 1275 2

原创 Eureka系列-客户端源码分析

1. Eureka client主要功能: 1)服务注册:发送注册请求到注册中心 2)服务发现:获取服务提供者实例信息,包括ip,port等 3)服务续约:发送当前客户端心跳到注册中心 4)服务下线:发送当前客户端取消注册请求到注册中心2. Eureka client 时序图3. DiscoveryClient 初始化DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaCl...

2020-05-11 16:54:41 350

原创 mysql 知识点整理

mysql 驱动表:https://blog.haohtml.com/archives/17837mySQL 的Join及底层实现原理:https://blog.csdn.net/qq_37050329/article/details/88777937

2020-04-26 10:13:25 168

原创 mysql优化—索引失效情况

1. 参数类型错误例1:id为varchar类型可以使用索引例2:id为varchar类型,实际使用数据类型,不能使用索引例3:age为bigint类型,可以使用索引例4:age为bigint类型,实际使用数字类型,可以使用索引数字类型的可以使用字符串类型,字符串类型的不能使用数据类型2.范围查询,搜索引擎会评估,如果全表扫描的效率...

2020-03-11 16:28:10 160

原创 mysql优化—explain

EXPLAIN: 为用于SELECT语句中的每个表返回一行信息,表以它们在处理查询过程中将被MySQL读入的顺序被列出。SHOW WARNINGS: 显示优化器限定SELECT语句中的表和列名,重写并且执行优化规则后SELECT语句是什么样子,并且还可能包括优化过程的其它注解。例:行信息解释:1. idSELECT识别符,这是SELEC...

2020-03-10 15:22:22 284

原创 mysql优化—order by

MySql中的两种排序方式1. 通过有序索引顺序扫描直接返回有序数据因为所有因的结构是B+树,索引中的数据是按照一定顺序排列的,所以在排序查询中如果能利用索引,就能避免额外的排序操作。Explain分析查询时,Extra显示为Using index。2. Filesort排序,对返回的数据进行排序所有不是通过索引直接返回排序结果的操作都是Filesort排序,也就是说进行了额外的排...

2020-03-10 15:22:09 203

原创 spring扩展点-FactoryBean

FactoryBean也是我们向spring容器注入Bean常用手段,这种方式有如下特点: a. 延迟加载,只有注入的Bean(T)被依赖时,才会调用getObject方法,首次使用才会调用,此后会从缓存中读取(FactoryBeanRegistrySupport.factoryBeanObjectCache缓存) b. 这种方式会创建两个对象,一个是FactoryBean类型...

2020-01-10 13:19:03 158

原创 spring扩展点-BeanPostProcessor

BeanPostProcessor也是常用的接口,它允许我们对Spring容器中的bean在初始化之后进行一些特殊处理,比如对指定bean进行动态代理。1. 创建一个BeanPostProcessor接口实现类@Configurationpublic class MyBeanPostProcessor implements BeanPostProcessor { @Override...

2020-01-07 11:06:19 139

原创 spring扩展点-InitializingBean

Spring的InitializingBean是我们常用的接口之一,它是在Bean初始化完调用的,利用这一点,我们可以在系统刚启动时做一些事情。1. 定义一个InitializingBean接口实现类/** * 自定义InitializingBean * 调用: Bean初始化完之后 AbstractAutowireCapableBeanFactory.invokeInitMetho...

2020-01-07 10:48:57 164

原创 spring扩展点-ImportBeanDefinitionRegistrar

向spring容器注入一个Bean,我们通常会用哪些方法呢?一种是通过xml配置文件方式,一种是通过注解方式(例如@Component系列、@Bean),今天我们来说一个spring提供的直接注入的方式-ImportBeanDefinitionRegistrar1.首先要定义一个注解,内部通过@Import方式注入MyImportBeanDefinitionRegistrar类@Rete...

2020-01-03 14:33:36 530

原创 spring-事务源码解析(三)

前面spring-事务源码解析(一)和spring-事务源码解析(二)两篇文章分别介绍了spring容器如何对bean进行事务代理和具体事务代理逻辑以及如何和我们自己使用的JDBC框架(以JdbcTemplate为例)一起集成的,今天来说一下spring事务的传播机制,这点无论是在面试中还是自己工作中都是很重要的部分。1. spring事务提供的传播机制枚举/** * 如果有事务,就加...

2019-12-23 14:34:16 97

原创 Mysql-事务(三)

innodb锁:https://blog.csdn.net/keda8997110/article/details/45080453innodb mvcc:https://blog.csdn.net/whoamiyang/article/details/51901888

2019-12-23 14:16:41 69

原创 spring-事务源码解析(二)

我们在上一篇spring-事务源码解析(一)文章讲了spring如何对bean进行事务代理的检测和代理方式的选择,最终定位在了JdkDynamicAopProxy和ObjenesisCglibAopProxy两个代理类上,今天我们以JdkDynamicAopProxy为例,来看一下如何对bean进行事务代理和调用的。/** * JdkDynamicAopProxy */public O...

2019-12-18 11:35:44 162

原创 spring-事务源码解析(一)

今天我们来说一下spring的事务功能实现,测试环境如下: <!-- Spring Boot jdbc 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</a...

2019-12-16 17:22:59 128

原创 spring-boot bean初始化源码分析(二)

在上一篇spring-boot bean初始化源码分析(一)最后我们已经把被@Component注解的类和classpath下"META-INF/spring-autoconfigure-metadata.properties文件中的类添加到了beanFactory中(例如beanDefinitionMap、beanDefinitionNames),今天我们再来看一下是如果把上面放到beanFac...

2019-12-13 16:55:53 203

原创 spring-boot bean初始化源码分析(一)

测试环境:spring-boot-2.0.1.RELEASEspring 5.0.5.RELEASE/** * spring容器启动时,主要操作都在这个方法中实现 * AbstractApplicationContext */public void refresh() throws BeansException, IllegalStateException { ....

2019-12-12 17:02:51 386

原创 Mysql-事务(二)

1.事务的并发问题脏读:事务A读取了事务B更新的数据,然后B进行了回滚操作,这时A读到的数据就是脏数据,侧重于一个事务读取了另一个未提交事务修改的数据。不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交(和脏读不一样的地方),导致事务A多次读取同一数据时,结果不一致。幻读:系统管理员A将数据库中所有学生的成绩从具体分数改未ABCD,但是系统管理员B...

2019-12-10 14:09:54 188

原创 Mysql-事务(一)

1.事务概述事务可以理解成一组sql语句的集合,mysql中,存储引擎一般使用innodb,因为innodb支持事务,而且事务完全符合ACID的特性,ACID是下面四大特性的首字母缩写: A:atomicity(原子性) 整个事务中的所有操作要么全部执行成功,要么全部执行失败后回滚到最初状态。 C:consistency(一致性) ...

2019-12-09 09:30:36 281 1

原创 JAVA并发工具—CyclicBarrier

今天来介绍一下并发库中的另一个工具——障碍物(CyclicBarrier)/** * 基于ReentrantLock实现,常用方法如下: * 1. CyclicBarrier(3): 设置计数 * 2. await(): 计数减一 * 2.1 如果计数大于0,释放当前线程持有的锁,唤醒下一个等待线程(如果没有执行过2.2,此处应该没有线程可被唤醒),挂起当前线程(condi...

2019-12-05 13:46:01 81

原创 JAVA并发工具—CountDownLatch

前面一篇文章Semaphore讲了基于AQS共享锁实现的信号量工具,今天再讲另一个同样基于AQS共享锁实现的计数器工具——CountDownLatch:/** * CountDownLatch基于CAS中的共享锁,常用有如下几个方法: * 1. CountDownLatch(3): 设置共享锁数量 * 2. await(): 检查当前共享锁数量,如果锁数量等于0,就继续执行,反之...

2019-12-05 12:51:19 117

原创 JAVA并发工具-Semaphore

再前面一篇文章ReentrantReadWriteLock中讲到用AQS中的共享锁和排它锁实现的读写锁,今天我们再说一个基于AQS共享锁实现的工具信号量——Semaphore:/** * 基于AQS共享锁实现,常用方法如下: * * 1. Semaphore(3): 设置共享锁数量 * 2. acquire(): 获取共享锁,共享锁减一,如果锁数量不够,就放到同步队列中等待 ...

2019-12-05 11:41:41 252

原创 JAVA-ReentrantLock(二)

前一篇文章ReentrantLock(一)讲了重入锁的的基本使用,一个线程在获取锁后只能通过释放锁才能让其它线程获取锁。如果一个线程在获取锁后,想要暂时把锁的控制权交出去,然后在适当时间再继续执行(线程间通信),用之前的方法就很难实现。今天我们来看一下重入锁的另一种用法——条件控制(Condition): /** * 用主线程和子线程交替执行50次,主线程先执行,每次执行100次打...

2019-12-04 15:33:58 66

原创 JAVA-ReentrantReadWriteLock

之前讲到的ReentrantLock属于排他锁,虽然可以重入多次,但同一时间只允许一个线程获取锁。而今天讲到的ReentrantReadWriteLock维护了一对锁——读锁和写锁。读锁是共享锁,允许多个线程同时持有。读锁是排他锁,同一时刻只能有一个线程持有。通过分离读锁和写锁,使得并发性相比一般的排他锁(ReentrantLock,Synchronized)有很大的性能提升,因为大多数场景中读是...

2019-12-04 11:11:32 88

转载 JAVA-自旋锁

https://blog.csdn.net/fuyuwei2015/article/details/83387536

2019-12-02 17:16:41 86

原创 JAVA-ReentrantLock(一)

ReentrantLock是一个基于AQS实现的可重入的锁实现,包括公平锁和非公平锁,大量采用非阻塞算法,在中低量(并发量低,锁占用时间短)的并发上效率是非常高的,获取和释放流程图如下:public static void main(String[] args) { Lock lock = new ReentrantLock(); try { ...

2019-11-29 13:53:56 93

原创 JAVA-数据结构-HashMap

/** * 哈希表综合了数组和链表的特点,数组称之为哈希桶,每个桶里面放的是链表,链表中的每个节点,就是哈希表中的每个元素 */ // 默认的哈希桶初始化容量,必须是2的幂 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 // 哈希桶最大数量...

2019-11-28 16:49:52 99

原创 JAVA-Unsafe

@SuppressWarnings("restriction")public class UnsafeTest { private static final Unsafe unsafe = getUnsafe(); private static final Object obj = new AtomicInteger(10); private static final long ...

2019-11-28 16:49:44 85

原创 JAVA-引用

在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(strong reference)、软引用(soft reference)、弱引用(weak reference)、虚引用(phantom reference),这4种引用强度一次减弱。1. 强引用强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它,如"Object obj = new Obje...

2019-11-21 17:27:11 72

原创 JAVA-动态代理CGLIB

CGLIB动态代理实现也是常用的实现方式,相对于JDK的只能代理接口,CGLIB的可以直接对类进行代理,功能也更多1. 由于实现原理,需要一个类public class OrderService { public String add(String orderNo) { System.out.println("add a order[orderNo=" + orderNo +...

2019-11-20 14:24:48 244

原创 JAVA-动态代理JDK

jdk的动态代理实现是常用的方法之一,动态代理相比较于静态代理的好处不言而喻,可以少写大量的代理类,更加便于扩展。下面用一个样例来看一下具体实现:1. 由于实现原理要求,首先需要一个接口public interface OrderService { /** * 添加一个订单 * @param o */ void add(Order o); /** * 删除一个...

2019-11-19 13:40:04 136

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除