- 博客(51)
- 收藏
- 关注
原创 netty源码浅析(下篇)
今天来聊聊NioEventLoopNioEventLoop主要的组成有三部分1、selector2、Queue和threadSingleThreadEventExecutor(普通任务队列和线程):AbstractScheduledEventExecutor(定时任务队列):来看看它们的创建:selector的创建是在NioEventLoop的构造函数中NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorP
2021-08-07 10:28:25
381
原创 Netty源码浅析(上篇)
下面是netty的简化启动流程// 1、netty的NioEventLoopGroup 实现了下面这一操作(封装线程+selector+任务队列)Selector selector = Selector.open(); // 创建 NioServerSocketChannel,同时会初始化它关联的 handler,以及为原生 ssc 存储 configNioServerSocketChannel attachment = new NioServerSocketChannel();// 创建 N
2021-08-06 00:32:30
563
1
原创 netty学习之主要的组件
初识netty话不多说,直接从基础代码入手//服务端代码public class HelloServer { public static void main(String[] args) { // 1、启动netty服务器 new ServerBootstrap() // 2、创建 NioEventLoopGroup, Selector+线程+队列 .group(new NioEventLoopGr
2021-08-04 23:50:40
426
1
原创 Gateway篇(一)之Gateway配置
网关出现的背景微服务中,服务的粒度被细分,以往的一整大块服务可以被拆分成类似订单服务,支付服务等。拆分后的服务一般都是通过网络来进行通讯的,如果让客户端一个个来调用服务,未免过于复杂。这个时候大家可能会想到nginx来进行反向代理,不过nginx的配置稍有麻烦。于是乎Gateway就出现了,Gateway比nginx更加契合Spring Cloud系统。网关的作用网关是处于应用程序或服务之前的系统,用来管理授权、访问控制和流量限制等。通俗来讲就是对其他服务请求的集中管理,请求先到网关,再由网关请求到真
2021-03-07 22:08:37
5092
原创 nginx篇(一)之nginx做限流
限流算法一般有两种:令牌桶算法:思路:1、按照一定速率向令牌桶投送令牌。令牌桶满,则丢弃令牌 2、当请求过来时候,会经过一个过滤器,过滤器过滤的请求会经过令牌桶处理。3、请求只有拿到令牌才能被执行,拿不到令牌的请求被缓存 4、通过这种方式就能够控制请求的流量,令牌添加的速度就是请求流量的速度。漏桶算法:思路:请求先进入漏桶,漏桶以一定速率漏水,漏出的水会先处理,当水流远远大于漏桶漏水的速率,这个时候,水就会直接溢出。这里可以把请求当作水,这就是漏桶算法的大致思路。nginx中主要通过漏桶算法来做限
2021-03-07 21:59:29
832
原创 JWT和Spring Security的登录功能落地实现
服务端维护用户登录状态,一般有基于session和token两种方式一、传统的web项目用session+cookies机制来维护用户登录状态,当然有一定的不足:session是保持在服务端内存中的,也就是意味着用户下次请求必须还得在这台服务器上,才能拿到授权的资源,对于分布式系统来说是一个难以处理的点。随着认证用户的增加,服务端的开销也会增大。二、基于token的鉴权机制客户端拿账号密码请求服务端服务端校验账号密码,如果校验Ok的话,给客户端颁发token客户端拿到服务端颁发的toke
2020-12-28 21:00:15
401
原创 关于Spring Security的认证流程心得
最近用spring security框架来做认证授权工作,搞得头有点大了,借此机会,小结学习一番 spring security是一个安全访问控制框架,其工作是基于一系列的过滤器来实现的,这些过滤器是框架的核心,但是他们不直接处理用户的认证和授权,而是通过AuthenticationManager(认证管理器)和Acc
2020-12-11 21:22:03
227
原创 ZooKeeper概念与知识点详解
概念:ZooKeeper是一个为分布式应用提供协调服务的开源项目工作机制:从设计模式来讲,ZooKeeper是一个基于观察者模式,为分布式服务提供支持的框架。其本身用于存储和管理数据,可以接受观察者的注册,数据发生变化时候,ZooKeeper就会主动去通知这些观察者。特点:ZooKeeper的服务端是由一个领导者(leader)和多个跟随者(follower)所组成的集群,集群之间通过Zab(Zookeeper Atomic Broadcast)来保持数据的一致性ZooKeeper中有半数以
2020-11-30 20:05:31
300
原创 Spring boot中嵌入式Servlet容器的配置和启动原理
以下分析基于Springboot2.0以上版本,1.X版本跟2.0以上版本源码差异性较大嵌入式Servlet容器的自动配置原理流程如下:SpringBoot 根据的依赖信息(默认是tomcat),创建对应的WebServerFactoryCustomizer(定制器,用来定制一些属性,默认为tomcat 所以就是定制tomcat的一些属性);WebServerFactoryCustomizerBeanPostProcessor(web工厂定制器的后置处理器)获取所有类型为web服务工厂定制器的组件(
2020-11-23 14:49:44
437
1
原创 Springboot的错误处理机制
相信以下这个页面对大家来说并不陌生,当我们启动一个springboot应用的时候,如果在浏览器访问错误,springboot就会自动响应这个界面,如果不是在浏览器访问,比如在postman去访问,springboot响应回来的则是json数据,今天就来探究下springboot对错误的处理机制。浏览器响应:Postman响应:首先Springboot在启动的时候,会帮我们加载很多配置类,这其中也包括错误自动配置类,处理的大概流程如下:一但系统出现
2020-11-22 22:59:18
372
1
原创 spring boot的自动配置原理解析
Spring boot的自动配置 Springboo应用启动的时候,首先会先走主配置类,如下代码所示:@SpringBootApplication//这是Springboot的核心注解,也是一个混合注解。public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args
2020-11-22 16:06:04
169
原创 spring事务细节和事务传播解析
Spring事务的配置上述就是spring事务的一个简单配置,只要给方法上加上Transactional,就可以控制住这个方法,在方法出现异常的时候进行回滚操作,同时还可以设置一些参数,关于这些参数也在上图中标记出来了。下面主要是事务隔离级别和事务传播行为的介绍1、事务隔离级别:数据库事务并发的三大问题:脏读:事务1将变量a从1改成10 >>> 事务2读取到a的值为10 >>> 事务1出现异常,把a回滚成1 >>>事务2拿到的值a=10
2020-11-12 22:22:11
143
原创 单例设计模式的八种方式
//饿汉式(静态常量)class Singleton{ private Singleton{} private final static Singleton instance = new Singleton(); public static Singleton getInstance(){ return instance; }}//优点:类加载的时候就完成实例化,避免了线程同步的问题//不足:没有懒加载,如果实例没有用到,会造成内存浪费//饿汉式(静
2020-10-04 09:30:38
136
原创 设计模式的七大原则
设计模式最主要的目的就是解耦,低耦合,高内聚,扩展性,重用性,灵活性,这些都是设计模式努力的方向。重用性:相同功能的代码,可以复用可读性:代码结构清晰简洁,编程规范,便于其他程序员阅读与理解可扩展性:当需要增加新的功能的时候,非常方便可靠性:增加新功能后,对原来功能没有影响当然不是随随便便的模式都可以成为设计模式,设计模式也要遵守一定的设计原则。单一职责模式顾名思义,一个类应该只负责一项职责作用:降低类复杂度,一个类只负责一项职责,提高类的可读性和维护性接口隔离原则客户端不应该依赖于
2020-10-03 11:36:55
159
原创 ReentrantLock加锁与解锁源码解析
我们使用ReentrantLock的时候一般是如下用法public class MainActivity { public static void main(String[] args) { ReentrantLock lock = new ReentrantLock(); lock.lock(); try{ //逻辑代码 }finally { lock.unlock();
2020-09-18 22:28:09
221
原创 java中的垃圾收集器和内存分配策略
引用计数法概述:在对象中添加一个引用计数器,每当有一个地方引用它时候,计数器值就加1,当引用失效时候,计数器值就减一,任何计数器为0的对象就是不可能被使用了。引用计数器的缺点:当两个对象相互引用的时候,引用计数器就无法回收他们。可达性分析算法思路:通过一系列称为“GC Roots”的根节点作起始点集,从这些节点开始,根据引用向下搜索,搜索的过程称为引用链,如果某个对象到GC Roots间没有任何引用链相连,或者用图论来说就是GC Roots到这个对象不可达时候,则证明这个对象是不可再使.
2020-08-09 15:17:03
2161
原创 Https协议之握手流程(加密方式,从常见场景分析)
前提首先先假设一个场景:故事的主人公小A此时正通过自己手机浏览网站,当他只是看一些新闻类的时候,用Http协议是没有问题的,但是当他在网上购物(网站B)的时候,涉及到一些重要账号信息交互的时候,问题就来了。如果小A发送携带账号重要信息的网络包被有心之人拦截,事情就大发了。解决上述这种危险场景一般的思路就是加密,加密有两种方式:对称加密和非对称加密对称加密对称加密算法中,加密和解密所用的密钥是相同的,所以对称加密算法要保证安全性的话,密钥要做好保密,只能让小A和网站B知道。加密后的信息就算被有心之人拦
2020-07-24 23:48:29
2690
2
原创 【TCP】老生常谈的TCP的三次握手与四次挥手
前提提要TCP三次握手与四次挥手这都已经是老生常谈的话题了,基本上每个程序员都能对这个流程来上几句。但是大部分人只能说出一个大致的流程,少了一个比较完整的总结。于是乎有了这篇文章的出现。这篇文章是我自己学习的总结,如有不足,希望各路大佬能指出。TCP首部格式与重要字段解析想要知道这个流程,需从根源看起,了解TCP首部的一些字段,才不至于在看流程的时候对一些关键字眼云里雾里。序号(seq):大小为4个字节,其作用是标记数据字节的顺序。TCP把连接中所有发送的数据字节都标上序号。第1个字段的序号由本
2020-07-18 20:10:12
2006
原创 MySQL之突然执行变慢
为何会有这种情况?这种情况的发生,有可能是MySQL把内存中脏页的数据写入到磁盘中引起的。那么何为脏页?脏页的意思就是内存中的数据页跟磁盘中的数据页内容不一致,这内存中的页就被称为脏页。同理可得,如果内存中的数据页和磁盘中的数据页内容一致,就称为干净页。抖的原因这个可能就发生在把内存中脏页的数据更新到磁盘中数据页数据的过程。这个过程中涉及到redo log这个日志,关于这个redo log的相关文章可以看下这个Mysql角色与日志初体验更新脏页的过程在什么情况下会出现?第一种场景,redo
2020-07-05 13:24:27
2244
原创 MySQL中的“锁事”之全局锁、表级锁和行锁
直入正题,数据库中根据加锁的范围大致可以分为全局锁、表级锁和行锁三大类。全局锁:全局锁,从名字就能知道其含义,就是对整个数据库实例进行加锁,mysql中可以通过Flush tables with read lock(FTWRL)来对数据库加锁,使得数据库处于只读状态。应用场景:做全库逻辑备份应用。引发的问题:1、主库上备份,导致数据库在备份期间都只能做只读操作,不能做更新之类的其他操作,会使业务进入停摆。2、从库备份:备份期间从库不能执行从主库同步过来的binlog,导致主从延迟mysqldum
2020-07-03 22:37:25
1995
原创 MySQL之从MVCC角度来看事务隔离
起因提到事务,相信大家都很熟悉,毕竟这个是与数据库息息相关的。事务的四大特性:原子性,一致性,隔离性,持久性相信也早已深入人心。但是很多人都只是知道这个概念,怎么用(包括我)。恰逢今天学习了相关知识,就好好深入研究一下,特此做总结一篇。不同事务之间可能引发的问题以及隔离级别当多个事务在同时执行的时候,就有可能引发如下三个问题:脏读:一个事务读取另外一个事务还没有提交的数据叫脏读。幻读:幻读一般指的是一个事务在操作一片数据,这个时候另外一个事务插入另一条数据,这个时候第一个事务发现怎么自己刚操作的
2020-06-30 20:46:12
1978
原创 内含乾坤的ip addr指令
前文IP地址是唯一用来标识我们主机的地址,想要查看我们本地的ip相信大部分使用电脑的同学都知道,window上可以用ipconfig指令,linux上则可用ifconfig或者ip addr,下面是我从自己的linux上截取的1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:
2020-06-27 19:43:50
1687
原创 初识网络协议和网络分层
语言是一种工具,只有相同语言的人,才能在彼此之间进行交流。同理,协议就像一种规则,只有基于相同规则的事物,才能进行彼此之间的通信。今天所说的网络协议,亦不过如此。协议有三要素:语法:内容要符合规则和形式语义:内容能够代表某种意义顺序:先做什么,再做什么,这个顺序要有规范下面这个图片就是一个符合三要素的例子在这里插入代码片...
2020-06-26 21:53:13
1514
原创 你真的懂数据库的索引吗(下篇)
文章目录普通索引和唯一索引的选择===============================================普通索引和唯一索引的选择你真的懂数据库的索引吗(上篇)继上篇之后,今天来继续看看索引方面的知识。
2020-06-26 10:42:02
2699
原创 你真的懂数据库的索引吗(上篇)
文章目录前情提要索引之常见模型三巨头=========================================================================前情提要微语:慢下来,你才能走得更快。如今的我已经慢慢理解其中的道理了,好了废话不多说,直接进入主题。哈哈题目标题党了,其实我也是个学习的小白,这是学习记录,共勉 。索引,一个高大上的名词,通俗来说就是目录,通过它能快速定位到你查找的位置。索引之常见模型三巨头...
2020-06-25 14:46:21
3656
原创 Mysql角色与日志初体验(从查询更新入手)
文章目录Mysql三大角色客户端:服务端(核心功能):连接器查询缓存分析器优化器执行器存储引擎Mysql的查询流程redo log和binlogbinlog日志 和 redlog日志的差别更新语句的执行流程ps前提:当我们认知一个人的时候,首先要观察这个人的外在,再去深入了解这个人的内涵。对于我们认识学习mysql也是如此,要先明白它的各个角色组成(形象的比喻)。Mysql三大角色客户端:客户端主要用来发起对mysql请求 ,比如我们输入查询语句,连接mysql server(mysql -uro
2020-06-24 18:01:01
1103
原创 Springboot和spring data jpa报的entityManagerFactory和NullPointerException问题
使用较低版本的springboot的时候会报这个错误。2020-06-13 15:06:54.188 [main] ERROR o.s.boot.SpringApplication - Application run failedorg.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resourc
2020-06-13 15:09:37
1830
原创 Rabbitmq踩的坑以及一些总结记录
首先说说最近使用rabbitmq踩的坑,rabbitmq是基于erlang语言所写,所以下载使用rabbitmq的时候要先下载erlang 同时配置其环境变量。但是window系统下载rabbitmq和erlang耗时极其长,安装使用后,可能还会出现localhost:15672访问不了的情况,所以建议在VM虚拟机上使用centos7系统,安装docker,然后直接拉取rabbitmq镜像,几分钟就搞定了。接下来进入主题,首先摆出几个概念:RabbitMq首先是基于AMQP协议(高级消息队列协议),
2020-06-10 21:46:25
4070
3
原创 互斥锁,解决原子性问题以及加锁后引发的死锁
互斥锁,解决原子性问题以及加锁后引发的死锁原子性的问题就是线程切换。在单核时代,同一时刻只有一个线程工作,禁用CPU中断就能禁止线程切换。多核时代,同一时刻可能有多个线程在执行,禁用CPU中断并不能解决原子性问题。经过上述分析得出结论,同一时刻只有一个线程执行是解决原子性问题的必要条件,这个条件称之为互斥,保证共享变量的修改是互斥的,无论是单核还是多核,都可以保证其原子性。这里增加多一个概念:...
2020-05-01 08:18:07
519
原创 用户量都变大了,还不掌握一点解决并发编程三大问题的思路吗
掌握思路之前,需要先了解一个概念:JAVA内存模型:这是一种规范,通过定义多种规则对编译器和处理器进行限制,主要用来解决可见性和有序性问题。java内存模型所涉及到的关键字:锁、volatile字段、final修饰符与对象的安全发布。ps:内存模型的底层实现:通过内存屏障来禁止重排序。锁:锁是具备happens-before关系的,在解锁的时候,JVM会把缓存的内容刷新到内存上,保证修改的...
2020-04-25 20:43:23
296
原创 并发编程之三个主要问题(可见性,原子性,有序性)
可见性、原子性和有序性问题CPU、内存和IO设备随着时代发也在不断更新迭代,不过更新迭代的同时,他们之间的矛盾也一直存在,三者存在巨大的速度差异(CPU>内存>IO)。操作系统的整体性能就取决于它的·短板:IO读写,为此为了平衡他们之间的速度差异,操作系统和计算机体系也提供了许多对策来平衡他们之间的速度:1、增加CPU缓存,平衡CPU和内存的速度差异。2、操作系统增加了进程和线...
2020-04-18 12:03:51
259
原创 Maven更新失败,Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.1
Maven更新问题今天Maven在更新的时候发现一直更新不成功,总结下解决方法。在apache-maven-3.5.2/conf/setting.xml中加入以下配置即可解决 <!--解决依赖编译不过问题--> <mirror> <id>alimaven</id> <name>aliyun maven<...
2020-04-04 15:05:16
8483
1
原创 分析ThreadLocal
ThreadLocal之通俗易懂篇概念初步了解ThreadLocal源码初步了解ThreadLocalMap源码InheritableThreadLocal概念ThreadLocal字面上意思是线程本地,它的存在并不是为了来解决多线程环境的共享变量问题,而是来提供线程内部的存储空间。在多线程环境中,可以保证各个线程之间的变量相互隔离,互相独立。初步了解ThreadLocal源码在Threa...
2020-03-21 10:55:08
222
原创 Android四大组件-ContentProvider
tip:ContentProvider的onCreate要先于Application的onCreate来执行当我们启动一个Activity时候,首先会从ActivityThread的main方法开始,这是一个静态方法,在这个方法里面会创建IApplicationThread对象(Binder),并把它传给AMS,通过这个Binder,AMS就能调用ApplicaitonThread中的方法。根据...
2020-01-19 21:52:54
423
原创 Android四大组件-Boardcast
广播的注册分为两种:静态注册和动态注册,静态注册是指在AndroidMenifest.xml文件中注册,静态注册在应用安装的时候,系统会通过PMS来完成整个注册。动态注册则是通过代码来实现注册过程。动态注册广播的代码归根结底还是调用了contextImpl中的方法,代码路径如下:frameworks/base/core/java/android/app/ContextImpl.java接下来...
2020-01-19 21:09:33
3916
原创 Android四大组件-Service启动流程详解
Service的启动Service的启动包括两种,一种是startService、一种是bindService。一、先从简单看起:startService我们平常直接调用的startService,真正实现在ContextImpl.java中,代码路径为:frameworks/base/core/java/android/app/ContextImpl.java从上述代码中,可以得知直接调...
2020-01-19 20:35:07
972
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人