自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Dubbo自激活扩展实现原理分析

Dubbo的自激活扩展说明Dubbo的激活扩展是指根据分组和url参数中的key,结合扩展类上的注解Activate,生成符合匹配条件的扩展实例,得到一个实例集合。Dubbo中的应用场景激活扩展在Dubbo中一个典型的应用场景就是过滤器(Filter), 在服务端收到请求之后,经过一系列过滤器去拦截请求,做一些处理工作,然后在真正去调用实现类。@Activate注解说明/** * 激活。这个注解对于使用给定的条件自动激活特定的扩展非常有用,例如:当有多个实现时,@Activate可以用于

2020-12-17 17:51:18 294

原创 Dubbo的自适应扩展实现原理

Dubbo的自适应扩展原理Dubbo支持多种协议,多种序列化方式,多注册中心等等,使用起来非常的灵活简便。内置了很多常见的组件,比如协议支持dubbo, redis,thrift,grpc,hessian等,也支持用户自定义协议去完成业务功能。这种灵活便捷,正是Dubbo的SPI带来的好处。有时,有些扩展我们不想在框架启动时就直接加载,而是希望在扩展方法被调用的时候,根据运行时的参数去加载具体的扩展类。这么一说,是不是很快就想到了一种实现方式:动态代理。我们可以直接根据每一个SPI接口,封装出一个代理类

2020-12-16 18:30:57 590

原创 Dubbo的SPI实现原理源码分析

SPI简介SPI全称Service Provider Interface(服务提供者接口)是一种服务发现机制,本质上,是将服务的实现类的全限定名配置在文件中,通过服务器加载类读取配置文件,加载实现类,这样在运行时,动态的为接口替换实现类。Dubbo并没有采用Java原生的SPI的实现方式,而是对其进行了增强,在Dubbo框架的实现中,SPI是一个非常重要的模块。接下来,我们一起分析Dubbo的SPI机制和实现原理,源码分析(apache dubbo 2.7.8)Dubbo的SPI主要实现类Ext

2020-12-16 15:37:16 150 1

原创 阿里云ECS上搭建gitlab服务器

gitlab大多数的企业都在用gitlab作为公司项目托管的仓库,本文内容主要是记录自己当时搭建gitlab服务器的过程,以及遇到的一些困难点。软硬件要求主要可以参考gitlab安装要求本人的服务期配置Centos 7.62核4G4G的swap空间安装过程参照官方安装说明:cestos7安装说明跟着教程第一步执行以下命令:sudo yum install -...

2020-03-29 23:47:24 2436 3

原创 Redis实现分布式锁的场景分析

引言通常情况下,我们使用redis用来缓存热点数据,生成唯一主键,redis限流,其实它还有一个重要的功能,就是实现分布式锁。关于redis实现分布式锁,有多种场景,在不同的架构模式下,实现分布式锁的方式也不一样。一般的架构模式有单节点架构,多节点架构(常见的一主多从,多主多从或去中心化的架构),今天我在这里好好讲述一下,redis在分布式系统中,如何实现分布式锁来防止并发带来的安全问题。...

2019-07-04 20:17:20 5273 2

原创 jdk8函数式接口——Consumer介绍

Consumer介绍与实例分析函数式接口:@FunctionalInterfaceConsumer(消费者)函数式接口:@FunctionalInterface自从jdk8提供了函数式接口这一新的特性,极大地精简了java开发的方式。而在jdk8之前的版本,函数仅仅只能传递参数,而不能将一个函数或者说是行为传递过去,这意味着我们在调用某个函数时,该函数所表示的执行功能已经很明确了,对于lamb...

2019-04-26 19:48:55 2708 1

原创 动手实现一个简单的RPC

RPCremote procedure call,远程过程调用,顾名思义就是向远程计算机发送请求来获取服务。对于开发人员来说,调用远程服务就像是调用本地服务一样便捷。尤其是在微服务盛行的今天,了解RPC的原理过程是十分有必要的。今天我就来实现一个简单的RPC的功能。建立三个maven项目rpc-sever: 服务端,即服务的提供者rpc-client: 客户端,即服务的消费者rpc-c...

2019-02-02 15:47:23 927

原创 单例模式与线程安全

    单例模式,在设计模式中这是最为简单,也最容易理解的一种设计模式。它要求需要单例的类,在整个系统中,只能有唯一一个实例对象,这个对象被全局共享的。这个模式有哪些应用场景呢?比如说我们桌面的回收站,就是典型的单例模式,还有经常写web的小伙伴应该了解与数据库交互的DAO层也多是单例,spring默认注入的bean如果不特殊声明,默认也是单例实现,多线程的线程池设计一般也是采用单例模式。   ...

2019-01-20 14:41:01 184

原创 json反序列化无序问题

       之前工作时遇到这样一个问题,在对加密数据解密后,通过JSONObject.parseObject(jsonStr, Objcet.class)转成相应的Bean,在验签的时候,结果验签失败,签名与原始数据不匹配的问题。在处理这个问题,来回折腾了好一会儿。通过打印结果才知道,原来JSONObject在发序列化的过程中,发生了顺序错乱,这才导致了验签失败。解决办法很简单:    ...

2019-01-20 12:15:15 1110

原创 工作中经常使用的git命令

git现在作为一个主流的版本管理工具,掌握它的用法对于开发者来说十分有必要。这里我就总结一下,平时工作中常用的一些git命令。这里就不再说git的安装过程了,一般公司都是将代码放在gitLab上管理的,首先,我们需要从gitLab上来拉取我们的项目代码。这里我们需要先生成SSH密钥,将公钥添加到gitLab上,这样才能拉取代码。1.git生成ssh密钥在命令行中,输入ssh-keygen ...

2018-10-27 14:58:21 574

原创 synchronized关键字修饰方法案例解析

synchronized在java多线程编程中是一个常见的也是相对轻量级的关键字,能够保证执行操作的原子性,有序性,以及可靠性,从而保证了并发安全。这篇文章主要讲解synchronized修饰方法时,synchronized是如何保证线程的安全的。synchronized修饰普通方法时,两个线程对象能否同时调用呢?示例代码:public class MultiThread { p...

2018-09-29 17:23:29 510

原创 Zookeeper——初识ZAB协议

对于使用过Zookeeper的开发人员来说,都应该对ZAB协议有所耳闻。它是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议,全称是Zookeeper Atomic Broadcast(Zookeeper原子消息广播协议)。今天就介绍一下ZAB协议主要包括哪些内容,它是如何来实现来保证数据一致性的。ZAB协议主要包括两种基本的模式,消息广播和崩溃恢复。当整个服务框架在...

2018-08-13 15:15:45 217

原创 分布式一致性——二阶段提交协议,三阶段提交协议

分布式系统,这早已不是什么新鲜的东西了,在分布式系统的架构设计过程中,往往会存在分布式一致性的问题,经过前人的辛苦探究,提出了二阶段提交协议,三阶段提交协议,Paxos算法等等,用来解决分布式一致性的问题。今天我就讲一下,二阶段提交协议和三阶段提交协议的过程,以及它们的优缺点。2PC,就是二阶段提交协议。顾名思义,就是将事务的提交过程分成两个阶段来处理。那我们来看看这两个阶段分别做了什么。...

2018-08-06 11:30:53 6347

原创 不再迷惑的Java内存模型

一直以来,java内存模型都是让人很迷惑的东西,很多书籍,博客都有对它的相关介绍,很多人读完后,还是搞不清楚。而且这个东西和JVM的内存结构又很容易混淆,很多博客讲解内存模型都会当成JVM的内存结构去讲,甚至我身边有着好几年java工作经验的人,都搞不明白,说一些堆,虚拟机栈啥的。所以呢,今天就和读者一起来探究java内存模型到底是什么东西。这个模型是干嘛用的。一说到模型,我相信很多人脑海中就...

2018-07-29 15:54:59 167

原创 MyBatis源码解析——Mapper代理对象执行增删改查

从上篇,我们知道,mybatis获取的Mapper是一个代理对象,接下来我们就看看它是如何通过这个代理对象来执行增删改查操作的。下面是我的测试代码,还是一步步debug,.我们直接从userMapper.selectUserById(1)开始讲起。userMapper执行selectUserById(1)方法,接下来便进入MapperProxy.invoke()方法里,这是因为userMa...

2018-07-25 16:45:56 1011

原创 MyBatis源码解析——获取Mapper对象

之前两篇文章,已经讲述了SqlSessionFactory和SqlSession的获取过程,那么今天就一起来看一下SqlSession是如何得到Mapper的,从而执行相应的增删改查方法。这里还是以之前的代码为例,一步步debug的方式,去探究其中的过程。 首先,sqlSession调用getMapper(Class<?> type)方法,参数里传入指定的Class类型,返...

2018-07-24 12:26:04 4351

原创 MyBatis源码解析——获取SqlSession

上一篇讲解了SqlSessionFactory的获取过程,那接下来我们就来说一说如何从SqlSessionFactory中拿到SqlSession。还是写一个测试方法,一步步debug,跟踪源码,看看SqlSessionFactory到底做了什么。首先进入DefaultSqlSessionFactory中,调用它的openSession()方法,openSession()方法有很多重载,我们这...

2018-07-23 16:48:52 969

原创 MyBatis源码解析——获取SqlSessionFactory

我们都知道,在Mybatis中,对数据库的增删改查,实际上是由SqlSession来操作的,而SqlSession又是从SqlSessionFactory中得到的,那么问题来了,SqlSessonFactory是如何获得的呢?今天我们一起来解读一下Mybatis是如何加载配置文件,从而获取SqlSessionFactory的。首先,从Resources.getResourceAsReader(...

2018-07-20 17:16:14 3305 2

原创 mybatis传入参数为0被误认为是空字符串的解决方法

在mbatis中使用Xml配置sql语句时,出现了这样一个问题。当我传入的参数为0去做判断时,mybatis会把参数0当成是空字符串去判断而引起查询结果错误。下面是我之前配置的sql语句: =30 and bcr.overdue_days 90]]> 对于这个问题,有两种解决办法。1.当传入的参数有0时,只判断!=null即可。2.将0转化为S

2017-09-06 17:11:52 8664 3

空空如也

空空如也

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

TA关注的人

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