- 博客(60)
- 资源 (9)
- 收藏
- 关注
原创 Sentinel-持久化
直接使用dashboard和sentinel配置各种规则时,默认是存在了内存中。如果服务器重启那么数据就会丢失,从而Sentinel提供了5中持久化的方式,将各种配置数据进行持久化,若服务器重启就重新加载持久化的数据,防止数据丢失。1、持久化原理Sentinel 为我们提供了两个接口来实现规则的持久化,他们分别是:ReadableDataSource 和 WritableDataSource。其中主要关注ReadableDataSource。public interface ReadableDa.
2022-05-22 13:57:02
3183
转载 【转】Linux与JVM的内存关系分析
引言在一些物理内存为8g的server上,主要执行一个Java服务,系统内存分配例如以下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux自身使用大约800m。从表面上,物理内存应该是足够使用的;但实际执行的情况是,会发生大量使用SWAP(说明物理内存不够使用了),例如以下图所看到的。同一时候,因为SWAP和GC同一时候发生会致使JVM严重卡顿。所以我们要追问:内存到底去哪儿了?要分析这个问题,理解JVM和操作系统之间的内存关系很重要。接下来主要就Linux与JVM之
2021-05-25 10:32:20
581
原创 多数据源动态切换(主备读写分离)
多数据源动态切换继承Spring-jbdc的AbstractRoutingDataSource,实现其determineCurrentLookupKey方法来确定当前使用的数据源;一般主从切换针对方法级或类级,需要在执行方法或进入类之前明确当前需要的数据源,这时采用Aop的思想+注解来实现;为了确保每个线程之间数据源的独立性,需要增加ThreadLocal来隔离。1、继承Abstrac...
2019-07-24 22:18:51
1119
原创 synchronized关键字
synchronized关键字1、synchronized简述synchronized关键字是为了解决多线程之间访问资源的同步性,保证被它修饰的的方法或者代码块在任意时刻只能有一个线程执行。synchronized属于重量级锁,底层监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock来实现,Java线程切换对应于操作系统实现线程之间的切换时需要从用户态转换为内核态,需要耗...
2019-07-09 23:38:28
242
原创 Dubbo源码通~服务暴露之远程暴露
Dubbo服务暴露~远程暴露远程暴露有两种情况:配置了注册中心的,需要将服务注册到注册中心未配置注册中心的,仅仅将服务按照远程协议暴露出来1、未配置注册中心(用于服务消费者直连服务提供者)具体步骤如下:创建Invoker的步骤和Injvm的方式相同;创建DelegateProviderMetaDataInvoker对象,持有Invoker和ServiceConfig对象;创建...
2019-07-09 23:35:41
453
原创 高并发模拟~多个线程同时发起请求
高并发模拟,多个线程同时发起请求两种方案:CyclicBarrier:栅栏,所有的线程必须同时到达栅栏位置,才能继续执行。CountDownLatch:计数器,一个线程或多个线程一直等待,直到其他线程执行的操作完成。1、CyclicBarrier适用在多线程相互等待,直到到达一个屏障点。并且CyclicBarrier是可重用的。下面的列子,设置线程阻塞200个,但发起线程400个...
2019-07-09 23:30:10
5896
1
原创 Dubbo源码通~服务暴露之本地暴露
Dubbo服务暴露~本地暴露功能:具体服务转换成Invoker,Invoker 转换成 Exporter1、逻辑简述Spring服务暴露入口:ServiceBean.onApplicationEvent() -> ServiceBean.export()Spring容器发布刷新事件,调用Dubbo的export()会进行服务暴露。Dubbo服务暴露入口:ServiceCo...
2019-07-04 22:33:31
554
原创 Java并发~原子操作类
JAVA~原子操作类Atomic原子操作类主要利用CAS (compare and swap) + volatile + native 方法来保证原子操作,从而避免 synchronized 的高开销。CAS:期望的值和原来的旧值比较,如果相同则操作,不同则什么也不做native unsafe方法:UnSafe 类的 objectFieldOffset() 方法是一个本地方法,用于获取”原...
2019-06-25 21:16:59
275
原创 Dubbo源码通~ExtensionLoader
ExtensionLoaderDubbo SPI官方文档1、 主要功能获取ExtensionLoader:getExtensionLoader(Class<?> type):每个扩展应一个ExtensionLoader扩展类集合:getExtensionName(Class<?> type)创建扩展类对象:getExtension(String name)扩...
2019-06-23 20:35:11
276
原创 JVM~Java 对象
JVM~Java 对象1、对象创建过程一个Java对象的创建过程往往包括 类初始化 和类实例化 两个阶段。类加载检查: 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。分配内存:在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所...
2019-06-16 23:14:25
231
原创 JVM~内存模型
JVM~内存模型注意:JDK1.8之前(不含1.8)和之后有些区别线程私有:程序计数器本地方法栈虚拟机栈线程共享堆方法区(运行时常量池,在JDK1.7及之后时已被迁移到堆中)直接内存(非运行时数据区的一部分)1、程序计数器1.1、功能描述记录当前指定程序的所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节...
2019-06-16 23:07:56
220
原创 JVM面试准备指南
JVM常见问题总结1、Java的四种引用强引用软引用弱引用虚引用2、JVM内存模型:Java的内存划分程序计数器Java虚拟机栈本地方法栈堆内存方法区字符常量池3、Java中对象在内存中的状态可达的/可触及的可恢复的不可达的4、判断对象是否已死的两种常用算法引用计数算法GCRoot根搜索算法5、JVM垃圾回收算法标记-清除复制:新生代的...
2019-06-16 23:04:37
374
原创 Dubbo源码通~SPI机制
SPI机制SPI概念:SPI全称为Service Provider Interface,是一种服务提供发现机制,将接口定义与实现解耦,提升程序的可扩展性。JDK的SPI本质:其本质是将接口实现类的全限定名配置在META-INF/services目录下的文件中中,由服务加载器ServiceLoader读取配置文件加载实现类,为在运行时,动态为接口加载实现类。Dubbo的SPI:Dubbo中...
2019-05-23 23:05:38
378
原创 MyBatis源码通~MyBatis-plus
Mybatis-plus核心类1、MybatisSqlSessionFactoryBean初始化Configuration(实际为MybatisConfiguration)MybatisXMLConfigBuilder:内部会调动Mybatis的XMLConfigBuilder初始化继承BaseMapper 的Mapper接口中的所有方法和对应的SqlSource(其中包含着执行...
2019-05-22 00:03:17
891
原创 MyBatis源码通~OGNL的应用
OGNL表达式(Object Graphic Navigation Language)一、原生OGNL表达式1、表达式ONGL表达式执行的所有操作都是根据表达式解析得到的。例如:“对象名.方法名”表示调用指定对象的指定方法;“@[类的完全限定名]@[静态方法或者静态字段]”表示调用指定类的静态方法或访问静态字段;OGNL表达式还可以完成变量赋值、操作集合等操作。2、 root对...
2019-05-21 23:59:39
1469
2
原创 MyBatis源码通~SqlNode
SqlNode每个 XML Node 会解析成对应的 SQL Node 对象。public interface SqlNode { //将各Sql片段合并到DynamicContext中,拼接称为完整的SQL boolean apply(DynamicContext context);}apply方法会根据传入的参数context,参数解析该SqlNode所记录的SQL片段,并调...
2019-05-21 23:47:22
1895
原创 MyBatis源码通~SqlSourceBuilder
SqlSourceBuilder两个作用:将"#{xxx}“替换为占位符”?"将占位符"?"对应的属性信息一起构建成到ParameterMapping中,以便在后续ParameterHandler真正地参数赋值。源码解析先分析从SqlNode 上下文中得到完成的originalSql,将其中的"#{xxx}“替换为占位符”?"同时为每个"#{xxx}"对应的属性构建对应的Para...
2019-05-21 23:44:52
1038
原创 MyBatis源码通~插件Plugin原理
插件Interceptor拦截器实现:实现Interceptor接口,完成拦截器功能。被拦截对象标记:@Intercepts+@Signature注解定义被拦截对象以及对应需要拦截的方法。(用在拦截器上)拦截器链绑定:InterceptorChain封装了所有拦截器,并为被拦截对象创建代理或者其他处理逻辑。拦截:代理对象Plugin.invoke拦截,调用拦截器的intercept方法...
2019-05-20 20:24:55
415
原创 MyBatis源码通~映射文件解析
Mapper映射文件解析关联类:XMLMapperBuilderXMLStatementBuilderMappedStatement0、入口:XMLConfigBuilder.mapperElement(…)1、 XMLMapperBuilder两种配置方式:配置package,会遍历该包下所有的类指定mapper文件的路径resource/url/class解...
2019-05-20 00:05:39
511
原创 MyBatis源码通~缓存Cache
Cache缓存原理Mybatis提供一级缓存和二级缓存,一级缓存即缓存在内存中的,二级缓存则是利用第三方缓存工具来缓存数据。对应类包括BaseExecutor、CachingExecutor、Cache接口实现类。1、缓存实现类 implement CacheMybatis提供了非常多的缓存实现类,有最基本的PerpetualCache实现类、实现LRU策略的LruCache、可保证线程...
2019-05-18 21:44:57
511
原创 MyBatis源码通~Executor
SQL语句执行之Executor在SqlSession(DefaultSqlSession)中持有一个Executor,用于真正发起sql执行。Executor 主要负责维护一级缓存和二级缓存,并提供事务管理的相关操作,它会将数据库相关操作委托给 StatementHandler完成。1、Executor接口方法读和写操作相关的方法事务相关的方法缓存相关的方法设置延迟加载的方...
2019-05-18 21:41:40
493
1
原创 MyBatis源码通~StatementHandler&ParameterHandler
StatementHandler&ParameterHandlerStatementHandler是连接Mybatis和JDBC之间的桥梁。在执行SQL之前,StatementHandler需要创建合适的 Statement 对象,然后通过ParameterHandler将参数值填充到 Statement 对象中,最后通过 Statement.execute()执行 SQL。SQL ...
2019-05-18 21:40:03
1163
原创 MyBatis源码通~SQL语句执行
SQL语句执行SQL执行过程包括但不限于 Mapper 接口代理类的生成、接口方法的解析、SQL 语句的解析、运行时参数的绑定、查询结果自动映射、延迟加载等。1、涉及技术点为 Mapper 接口生成实现类(其实对应的就是代理类)根据配置信息生成 SQL,并将运行时参数设置到 SQL 中一二级缓存的实现插件机制数据库连接的获取与管理查询结果的处理,以及延迟加载等2、主要涉及类或...
2019-05-18 21:37:01
2187
原创 MyBatis源码通~Mapper注册
Mapper接口注册/mapper节点解析完成后,通过命名空间绑定 mapper 接口,这样才能将映射文件中的 SQL 语句和 mapper 接口中的方法绑定在一起(记录在Configuration的MapperRegistry mapperRegistry),后续即可通过调用 mapper 接口方法执行与之对应的 SQL 语句。1、入口XMLMapperBuilder.bindMapper...
2019-05-18 21:28:25
352
原创 MyBatis源码通~SQL节点解析
XMLStatementBuilder解析SQL节点,将定义的SQL节点信息构建成MappedStatement对象。1、MappedStatement记录SQL节点信息,包含了很多属性,平时常见的属性有: private String id; private List<ResultMap> resultMaps; private boolean useCache;...
2019-05-18 21:23:53
1322
原创 MyBatis源码通~SqlSource
SqlSource构建动态SQL//XMLStatementBuilder.parseStatementNode()SqlSource sqlSource = langDriver.createSqlSource(configuration, context, parameterTypeClass);涉及类LanguageDriverRegistry+LanguageDriverX...
2019-05-18 21:20:25
1952
原创 MyBatis源码通~Config配置文件解析主线
Config文件解析涉及的主要类:BaseBuilderXMLConfigBuilderInterceptorObjectFactoryObjectWrapperFactoryReflectorFactoryTransactionFactoryDataSourceFactoryDataSourceEnvironmentXMLMapperBuilderCac...
2019-05-18 21:06:35
522
原创 为什么不再使用原生JDBC,而选择MyBatis之类的框架?
JDBC 中三种执行SQL的APIStatement:用于通用查询PreparedStatement:继承至Statement接口,用于执行参数化查询CallableStatement:继承至PreparedStatement接口,用于存储过程1、问题:Statement与PreparedStatement的区别以及如何避免SQL注入?Statement属于语句硬编码的方式来执行S...
2019-05-18 20:58:37
3288
2
原创 Mybatis源码导读
Mybatis源码导读一、架构划分Mybatis架构可分为三层:接口层、核心处理层、基础支持层。如下图所示:接口层:开发者与Mybatis的交互入口,开启配置初始化逻辑、构建会话Session等。核心处理层:各种配置文件初始化详细逻辑、SQL执行逻辑、结果解析等。基础支持层:缓存定义、公共工具包、事务管理、数据源等。二、源码阅读主线首次读源码,最好结合自身的使用经验来看,理清主线,...
2019-05-18 20:56:46
558
转载 话说javap命令(转载)
javap定义javap是 Java class文件分解器,可以反编译(即对javac编译的文件进行反编译),也可以查看java编译器生成的字节码。用于分解class文件。实例类class synchronizedTest { private static int i = 100; public static void main(String[] args) { test2();...
2019-01-09 22:47:08
776
原创 Volley的使用以及源码分析(一)
Volley的使用1.1 Volley简介Volley是Google I/O 2013发布的一款基于Android平台的网络框架,介绍一下他的使用和功能。
2016-07-11 09:13:48
728
人人都是架构师
2017-12-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人