自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(142)
  • 资源 (1)
  • 收藏
  • 关注

原创 Netty学习——EventLoop

EventLoopNetty 高性能的奥秘在于其 Reactor 线程模型。 EventLoop 是 Netty Reactor 线程模型的核心处理引擎,那么它是如何高效地实现事件循环和任务处理机制的呢?Reactor 线程模型关于Reactor线程模型前面已经学习过了,分成单线程模型、多线程模型、主从多线程模型。我们再看下Reactor 线程模型运行机制的四个步骤,分别为连接注册、事件轮询、事件分发、任务处理,如下图所示。连接注册:Channel 建立后,注册至 Reactor 线程中的

2021-03-03 16:26:39 2788

原创 Netty学习——客户端和服务端的启动入门

简单的 HTTP 服务器HTTP 服务器是我们平时最常用的工具之一。同传统 Web 容器 Tomcat、Jetty 一样,Netty 也可以方便地开发一个 HTTP 服务器。这里我们只实现最基本的请求-响应的流程:搭建 HTTP 服务器,配置相关参数并启动。从浏览器或者终端发起 HTTP 请求。成功得到服务端的响应结果。Netty 的模块化设计非常优雅,客户端或者服务端的启动方式基本是固定的。作为开发者来说,只要照葫芦画瓢即可轻松上手。大多数场景下,你只需要实现与业务逻辑相关的一系列 Chan

2021-03-01 14:59:09 402

原创 Netty学习——整体架构

Netty 整体结构Netty 是一个设计非常用心的网络基础组件,Netty 官网给出了有关 Netty 的整体功能模块结构,却没有其他更多的解释。从图中,我们可以清晰地看出 Netty 结构一共分为三个模块:Core 核心层Core 核心层是 Netty 最精华的内容,它提供了底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信 API、支持零拷贝的 ByteBuf 等。Protocol Support 协议支持层协议支持层基本上覆盖了主流协议的编解码实现,如 HTTP、SSL、Pr

2021-02-25 21:07:47 477

原创 Netty学习——知识铺垫

I/O 模型实现高性能的网络应用框架离不开 I/O 模型问题,在了解 Netty 高性能原理之前我们需要先储备 I/O 模型的基本知识。I/O 请求可以分为两个阶段,分别为调用阶段和执行阶段。第一个阶段为I/O 调用阶段,即用户进程向内核发起系统调用。第二个阶段为I/O 执行阶段。此时,内核等待 I/O 请求处理完成返回。该阶段分为两个过程:首先等待数据就绪,并写入内核缓冲区;随后将内核缓冲区数据拷贝至用户态缓冲区。接下来我们来回顾一下 Linux 的 5 种主要 I/O 模式,并看下各种

2021-02-24 11:09:04 286

原创 Disruptor

