![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java进阶
文章平均质量分 93
是Guava不是瓜娃
Welcome to the real world,it is suck but you gonna love it.
展开
-
【分布式】Redis分布式锁代码实现Demo
分布式锁实现要素分布式锁实现注意几个要素:加锁过程原子性:加锁时首先判断key是否存在、是否有值,没有值再设置,这3个步骤需要是原子操作;锁正常释放:出现超时、网络等问题时,保证加的锁可以正常释放;锁正确释放:锁A释放时,需要保证只能由加A锁的客户端释放,否则可能就会出现误删锁;锁高可用保证:分布式锁如Redis或ZK出现宕机时,如何保证加锁功能不被影响,需要根据业务考虑到CP、CA抉择选择合适的实现方式;同时可以添加兜底逻辑,如使用CA模型的ZK分布式锁时,当出现分布式不可用时,可以退化成本地原创 2020-12-19 14:08:26 · 1157 阅读 · 3 评论 -
【分布式】图解Raft协议
Raft算法是目前分布式系统开发选用较多的共识算法,它在Paxos算法的基础上做了简化和限制。本文采用动态图的形式讲解Raft协议中的选举和日志复制整个过程,帮助理解选举过程中的选举超时、心跳超时、重新选举概念,以及日志复制、网络分区等情况。原创 2020-08-27 15:01:11 · 1748 阅读 · 2 评论 -
【限流02】限流算法实战篇 - 手撸一个单机版Http接口通用限流框架
本文将从需求的背景、需求分析、框架设计、框架实现几个层面一步一步去实现一个单机版的Http接口通用限流框架。原创 2020-06-30 00:35:46 · 923 阅读 · 1 评论 -
【限流01】限流算法理论篇
微服务就是将复杂的大应用拆分成小的应用,这样做的好处是各个应用之间独立开发、测试、上线,互不影响。但是服务拆分之后,带来的问题也很多,我们需要保障微服务的正常运行,就需要进行服务治理。常用手段有:鉴权、限流、降级、熔断等。其中,限流是指对某个接口的调用频率进行限制,防止接口调用频率过快导致线程资源被耗尽从而导致整个系统响应变慢。限流在很多业务中都有应用,比如:秒杀、双11。当用户请求量过大时,就会拒绝后续接口请求,保障系统的稳定性。接口限流的实现思路是:统计某个时间段内的接口调用次数,当调用次数超过设置原创 2020-06-30 00:26:08 · 2434 阅读 · 0 评论 -
【分布式】03-分布式一致性协议2PC&3PC&Paxos&Raft协议
分布式系统设计中,几乎都需要在服务可用性性 和数据一致性之间做权衡,也因此诞生了一系列的一致性协议,常见的有2PC一致性协议、3PC一致性协议、Paxos一致性算法、Raft一致性算法。原创 2020-06-17 22:51:45 · 679 阅读 · 0 评论 -
【分布式】02-分布式锁原理和选型
在讨论分布式锁原理的时候,我们带着如下思考进入今天的主题:根据业务场景如何选择分布式锁模型:CP还是AP?读锁、加锁是否是原子操作?锁能否正常释放,避免死锁(如添加过期时间)保证分布式锁高可用:如何保证锁资源不丢失(保存锁的机器可能宕机)锁的本质就是对共享资源的串行化处理。在单进程环境中,Java JDK提供了两种互斥锁实现:Lock和Synchronized。这两种锁对共享资源的操作前后加解锁,保证不同线程可以互斥有序的操作共享资源。在分布式环境下,就需要我们自己来实现分布式锁,保证不同J原创 2020-05-31 23:58:29 · 572 阅读 · 0 评论 -
【分布式】01-分布式系统和CAP理论
在正式介绍分布式锁之前,我们有必要再回顾下分布式系统和CAP定理,知己知彼才能知道为什么会出现分布式锁的概念。话不多说,直接进入本篇文章的主题。一、分布式与集群的区别分布式系统并非是一蹴而成的,而是经过几个阶段演化而来。1、单机单机就是将一个系统部署在一台服务器上,所有请求都由这台服务器处理。![在这里插入图片描述](https://img-blog.csdnimg.cn/20200531173211538.png?x-oss-process=image/watermark,type_ZmFuZ原创 2020-05-31 17:45:27 · 607 阅读 · 0 评论 -
【Kafka精进系列007】从面试的角度分析Kafka Producer
1、Kafka为什么采用分区的概念Kafka消息采用 主题(Topic) - 分区(partition) - 消息的三级结构,每条消息只会保存在某一个分区中,而不会在多个分区被保存多份。采用分区的作用就是 提供负载均衡的能力,实现系统的高伸缩性。不同的分区放在不同的节点机器上,数据的读写操作针对的是分区这个粒度,每个节点的机器能够独立执行各自分区的读写处理请求,并且还可以通过添加新的节点机...原创 2020-04-20 22:33:13 · 343 阅读 · 0 评论 -
【Kafka精进系列006】KafkaProducer消息发送源码解析
上一讲中,我们大概的分析了下KafkaProducer消息发送流程,本节将从源码的角度深入分析消息发送过程。消息发送之前的准备工作都已经在客户端KafkaProducer的构造器中完成,包括:配置项加载、序列器初始化、消息收集器初始化、消息发送线程初始化等等。而消息的发送入口在send()方法中:Future<RecordMetadata> send(ProducerRecord&...原创 2020-04-20 22:30:43 · 552 阅读 · 0 评论 -
【Kafka精进系列005】Kafka生产者流程客户端消息发送过程解析
在前两节博客中,我们已经演示了如何在Docker搭建Kafka集群以及实现Kafka的消息发送和接收过程.本文将深入Kafka Producer的消息发送过程,从源码的角度梳理下Kafka的发送过程。注:本文Kafka源码版本:1.0.0.一、KafkaProducer介绍1、KafkaProducer介绍与使用KafkaProducer是Kafka的客户端、消息的生产者,用来将消息发...原创 2020-04-20 22:16:14 · 711 阅读 · 1 评论 -
【Kafka精进系列004】Spring Boot + Kafka消息生产与消费代码示例
通过本文,你可以学到:(1)Kafka生产者异步发送API介绍;(2)Kafka生产者消息发送的代码实现;(3)Kafka生产者发送的消息不丢失的配置参数;(4)Kafka消费者常见的两种消费方案设计(单实例与多实例以及多线程消费);(5)Spring Boot整合Kafka实现Kafka生产与消费的完整过程原创 2019-12-29 21:22:07 · 3615 阅读 · 0 评论 -
【Kafka精进系列003】Docker环境下搭建Kafka集群
通过本文,你将了解到:(1)如何使用Docker进行Kafka集群搭建;(2)如何使用Docker-compose一键构建Kakfa单节点和集群服务;(3)使用`docker-compose down -v`解决docker-compose初始化创建topic时无法创建多分区问题记录;原创 2019-12-29 21:13:15 · 6051 阅读 · 3 评论 -
【Kafka精进系列002】Docker环境下Kafka的安装启动与消息发送
前言上一节【Kafka精进系列001】Kafka单机安装与启动(Mac)中,我们演示了如何在本地安装、启动Kafka以及Kafka消息的生产和发送过程,本节将演示如何在Docker中安装启动Kafka容器、以及如何在Kafka容器中进行消息的生产和发送测试。注:Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Lin...原创 2019-12-23 20:38:09 · 4270 阅读 · 2 评论 -
【Kafka精进系列001】Kafka单机安装与启动(Mac)
1、安装Zookeeper和Kafkabrew install kafkabrew install zookeeperKafka版本:2.2.0;zk版本:3.4.13两者安装目录都在: /usr/local/Cellar 目录下。2、ZK启动ZK相关目录ZK安装目录: /usr/local/Cellar ZK配置文件目录: /usr/local/etc/zookeeper ...原创 2019-12-23 00:04:48 · 1023 阅读 · 0 评论 -
接口鉴权功能的实现
一、背景随着系统的发展,单体应用主键演化成微服务架构。系统微服务化之后,若干个微服务之间会有调用。同个部门内实现的服务会被内部调用,一般风险是可控的。但是如果服务提供给别的部门使用之后,在不了解对方的使用场景,接口调用QPS等,如果对方接口调用量过大,会影响整个使用该服务的调用方,且对接口的安全性也会有风险。在这种情况下,每个微服务都需要对调用者进行鉴权。基本的鉴权维度有:应用鉴权:对方在...原创 2019-12-10 21:28:29 · 12904 阅读 · 0 评论 -
【Sentinel(一)】Sentinel介绍与使用
一、什么是SentinelSentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。官网:https://github.com/alibaba/Sentinel/wikiSentinel主要特性:Sentinel与Hystrix的区别关于Sentinel与Hystrix的区别见:https://yq.aliyun.com/artic...原创 2019-11-30 20:56:23 · 205662 阅读 · 21 评论 -
责任链设计模式与应用:实现拦截器责任链统计接口执行时间和性能
一、什么是责任链设计模式1、什么是责任链设计模式?责任链设计模式主要构成有抽象处理者、具体处理者、客户类,在处理请求的时候,将请求通过客户类发送至处理链路上,这样链路上所有处理对象都有机会处理请求,使发送者与接收者之间解耦。见:https://blog.csdn.net/noaman_wgs/article/details/778382222、使用场景使用责任链模式的优点:发送者...原创 2019-11-02 23:52:26 · 863 阅读 · 0 评论 -
使用Spring SmartApplicationListener实现业务解耦
一、SmartApplicationListener介绍Spring ApplicationEvent以及对应的Listener提供了一个事件监听、发布订阅的实现,内部实现方式是观察者模式,可以解耦业务系统之间的业务,提供系统的可拓展性、复用性以及可维护性。Spring 提供的ApplicationEvent & Listener有3种实现方式:@EventListener 注解的...原创 2019-10-30 00:42:25 · 7893 阅读 · 0 评论 -
Java SPI机制介绍与ServiceLoader应用
1、SPI是什么SPI全称Service Provider Interface(服务提供接口),是专门被第三方实现或者扩展的API,可以用来启用框架扩展和替换组件,提供了为某个接口寻找对应服务类的机制。整体机制如下:(图片来源:https://www.jianshu.com/p/46b42f7f593c)Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载机...原创 2019-10-13 00:52:41 · 925 阅读 · 2 评论 -
接口重试机制的最佳实践 - Guava-retrying的应用
项目开发中,调用第三方接口会因为网络延迟、异常导致调用的服务出错,重试几次可能就会调用成功(例如上传图片),所以需要一种重试机制进行接口重试来保证接口的正常执行。重试机制除了用代码实现外,guava-retry可以灵活的实现这一功能,github 地址: https://github.com/rholder/guava-retrying/tree/master/src/main/java/com...原创 2019-01-06 18:09:18 · 12112 阅读 · 1 评论 -
高可用系统常用利器(一) - 服务降级 Hystrix
0、前言互联网高并发系统一般QPS、TPS都比较高,当流量比较大的时候,有三种常见手段可以保证系统高可用和稳定:缓存服务降级与熔断服务限流缓存的目的是减少数据库的压力和提升系统访问速度,使用缓存要需要考虑缓存穿透、缓存失效以及高并发情况下DB与缓存不一致的问题;服务降级与熔断是用来解决核心服务受到非核心服务的影响的一种手段,比如用户下单页面的优惠券展示,当优惠券展示的服务挂掉后,可以...原创 2019-03-07 11:31:03 · 1334 阅读 · 0 评论 -
【Nacos学习】01-Nacos简介与Server端启动
前言Nacos可以用于服务发现、配置中心、DNS服务等功能,使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。详细文档见官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html,本系列文章只做一些Nacos特性的学习与应用。一、Nacos介绍什么是Nacos?引用官方文档的话,Na...原创 2019-06-27 00:23:47 · 4606 阅读 · 3 评论 -
Netty学习(一)- Netty入门与Netty应用实战
一、什么是NettyNetty官网上是这样定义Netty的:Netty is an asynchronous event-driven network application frameworkfor rapid development of maintainable high performance protocol servers & clients.用人话(Google翻...原创 2019-07-11 20:45:59 · 2164 阅读 · 0 评论 -
Netty学习(二)- TCP粘包/拆包
一、TCP 粘包/拆包介绍1、什么是粘包、拆包首先只有TCP数据传输才会存在是粘包、拆包现象。假设客户端分别发送两个数据包D1和D2给服务器,由于TCP是面向流的协议,TCP把客户端传过来的数据看成是一连串的无结构的字节流,且服务端一次读取到的数据是不确定的,所以可能会出现下面几种情况。(1)服务端分两次接收到D1和D2数据包,没有发生粘包/拆包。(2)服务端一次接收了两个数据包,D1...原创 2019-07-27 00:02:28 · 633 阅读 · 0 评论 -
Netty学习(三)- Netty常用解码器原理与应用
一、Netty常用解码器TCP以流的形式传输数据,上层协议为了对消息进行区分,常采用以下4种方式:回车换行符:将回车换行符作为消息结束标志,如FTP协议,这种方式在文本协议中应用较为广泛;特殊分隔符:将特殊分隔符作为消息结束标志,上述的回车换行符就是一种特殊的特殊分隔符;固定消息长度:设置一个定值LEN,当累计读取到长度为LEN的报文后就认为读取了一个完整的消息;将计数器置位重新读取下一...原创 2019-07-27 00:16:06 · 2256 阅读 · 0 评论 -
Netty学习(四)- 基于Netty的HTTP协议栈应用
前言HTTP服务器在我们日常开发中,常见的实现方式就是实现一个Java Web项目,基于Nginx+Tomcat的方式就可以提供HTTP服务。但是很多场景是非Web容器的场景,这个时候再使用Tomcat就大材小用了。这个时候就可以使用基于Netty的HTTP协议。那么基于Netty开发的HTTP服务器有什么优势呢?Netty的多线程模型和异步非阻塞特性能够支持高并发;相比于Tomcat H...原创 2019-08-30 21:44:42 · 1230 阅读 · 0 评论 -
Netty学习(五)- 基于Netty的WebSocket协议栈开发
0、前言HTTP协议作为客户端-服务端之间的通信方式,得到了很多的应用。但是HTTP协议有很多的弊端:半双工:HTTP协议为半双工协议,这意味着客户端、服务端之间同一时刻只能有一端发送数据;消息结构复杂:HTTP协议包含消息头、消息体等内容,消息结构比较复杂和繁琐;长连接机制耗费服务器资源:为了实现实时通信,很多网站都采用长连接的方式,由客户端每隔固定时间(如1s)发送HTTP请求到服务...原创 2019-08-31 12:57:57 · 571 阅读 · 0 评论 -
Netty学习(六)- 基于Netty的私有协议栈开发
大多公司都会有自己的一套私有协议,可能只在自己公司内部使用的协议。使用Netty实现的私有协议可以用于内部各模块之间的通信,基于TCP/IP协议栈,异步NIO框架,提供高性能、异步化的通信能力。原创 2019-09-01 00:51:17 · 1174 阅读 · 1 评论 -
定时任务框架Quartz-(一)Quartz入门与Demo搭建
一、什么是Quartz什么是Quartz? Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。但是相较于Timer, Quartz增加了很多功能: 持久性作业 - 就是保持调度定时的状态; 作业管理 - 对调度作业进行有效的管理; ...原创 2018-07-10 13:57:07 · 367420 阅读 · 87 评论