- 博客(176)
- 收藏
- 关注
原创 E-Job
一,Quartz-Misfire什么情况下错过触发?错过触发怎么办?线程池只有 5 个线程,当有 5 个任务都在执行的时候,第六个任务即将触发,这个时候任务就不能得到执行。在 quartz.properties 有一个属性 misfireThreshold,用来定义触发器超时的"临界值",也就是超过了这个时间,就算错过触发了。例如,如果 misfireThreshold 是 60000(60 秒),9 点整应该执行的任务,9 点零1 分还没有可用线程执行它,就会超时(misfires)。下面这些原因
2021-03-30 21:44:51
2264
原创 JVM之类的加载与类加载器
一,类的加载过程详解1,概述在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。(接口,注解,枚举类,类的加载都统称为类的加载)按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:其中,验证、准备、解析3个部分统称为链接(Linking)从程序中类的使用过程看:2,Loading1)加载完成的操作加载的理解所谓加载,简而言之就是将 Java 类的字节码文件加载到
2021-03-26 01:28:53
425
原创 JVM性能监控及调优篇
一,概述1,背景说明1)生产环境中的问题生产环境发生了内存溢出该如何处理生产环境应该给服务器分配多少内存合适?如何对垃圾回收器的性能进行调优?生产环境CPU负载飙高该如何处理?生产环境应该给应用分配多少线程合适?不加log,如何确定请求是否执行了某一行代码?不加log,如何实时查看某个方法的入参与返回值?2)为什么要调优防止出现OOM 解决OOM 减少Full GC 出现的频率3)不同阶段的思考上线前 项目运行中 线上OOM2,调优概述1)监控
2021-03-22 13:23:15
1129
1
原创 JVM内存与垃圾回收篇
一,JVM与Java体系结构1,虚拟机与java虚拟机概述1)虚拟机所谓虚拟机就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。Visual Box ,VMware就属于系统虚拟机,他们完全是对物理计算机的仿真,提供了一个可以运行完整操作系统的软件平台。程序虚拟机的典型代表是Java虚拟机,他专门为了执行单个计算机程序而设计,在java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限
2021-03-19 03:58:55
489
原创 Quartz
一,任务调度概述1,什么 时候需要任务调度1)任务调度的背景在业务系统中有很多这样的场景:1、账单日或者还款日上午 10 点,给每个信用卡客户发送账单通知,还款通知。如何判断客户的账单日、还款日,完成通知的发送?2、银行业务系统,夜间要完成跑批的一系列流程,清理数据,下载文件,解析文件,对账清算、切换结算日期等等。如何触发一系列流程的执行?3、金融机构跟人民银行二代支付系统对接,人民银行要求低于 5W 的金额(小额支付)半个小时打一次包发送,以缓解并发压力。所以,银行的跨行转账分成了多个流程:录
2021-03-11 23:33:44
759
原创 分布式事务
一,基础概念1,什么是事务?什么是事务?举个生活中的例子:你去小卖铺买东西,“一手交钱,一手交货”就是一个事务的例子,交钱和交货必须全部成功,事务才算成功,任一个活动失败,事务将撤销所有已成功的活动。明白上述例子,再来看事务的定义:事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。2,本地事务在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的,因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个
2021-03-10 20:35:46
246
2
原创 Gateway核心源码分析
1,源码入口org.springframework.boot.autoconfigure.EnableAutoConfiguration=GatewayAutoConfiguration@AutoConfigureAfter({GatewayLoadBalancerClientAutoConfiguration.class, GatewayClassPathWarningAutoConfiguration.class})public class GatewayAutoConfiguration {
2021-03-09 22:41:22
603
原创 Feign源码分析
1,定位抓手@EnableFeignClients@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients {}2,导入组件他往容器中导入了一个组件 FeignClientsRegistrarpublic void registerBeanDefinitio
2021-03-09 11:10:10
164
1
原创 Ribbon源码分析
1,调用流程2,加载配置在spring.factories文件下好到ribbon的自动配置类 RibbonAutoConfiguration@AutoConfigureBefore({LoadBalancerAutoConfiguration.class, AsyncLoadBalancerAutoConfiguration.class})public class RibbonAutoConfiguration { @Bean @ConditionalOnMissingBean({
2021-03-09 00:59:34
204
原创 sentinel源码
一,限流的基本认识限流虽然能够保护系统不被压垮,但是对于被限流的用户,就会很不开心。所以限流其实是一种有损的解决方案。但是相比于全部不可用,有损服务是最好的一种解决办法。限流的作用限流的设计还能防止恶意请求流量、恶意攻击限流的基本原理是通过对并发访问/请求进行限速或者一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或者告知资源没有了)、排队或等待(秒杀、下单)、降级(返回兜底数据或默认数据或默认数据,如商品详情页库存默认有货)常见的限流有:限制总并发数(如数据库
2021-03-07 21:59:49
605
原创 nacos集群选举问题
nacos集群选举问题Nacos支持集群模式nacos的集群类似于zookeeper, 它分为leader角色和follower角色, 那么从这个角色的名字可以看出来,这个集群存在选举的机制。 因为如果自己不具备选举功能,角色的命名可能就是master/slave了。选举算法Nacos集群采用raft算法来实现,它是相对zookeeper的选举算法较为简单的一种。选举算法的核心在 RaftCore 中,包括数据的处理和数据同步raft算法演示地址在Raft中,节点有三种角色:Leader:负
2021-03-07 09:40:38
2126
原创 nacos源码分析
一,nacos核心功能点服务注册: Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元 数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一-次心跳。服务同步: Nacos Server集群之间会互相同步服务实例,用来保证服
2021-03-06 21:39:59
2171
3
原创 6-zookeeper源码之watcher源码分析
一,Watcher 的基本流程ZooKeeper 的 Watcher 机制,总的来说可以分为三个过程:客户端注册 Watcher、服务器处理 Watcher 和客户端回调 Watcher客户端注册 watcher 有 3 种方式,getData、exists、getChildren;以如下代码为例1,基于 zkclient 客户端发起一个数据操作 <dependency> <groupId>com.101tec</groupId> <art
2021-03-05 17:51:55
398
原创 5-zookeeper原理之leader选举源码分析
一,Zookeeper的一致性1,Zookeeper的来源zookeeper 的来源,是来自于 google chubby。为了解决在分布式环境下,如何从多个 server 中选举出 master server。那么这多个 server 就需要涉及到一致性问题,这个一致性体现的是多个server 就 master 这个投票在分布式环境下达成一致性。简单来说就是最终听谁的。但是在网络环境中由于网络的不可靠性,会存在消息丢失和或者被篡改等问题。所以如何在这样一个环境中快速并且正确的在多个server 中对某
2021-03-05 00:59:49
627
1
原创 4-zookeeper核心原理
一,使用 Zookeeper 实现 leader 选举在分布式计算中,leader election 是很重要的一个功能,这个选举过程是这样子的:指派一个进程作为组织者,将任务分发给各节点。在任务开始前,哪个节点都不知道谁是 leader 或者 coordinator。当选举算法开始执行后,每个节点最终会得到一个唯一的节点作为任务 leader。除此之外,选举还经常会发生在 leader 意外宕机的情况下,新的 leader 要被选举出来。Curator 有两种选举 recipe(Leader Latc
2021-03-04 12:33:58
152
1
原创 3-基于Curator 实现分布式锁源码分析
一,基于 Curator 实现分布式锁1,分布式锁的基本场景如果在多线程并行情况下去访问某一个共享资源,比如说共享变量,那么势必会造成线程安全问题。那么我们可以用很多种方法来解决,比如 synchronized、 比如 Lock 之类的锁操作来解决线程安全问题,那么在分布式架构下,涉及到多个进程访问某一个共享资源的情况,这个时候我们需要一些互斥手段来防止彼此之间的干扰。然后在分布式情况下,synchronized 或者 Lock 之类的锁只能控制单一进程的资源访问,在多进程架构下,这些 api就没办法
2021-03-04 11:32:12
287
2
原创 2-zookeeper应用实战
一,zookeeper的名词复盘1,集群角色2,数据模型zookeeper 的视图结构和标准的文件系统非常类似,每一个节点称之为 ZNode, 是 zookeeper 的最小单元。每个 znode上都可以保存数据以及挂载子节点。构成一个层次化的树形结构。持久节点 PERSISTENT创建后会一直存在 zookeeper 服务器上,直到主动删除持久有序节点 PERSISTENT_SEQUENTIAL每个节点都会为它的一级子节点维护一个顺序临时节点 EPHEMERAL临时节点的生命周期和客户
2021-03-03 22:47:38
225
1
原创 1-微服务架构下的服务注册中心设计
一,单体架构到微服务架构的带来的变化1,单体架构2,分布式架构假设一个电商的下单场景,完成一笔订单入库,需要做几个操作创建订单卡券抵扣库存扣减那么在分布式架构下的调用链,可能是下面这种情况。那么服务和服务之间势必会存在远程通信。二,SpringBoot+RestTemplate1,创建两个服务创建两个 spring-boot 工程订单服务(order-service)库存服务(repo-service)2,分别创建Controller1)OrderController@
2021-03-03 16:07:08
486
1
原创 微服务的演进
一,从单体架构到微服务1,单体架构对于一个刚刚起步的项目,会选择最简单最快速的方式来实现。而单体架构是最好的选择,目前很多的传统软件行业仍然采用这类的架构。一般的实施方案是,把所有的功能模块都打包在一个(jar、war),并且部署在一个 web 容器下,比如 tomcat、weblogic、jboss 中运行2,集群架构一旦用户量以及流量开始增加,服务器的性能就会遇到瓶颈,这个时候必须要对系统架构做调整以及优化。而在这个阶段主要需要解决的问题是提升业务系统的并行处理能力,降低单机系统负载,以便支
2021-03-03 13:15:52
365
原创 手写Tomcat
1,分析1,首先要有一个类似web.xml的文件来注册Servlet2,要有一个BaseServlet3,request和response实际上就是输入输出流4,容器启动需要加载配置文件,保存路径和servlet的映射信息5,利用死循环,socket接收请求,处理请求2,BIO版本1)BaseServletpublic abstract class BaseServlet { public void service(MyRequest request, MyResponse
2021-03-02 23:18:06
274
1
原创 基于Netty重构RPC框架
1,RPC概述它描述了每一种架构需要的具体配置和组织形态。当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本,我们通常会采用单一应用架构。之后出现了 ORM 框架,主要用于简化增删改查工作流的,数据访问框架 ORM 是关键。随着用户量增加,当访问量逐渐增大,单一应用增加机器,带来的加速度越来越小 ,我们需要将应用拆分成互不干扰的几个应用,以提升效率,于是就出现了垂直应用架构。MVC 架构就是一种非常经典的用于加速前端页面开发的架构。当垂直应用越来越多,应用之间交互不可避免,
2021-03-02 14:37:29
218
原创 BIO&NIO&AIO
一,前置知识1,阻塞和非阻塞阻塞和非阻塞是进程在访问数据的时候,数据是否准备就绪的一种处理方式,当数据没有准备的时候。阻塞:往往需要等待缓冲区中的数据准备好过后才处理其他的事情,否则一直等待在那里。非阻塞:当我们的进程访问我们的数据缓冲区的时候,如果数据没有准备好则直接返回,不会等待。如果数据已经准备好,也直接返回。2,同步和异步同步和异步都是基于应用程序和操作系统处理 IO 事件所采用的方式。同步:是应用程序要直接参与 IO 读写的操作。异步:所有的 IO 读写交给操作系统去处理,应用程序
2021-03-02 10:10:43
270
1
原创 RPC远程调用原理
1,远程调用RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。为什么要用RPC呢?就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯,由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用。RPC就是要像调用本地的函数一样去调远程函数。2,本地调用假设我们要调用函数Multiply
2021-03-01 18:15:01
1707
原创 序列化与反序列化原理
一,Java 领域的对象如何传输1,基于 socket 进行对象传输User@Datapublic class User { private String name;}SocketServerProviderpublic class SocketServerProvider { public static void main(String[] args)throws IOException { ServerSocket ss=null;
2021-03-01 11:14:11
515
原创 Http通信协议
应用层是 OSI 七层网络模型的第七层,不同类型的网络应用有不同的通信规则,因此应用层协议是多种多样的,比如 DNS、FTP、Telnet、SMTP、HTTP、 等协议都是用于解决其各自的一类问题。一,Http通信协议的基本原理http 协议在远程通信场景中的应用还是挺广泛的,包括现在主流的微服务架构的通信都是基于 http 协议。1,一次http请求的通信流程我们在浏览器上输入一个网址后,浏览器是如何展示目标网址的内容的?内容是从哪里来的呢?DNS: (Domain Name System)服
2021-03-01 00:55:20
3469
原创 InnoDB存储引擎中的锁
一,InnoDB中的锁1,锁的类型InnoDB存储引擎实现了以下两种标准的行级锁:共享锁,允许事务读一行数据。排它锁,允许事务删除或更新一条数据。如果一个事务t1已经获得了行r的共享锁,那么另外的事物T2可以立即获得行r的共享锁,因为读取并没有改变行R的数据,称这种情况为锁兼容。但若有其他事物想要获取行r的排它锁,则其必须等待事务t1,t2释放行r上的共享锁,这种情况称为锁不兼容。XSX不兼容不兼容S不兼容兼容X锁与任何锁都不兼容,而S锁仅仅与S锁兼容
2021-02-27 15:38:22
553
2
原创 MySQL入门
一,MYSQL入门1.数据库相关概念DB:数据库:存储数据的仓库,保存了一系列有组织的数据。DBMS:数据库管理系统:数据库是通过DBMS创建和操作的容器。SQL:结构化查询语言:专门用来与数据库通信的语言。2.数据库的好处1.可以持久化数据到本地2.可以实现结构化查询,方便管理3.数据库存储数据特点1.将数据放到表中,表放到库中。2.一个数据库有多张表,每个表都有一个名字,用来标识自己。表名具有唯一性。3.表具有一些特性,这些特性定义了数据在表中如何存储,类似Java中类的设计
2021-02-26 21:50:42
816
原创 高性能MySQL调优实战
一,数据库应该如何优化数据库优化有很多层面。1,SQL与索引因为 SQL 语句是在我们的应用端编写的,所以第一步,我们可以在程序中对 SQL 语句进行优化,最终的目标是用到索引。这个是容易的也是最常用的优化手段。2,表与存储引擎数据是存放在表里面的,表又是以不同的格式存放在存储引擎中的,所以我们可以选用特定的存储引擎,或者对表进行分区,对表结构进行拆分或者冗余处理,或者对表结构比如字段的定义进行优化。3,架构对于数据库的服务,我们可以对它的架构进行优化。如果只有一台数据库的服务器,我们可以运
2021-02-26 21:27:04
2397
原创 MySQL索引优化
一,索引是什么1.索引是什么?1)索引图解数据库索引,是数据库管理系统(DBMS)中一个排序的数据结构,以协助快速查询、更新数据库表中数据。首先数据是以文件的形式存放在磁盘上面的,每一行数据都有它的磁盘地址。如果没有索引的话,要从 500 万行数据里面检索一条数据,只能依次遍历这张表的全部数据,直到找到这条数据。但是有了索引之后,只需要在索引里面去检索这条数据就行了,因为它是一种特殊的专门用来快速检索的数据结构,我们找到数据存放的磁盘地址以后,就可以拿到数据了。2)索引类型创建一个索引第
2021-02-25 11:49:49
359
原创 MySQL结构与sql执行流程
一,一条查询SQL语句是如何执行的程序或者工具要操作数据库,第一步要做什么事情?跟数据库建立连接。1,通信协议首先,MySQL 必须要运行一个服务,监听默认的 3306 端口。在开发系统跟第三方对接的时候,必须要弄清楚的有两件事。第一个就是通信协议,比如我们是用 HTTP 还是 WebService 还是 TCP?第二个是消息格式,比如我们用 XML 格式,还是 JSON 格式,还是定长格式?报文头长度多少,包含什么内容,每个字段的详细含义。1)通信协议MySQL 是支持多种通信协议的,可
2021-02-22 22:48:59
464
2
原创 11-线程池原理分析
一,线程池的基本使用1,线程池的介绍线程复用,控制最大并发数,管理线程。优点:提高响应速度,避免每次都去创建线程。便于管理,降低资源消耗。2,常用的线程池1.Executors.newFixedThreadPool();执行长期任务性能好,创建一个线程池,一池有N个固定的线程,有固定的线程数的线程2.Executors.newSingleThreadExecutor();一个任务一个任务的执行,一池一线程3.Executors.newCachedThreadPool();执行很多短期异
2021-02-19 21:29:33
422
原创 15-读写锁底层原理
一,线程间通信1.两个线程交替打印题目:i=0,a:i++,b:i--,交替打印10次1)使用synchronizedpublic class JUCNote3 { /** * i=0 * a:i++ * b:i- * 交替10次 */ public static void main(String[] args) { Share share = new Share(); new Thread(() -
2021-02-17 20:19:36
794
原创 1-并发编程的基本认识
一,并发的发展历史真空管和穿孔打卡操作员在机房里面来回调度资源,以及计算机同一个时刻只能运行一个程序,在程序输入的过程中,计算机的计算和处理空闲状态 。而当时的计算机是非常昂贵的,人们为了减少这种资源的浪费。就采用了 批处理系统来解决。晶体管和批处理系统批处理操作系统虽然能够解决计算机的空闲问题,但是当某一个作业因为等待磁盘或者其他 I/O 操作而暂停时,那CPU 就只能阻塞直到该 I/O 完成,对于 CPU 操作密集型的程序,I/O 操作相对较少,因此浪费的时间也很少。但是对于 I/O 操作较多的
2021-02-17 19:29:02
260
原创 12-ThreadLocal源码分析
一,ThreadLocal的基本使用与原理为线程创建独一份的副本数据。1,基本使用/** * @author yhd * @createtime 2021/2/17 11:31 */public class TheadLocalDemo { private static final AtomicInteger nextId = new AtomicInteger(0); private static final ThreadLocal<Integer> thre
2021-02-17 14:20:11
174
原创 10-concurrentHashMap
一,ConcurrentHashMap 的初步使用及场景1,CHM 的使用ConcurrentHashMap 是 J.U.C 包里面提供的一个线程安全并且高效的 HashMap,所以ConcurrentHashMap 在并发编程的场景中使用的频率比较高。ConcurrentHashMap 是 Map 的派生类,所以 api 基本和 Hashmap 是类似,主要就是 put、get 这些方法,接下来基于 ConcurrentHashMap 的 put 和 get 这两个方法作为切入点来分析 Concu
2021-02-16 13:08:44
268
原创 9-阻塞队列&原子操作的原理分析
把多线程环境比作是分布式的话,那么线程与线程之间是不是也可以使用这种消息队列的方式进行数据通信和解耦呢?一,阻塞队列的使用案例1,注册成功后增加积分假如模拟一个场景,就是用户注册的时候,在注册成功以后发放积分。这个场景在一般来说,会这么去实现:但是实际上,我们需要考虑两个问题:1,性能,在注册这个环节里面,假如添加用户需要花费 1 秒钟,增加积分需要花费 1 秒钟,那么整个注册结果的返回就可能需要大于 2 秒,虽然影响不是很大,但是在量比较大的时候,我们也需要做一些优化。2,耦合,添加用户和增
2021-02-16 02:15:45
364
1
原创 8-并发工具的使用及原理
一,ConditionCondition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。1,Condition 的基本使用1)ConditionWaitpublic class ConditionDemoWait implements Runnable { private Lock lock; private Condition condition; public ConditionDemoWait
2021-02-15 21:46:37
218
1
原创 7-ReentrantLock底层原理分析
一,LockLock 在 J.U.C 中是最核心的组件。1,Lock实现Lock 本质上是一个接口,它定义了释放锁和获得锁的抽象方法,定义成接口就意味着它定义了锁的一个标准规范,也同时意味着锁的不同实现。实现 Lock 接口的类有很多,以下为几个常见的锁实现。ReentrantLock:表示重入锁,它是唯一一个实现了 Lock 接口的类。重入锁指的是线程在获得锁之后,再次获取该锁不需要阻塞,而是直接关联一次计数器增加重入次数。ReentrantReadWriteLock:重入读写锁,它实现了 Re
2021-02-15 17:33:43
7188
3
原创 3-volatile&JMM
一,初步认识 Volatile1,一段代码引发的思考下面这段代码,演示了一个使用 volatile 以及没使用volatile 这个关键字,对于变量更新的影响public class VolatileTest { public volatile static boolean stop = false; public static void main(String[] args)throws InterruptedException { Thread thread =
2021-02-15 11:17:51
254
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