Idea配置LiveTemplate实现日志快捷输出
PowerShell使用sudo提升为管理员权限
> 1、logm 参数日志打印
1log.info($content$,$params$);
content参数:
1groovyScript("def params = _2.collect {'【'+it+' = {}】'}.join(', '); return '\"' + _1 + '() called with parameters => ' + (params.empty ? '' : params) + '\"'", methodName(), methodParameters())
params参数:
1groovyScript("def params = _1.collect {it}.join(', '); return (p ...
SpringSecurity——原理解析
SpringSecurity 原理解析1、SpringSecurity 的过滤器介绍
SpringSecurity采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这条过滤器链的15个过滤器进行说明
(1) WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。
(2) SecurityContextPersistenceFilter:在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将 SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将 SecurityContextHolder 中的信息清除,例如在 Session中维护一个用户的安全信息就是这个过滤器处理的。
(3) HeaderWriterFilter:用于将头信息加入响应中。
(4) CsrfFilter:用于处理跨站请求伪造。
(5)LogoutFilter ...
分布式Session方案
分布式Session方案什么是Session
session是啥?浏览器有个cookie,在一段时间内这个cookie都存在,然后每次发请求过来都带上一个特殊的jsessionid cookie,就根据这个东西,在服务端可以维护一个对应的session域,里面可以放点儿数据。
一般只要你没关掉浏览器,cookie还在,那么对应的那个session就在,但是cookie没了,session就没了。常见于什么购物车之类的东西,还有登录状态保存之类的。
但是你单块系统的时候这么玩儿session没问题啊,但是你要是分布式系统了呢,那么多的服务,session状态在哪儿维护啊?
其实方法很多,但是常见常用的是两种
tomcat + redis这个其实还挺方便的,就是使用session的代码跟以前一样,还是基于tomcat原生的session支持即可,然后就是用一个叫做Tomcat RedisSessionManager的东西,让所有我们部署的tomcat都将session数据存储到redis即可。
在tomcat的配置文件中,配置一下
1234567891011<Valve clas ...
分布式事务解决方案
单机系统下的事务
分布式系统下的事务
两阶段提交方案/XA方案 也叫做两阶段提交事务方案,这个举个例子,比如说咱们公司里经常tb是吧(就是团建),然后一般会有个tb主席(就是负责组织团建的那个人)。
tb,team building,团建
第一个阶段,一般tb主席会提前一周问一下团队里的每个人,说,大家伙,下周六我们去滑雪+烧烤,去吗?这个时候tb主席开始等待每个人的回答,如果所有人都说ok,那么就可以决定一起去这次tb。如果这个阶段里,任何一个人回答说,我有事不去了,那么tb主席就会取消这次活动。
第二个阶段,那下周六大家就一起去滑雪+烧烤了
所以这个就是所谓的XA事务,两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问问各个数据库你准备好了吗?如果每个数据库都回复ok,那么就正式提交事务,在各个数据库上执行操作;如果任何一个数据库回答不ok,那么就回滚事务。
这种分布式事务方案,比较适合单块应用里,跨多个库的分布式事务,而且因为严重依赖于数据库层面来搞定复杂的事务,效率很低,绝对不适合高并发的场景。如果要玩儿,那么基于spring ...
集群高并发情况下如何保证分布式唯一全局Id生成问题
集群高并发情况下如何保证分布式唯一全局Id生成问题
集群高并发情况下如何保证分布式唯一全局Id生成问题–雪花算法为什么需要分布式全局唯一ID以及分布式ID的业务需求在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识,如在美团点评的金融、支付、餐饮、酒店
猫眼电影等产品的系统中数据逐渐增长,对数据库分库分表后需要有一个唯一ID来标识一条数据或信息;
特别Ian的订单、骑手、优惠券都需要有唯一ID做标识
此时一个能够生成全局唯一ID的系统是非常必要的
ID生成规则部分硬性要求
全局唯一
趋势递增
在MySQL的InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用Btree的数据结构来存储索引,在主键的选择上面我们应该尽量使用有序的主键保证写入性能
单调递增
保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求
信息安全
如果ID是连续,恶意用户的爬取工作就非常容易做了,直接按照顺序下载指定URL即可,如果是订单号就危险了,竞争对手可以直接知道我们一天的单量,所以在一些应用场景下,需要ID无规则不规则,让竞争对手不好猜
含时间戳
一样能够 ...
SpringBoot——启动过程
1、创建SpringApplication
首先创建SpringApplication,创建过程会从spring.factories文件中找到所有的初始化启动引导器,应用容器初始化器,应用监听器加到相应的list集合中
List bootstrappers
List<ApplicationContextInitializer<?>> initializers
List<ApplicationListener<?>> listeners
2、调用run()方法
之后调用run()方法,创建StopWatch用于记录应用启动时间
3、创建引导上下文(Context环境)createBootstrapContext()
获取到所有之前的 bootstrappers 挨个执行 intitialize() 来完成对引导启动器上下文环境设置
获取所有 RunListener(运行监听器)【为了方便所有Listener进行事件感知】(从spring.factories找SpringApplicationRunListener)
调用所有监听器的 ...
SpringBoot——自动配置原理解析
Spring Boot 自动配置原理解析一、自动配置原理总结:
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
生效的配置类就会给容器中装配很多组件
只要容器中有这些组件,相当于这些功能就有了
定制化配置
用户直接自己@Bean替换底层的组件
用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 —-> application.properties
@SpringBootApplication(包含三个注解)
@SpringBootConfiguration –》@Configuration,代表当前是一个配置类
@ComponentScan–》指定扫描哪些,Spring注解
@EnableAutoConfiguration
@AutoConfigurat ...
SpringBoot——各功能原理解析
Spring Boot ——各功能原理解析1、Rest使用与原理Rest原理(表单提交要使用REST的时候)
表单提交会带上**_method=PUT**
请求过来被HiddenHttpMethodFilter拦截
请求是否正常,并且是POST
获取到**_method**的值。
兼容以下请求;PUT.DELETE.PATCH
原生request(post),包装模式requesWrapper重写了getMethod方法,返回的是传入的值。
过滤器链放行的时候用wrapper。以后的方法调用getMethod是调用requesWrapper的
Rest使用客户端工具,
如PostMan直接发送Put、delete等方式请求,无需Filter。
12345spring: mvc: hiddenmethod: filter: enabled: true #开启页面表单的Rest功能
2、请求映射原理SpringMVC功能分析都从 org.springframework.web.servlet.Disp ...
MyBatis——执行原理解析
MyBatis——执行原理解析
调用SqlSessionFactoryBuilder的build方法,传入配置文件
方法里面会创建一个XmlConfigBuilder文件解析器,将配置文件解析封装为一个Configuration对象,这同时会解析所有的映射xml文件,将insert、select、delete、update等标签解析封装成MappedStatement存入Configuration对象中
之后会调用build方法,传入Configuration对象,创建出一个SqlSessionFactory对象
调用SqlSessionFactory对象的openSession方法
方法内首先会从Configuration对象中获取一些信息创建事务
之后会调用newExecutor方法,根据全局配置中的ExecutorType创建相应的Executor对象(默认是SimpleExecutor),如果开启了二级缓存,则会创建CachingExecutor包装Executor。
然后会执行interceptChain.pluginAll方法,使用每一个拦截器包装Executor对象 ...
Spring核心
一、IOC(概念和原理)1、什么是 IOC(1)控制反转,把对象创建和对象之间的调用过程,交给 Spring 进行管理
(2)使用 IOC 目的:为了耦合度降低
2、IOC 底层原理(1)xml 解析、工厂模式、反射
3、IOC(BeanFactory 接口)1、IOC 思想基于 IOC 容器完成,IOC 容器底层就是对象工厂
2、Spring 提供 IOC 容器实现两种方式:(两个接口)
(1)BeanFactory:IOC 容器基本实现,是 Spring 内部的使用接口,不提供开发人员进行使用
加载配置文件时候不会创建对象,在获取对象(使用)才去创建对象
(2)ApplicationContext:BeanFactory 接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
加载配置文件时候就会把在配置文件对象进行创建
3、ApplicationContext 接口有实现类
4、IOC 操作 Bean 管理4.1 概念
1、什么是 Bean 管理 (Bean 管理指的是两个操作 )
(1)Spring 创建对象
(2)Spirng 注入 ...