Disruptor Quick Start我们先写一个hello world 程序。要实现Disruptor需要四步:建立一个工厂Event类,用于创建Event类实例对象。需要有一个监听事件类,用于处理数据(Event类)。实例化Disruptor实例,配置一系列参数,编写Disruptor核心组件。编写生产者组件,向Disruptor容器中去投递数据。首先我们创建Event类。public class OrderEvent { private long value;

2020-11-25 16:31:26 389

原创 HTTPS原理

HTTPS原理大家可能都听说过 HTTPS 协议之所以是安全的是因为 HTTPS 协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但其实,HTTPS 在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。HTTPS的整体过程分为证书验证和数据传输阶段,具体的交互过程如下:① 证书验证阶段浏览器发起 HTTPS 请求服务端返回 HTTPS 证书客户端验证证书是否合法,如果不合法则提示告警② 数据传输阶段当证书验证合法后,在本地生成随机数通

2020-07-07 18:58:03 156

原创 TCP的三次握手和四次挥手

传输控制协议TCP面向连接的、可靠的、基于字节流的传输层通信协议。将应用层的数据流分割成报文段并发送给目标节点的TCP层。数据包都有序号,对方收到则发送ACK确认,未收到则重传。使用检验和来检验数据在传输过程中是否有误。三次握手第一次握手:客户端发送请求报文将 SYN=1 同步序列号和初始化 seq=x发送给服务端,服务端从初始化状态,创建连接,等待客户端,确认接收后的状态为SYN_Receive。这个时候客户端处于等待状态为SYN_Send。第二次握手,服务器接收到报文后(SYN=1,

2020-07-07 10:20:00 175

原创 Nacos学习(一) —— Nacos配置管理实战

Nacos简介Nacos是阿里巴巴集团开发的一款开源平台,用于配置/服务发现/服务管理,Nacos可以帮助我们很容易的构建云本机应用程序和微服务架构。Nacos基本上支持现在所有类型的服务,比如说GRPC/Dubbo服务/SpringCloud Restful服务/Kubernetes服务。作为微服务开发人员都应该知道的,Eureka作为服务注册中心,总考虑到Eureka的闭源问题,Nacos的出现,程序员们就可以把服务注册中心改为Nacos了。Nacos配置中心-QuickStart首先增加依赖。

2020-07-02 11:01:27 405

原创 Sentinel学习(八) —— 规则持久化

规则持久化分成两种方式:拉模式和推模式。拉模式原理简述FileRefreshableDataSource 定时从指定文件中读取规则JSON文件【图中的本地文件】,如果发现文件发生变化,就更新规则缓存。FileWritableDataSource 接收控制台规则推送,并根据配置,修改规则JSON文件【图中的本地文件】。功能实现加依赖<dependency> <groupId>com.alibaba.csp</groupId> <ar.

2020-06-29 11:48:30 361

原创 JWT

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。JWT的构成JWT是由三段信息构成的,将这三段信息文本用.链接一起就构成了Jwt字符串。就像这样.

2020-06-23 10:37:09 170

转载 Sentinel学习(六) —— 控制台和客户端通信原理

控制台控制台主要的处理类是 FlowControllerV1 。@RestController@RequestMapping(value = "/v1/flow")public class FlowControllerV1 { private final Logger logger = LoggerFactory.getLogger(FlowControllerV1.class); @Autowired private InMemoryRuleRepositoryAdap

2020-06-12 18:45:59 1507 1

转载 Sentinel学习(四) —— 滑动窗口

化整为零我们已经知道了Slot是从第一个往后一直传递到最后一个的,且当信息传递到StatisticSlot时,这里就开始进行统计了,统计的结果又会被后续的Slot所采用,作为规则校验的依据。我们先来看一段非常熟悉的代码,就是StatisticSlot中的entry方法:@Overridepublic void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count, Object... ar

2020-06-11 11:53:29 301

转载 Sentinel学习(三) —— 限流原理分析

项目结构将Sentinel的源码fork到自己的github库中,接着把源码clone到本地,然后开始源码阅读之旅吧。首先我们看一下Sentinel项目的整个结构:sentinel-core 核心模块,限流、降级、系统保护等都在这里实现sentinel-dashboard 控制台模块,可以对连接上的sentinel客户端实现可视化的管理sentinel-transport 传输模块,提供了基本的监控服务端和客户端的API接口,以及一些基于不同库的实现sentinel-extension 扩展

2020-06-11 11:08:56 1273

原创 Apollo —— OpenAPI调用

引入依赖需要引入两个依赖 1、集成apollo的依赖。2、调用apollo修改数据的openAPI的依赖。 <!-- https://mvnrepository.com/artifact/com.ctrip.framework.apollo/apollo-client --> <dependency> <groupId>com.ctrip.framework.apollo</groupId>

2020-06-01 18:25:31 4185

原创 Sentinel学习(七) —— API、注解、整合Feign

Sentinel API这里介绍三个重要的API。ContextUtilTracerSphU @GetMapping("/test-sentinel-api") public String testSentinelApi(@RequestParam(required = false) String a) { //定义一个sentinel受保护的资源,名称是test-sentinel-api String resourceName = "test-s

2020-05-27 18:13:39 419

原创 Sentinel学习(五) —— 控制台使用和源码

通过 sentinel 的控制台,我们可以对规则进行查询和修改,也可以查看到实时监控,机器列表等信息,所以我们需要对 sentinel 的控制台做个完整的了解。启动控制台从github上下载源码后,启动sentinel-dashboard模块。默认地址是8080。用户名和密码配置到了application.properties中,可以自行修改,默认用户名和密码都是 sentinel。可以看到当前控制台中没有任何的应用,因为还没有应用接入。接入控制台要想在控制台中操作我们的应用,除了需要部署一个控

2020-05-26 15:26:08 964

转载 Sentinel学习(二) —— 重要概念

Sentinel 中有很多比较重要的概念,我们要了解一个框架,首先要对框架中重要的概念实体进行分析,本文我将跟大家一起来分析一下 Sentinel 中非常重要的几个概念。ResourceResource 是 Sentinel 中最重要的一个概念, Sentinel 通过资源来保护具体的业务代码或其他后方服务。 Sentinel 把复杂的逻辑给屏蔽掉了,用户只需要为受保护的代码或服务定义一个资源,然后定义规则就可以了,剩下的通通交给 Sentinel 来处理了。并且资源和规则是解耦的,规则甚至可以在运行时

2020-05-26 10:59:39 423

转载 Sentinel学习(一) —— 快速实现限流

Sentinel简介Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。Sentinel 具有以下特征:丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台

2020-05-25 17:11:57 455

原创 Spring StateMachine学习(五) —— 持久化

实际的企业应用中状态机的流程会更加复杂,而我们最常用到的就是choice。它类似于java的if语句,作为条件判断的分支而存在,让我们先看一张图:这张图表现的是一个表单(form)的整个状态流程:创建初始的空白表单( BLANK_FORM)填写(WRITE)表单,成为填充完表单(FULL_FORM)检查(CHEKC)表单如果是表单名(formName)不为null,表单成为待提交表...

2020-04-16 23:27:00 1180

原创 Spring StateMachine学习(四) —— 持久化

在实际业务中,状态机可能需要在某个环节停留,等待其他业务的触发,然后再继续下面的流程。比如订单,可能在支付环节需要等待一个剁手的用户隔天再下单,所以这里面涉及到一个创建的状态机该何去何从的问题。在spring statemachine中,给出来的办法就是保存起来,到需要的时候取出来用。持久化到本地内存首先要实现StateMachinePersist接口,这个接口非常简单,就是write和rea...

2020-04-16 22:34:21 3856 1

原创 Spring StateMachine学习(三) —— 传递参数

在企业开发中,数据在不同的业务间传输是最常见的工作,所以虽然我们的主架构是用的状态机,也就是从流程状态的角度来看待这个项目,但在具体业务中,每个状态的转变中会牵涉到各类业务,这些业务有些需要收到状态机变化的通知,需要把状态值传递给业务类和业务方法,同样的,在处理状态变化是,也需要获取业务数据,方便不同的业务在同一个状态变化环节做各自的业务,下面我们就讲下这个数据在spring statemachi...

2020-04-15 02:13:02 1543 1

原创 Spring StateMachine学习(二) —— 多个状态机

在实际的企业应用中,基本不可能只有一个状态机流程在跑,比如订单,肯定是很多个订单在运行,每个订单都有自己的订单状态机流程。我们就需要在每次使用时创建一个新的状态机。创建多个状态机通过 RefundReasonMachineBuilder 创建多个状态机。@Slf4j@Componentpublic class RefundReasonMachineBuilder { pub...

2020-04-15 01:53:58 2085

原创 Spring StateMachine学习(一) ——快速开始

有限状态机(Finite-state machine)有限状态机(英语:finite-state machine,缩写:FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。应用FSM模型可以帮助对象生命周期的状态的顺序以及导致状态变化的事件进行管理。将状态和事件控制从不同的业务Service方法的if else中抽离出来。FSM的应用范围很广,对于有复杂状态流,...

2020-04-14 03:50:59 1708 1

原创 MyBatis Plus主键设置策略

主键策略的几种类型public enum IdType { /** * 数据库ID自增 */ AUTO(0), /** * 该类型为未设置主键类型 */ NONE(1), /** * 用户输入ID * <p>该类型可以通过自己注册自动填充插件进行填充</p> */...

2020-04-10 16:52:32 2828

原创 Mybatis分页插件——PageHelper使用

Spring boot 整合 PageHelper 本文介绍了如何再使用PageHelper和PageHelper的原理。通过学习PageHelper的源码来实现我们自己的Mybatis的插件。pom.xml引入mybatis、druid和PageHelper&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;project xm...

2020-04-09 02:15:02 193

转载 Guava学习(四)-重试

重试的使用场景在很多业务场景中,为了排除系统中的各种不稳定因素,以及逻辑上的错误,并最大概率保证获得预期的结果,重试机制都是必不可少的。尤其是调用远程服务,在高并发场景下,很可能因为服务器响应延迟或者网络原因,造成我们得不到想要的结果,或者根本得不到响应。这个时候,一个优雅的重试调用机制,可以让我们更大概率保证得到预期的响应。通常情况下,我们会通过定时任务进行重试。例如某次操作失败,则记录...

2020-04-09 02:01:28 679

原创 RabbitMQ面试题

如何确保消息正确地发送至RabbitMQ?RabbitMQ使用发送方确认模式,确保消息正确地发送到RabbitMQ。发送方确认模式:将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一ID)。如果RabbitMQ发生内部错误从而导致消息...

2020-03-20 00:07:39 193

原创 RabbitMQ 学习(六) —— RabbitMQ组件设置

MQ组件实现的功能性点:支持消息高性能的序列化转换、异步化发送消息。支持消息生产实例与消费实例的链接池化缓存化,提升性能。支持可靠性投递消息,保障消息100%不丢失。支持消费端的幂等操作,避免消费端重复消费的问题。支持迅速消息发送模式,在一些日志收集/统计分析等需求下可以保证高性能,超高吞吐量。支持延迟消息模式,消息可以延迟发送,指定延迟时间,用于某些延迟检查、服务限流场景。支持...

2020-03-19 16:58:47 177

原创 RabbitMQ 学习(五) —— RabbitMQ集群

镜像模式镜像模式:集群模式非常经典的就是Mirror镜像模式,保证100%数据不丢失,在实际工作中也是用的最多的。Mirror镜像队列,目的是为了保证rabbitmq数据的高可靠性解决方案,主要是为了实现数据的同步。一般来讲是2-3个节点实现数据同步。(对于100%数据可靠性解决方案一般是3节点)如上图,三个服务器中的mirror queue数据通过数据同步来保证rabbitmq的高可靠性...

2020-03-19 11:50:36 188

原创 RabbitMQ 学习(四) —— RabbitMQ延迟消息

使用RabbitMQ实现延迟队列的两种方式TTL + DLXDLX(Dead-Letter-Exchange),当信息在一个队列变成死信(Dead message)后,能被重新发送到DLX中,绑定DLX的队列称之为死信队列。死信队列可以通过检测被拒绝或者未送达的消息来追踪问题。设置延迟队列这里要设置过期时间,指定死信队列这个才能在消息过期时,消息重投到死信队列进行消费。@Confi...

2020-03-18 23:31:09 174

原创 RabbitMQ 学习(三) —— rabbitmq整合spring、springboot、springcloudstream

RabbitMQ整合Spring AMQP实战RabbitAdminRabbitAdmin类可以很好的操作RabbitMQ,在Spring中直接进行注入即可。(注意:autoStartup必须要设置为true,否则Spring容器不会加载RabbitAdmin类)RabbitAdmin底层实现就是从Spring容器中获取Exchange、Bingding、RoutingKey以及Queue的...

2020-03-17 21:03:13 323

原创 RabbitMQ 学习(二) —— 可靠性投递

生产端可靠性投递保证生产端可靠性投递需要以下几步:1、保障消息端成功发出。2、保障MQ节点的成功接收。3、发送端收到MQ节点(Broker)确认应答。4、完善端消息进行补偿机制。方案一:1、对业务数据和消息数据进行落库。2、发送消息并监听回调,如果收到ACK,更数据库消息状态。3、分布式定时任务查找消息状态不是成功的消息进行再次投递。总结:这种方式需要多次访问数据库,在高...

2020-03-12 19:48:17 139

原创 RabbitMQ 学习(一) —— 概念和快速入门

RabbitMQ 初识RabbitMQ 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ 是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。Erlang语言最初在于交换机领域的架构模式,这样使得 RabbitMQ在Broker之间进行数据交互的性能是非常优秀的。它的优点是与原生Socket一样的延迟。AMQP协议:具有现...

2020-03-07 12:34:33 163

原创 Spring Cloud学习——链路追踪:Zipkin

安装Zipkin Serverdocker run -d -p 9411:9411 openzipkin/zipkin运行后访问http://localhost:9411/zipkin/配置服务文基于之前的zuul模块,以及eureka-client模块。在两模块中都添加zipkin的client依赖以及sleuth依赖。 <dependency> ...

2020-01-23 20:42:22 145

原创 Spring Cloud学习——链路追踪:Sleuth

为什么需要Spring Cloud Sleuth微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到...

2020-01-23 20:27:28 713

转载 Spring Cloud学习——网关:Zuul

什么是ZuulZuul 是 Netflix 开源的微服务网关组件,它可以和 Eureka、Ribbon、Hystrix 等组件配合使用。Zuul 的核心是一系列的过滤器 (比如:动态路由)。Spring Cloud Zuul 对 Zuul 进行了整合 ,从而更方便的与 Spring Cloud 一起使用。Zuul是Spring Cloud全家桶中的微服务API网关。所有从设备或网站来的请求...

2020-01-14 10:07:38 228

转载 Spring Cloud学习——服务间通信:Feign

Feign 有两个特点:1、声明式REST客户端(伪RPC)2、采用了基于接口的注解如何使用在Spring cloud应用中,当我们要使用feign客户端时,一般要做以下三件事情 :使用注解@EnableFeignClients启用feign客户端并设置扫描的路径。@SpringBootApplication@EnableFeignClients(basePackages = {...

2020-01-07 12:37:53 210

转载 Spring 注解详解 —— @Transactional

@Transactional首先从 <tx:annotation-driven/> 说起。配置了 <tx:annotation-driven/>,就必定有对应的标签解析器类,查看NamespaceHandler接口的实现类,可以看到一个TxNamespaceHandler,它注册了AnnotationDrivenBeanDefinitionParser对annotatio...

2020-01-06 18:43:43 144

转载 Spring 的 Bean 的加载过程

概述首先,概括的描述一下 Spring 背后的操作:通过注解和xml的方式,将定义的bean(如 loginService 和 loginResource) 解析成 Spring 内部的 BeanDefinition。以 beanName(如 loginService) 为 key,BeanDefinition(如 loginService 相应的 BeanDefinition) 为 va...

2020-01-06 16:27:51 342

原创 JVM性能监控与调优学习

JVM命令参数标准参数在jvm的各个版本中不会变的参数,例如:-help、-server -client、-version -showversion、-cp -classpath。X参数非标准化参数,jvm的不同版本可能改动:-Xint(解释执行)、-Xcomp(第一次使用就编译成本地代码)、-Xmixed(混合模式,JVM自己来决定是否编译成本地代码)。XX参数非标准化参数,jvm...

2019-12-21 17:07:02 222

mysql java 驱动jar包

mysql java 官网最新驱动包

2016-11-15

空空如也

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

TA关注的人

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