自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何保障消息的可靠性投递及消费的幂等性

MQ的可靠性投递一般的消息中间件(MQ)只能保证消息不丢,但是不能保证重复发送等问题。比如在使用Rabbitmq过程中,如何保证消息都能正确的投递被消费,这个是要考虑的问题。那么可靠性投递所面临的问题有哪些?生产端的问题保障消息成功发送出去 保障MQ节点成功接收消息 消息发送端需要收到MQ的确认应答 完善的消息补偿机制解决方案一:消息落库以下是一个订单服务(生产者)发送消息给物流服务(消费者)的例子。正常流程在创建订单操作时,把数据插入到订单相关的表中,并且构造调用.

2021-04-09 20:16:10 286 1

原创 ShardingSphere实战及剖析

ShardingSphereShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。ShardingSphere 已于2020年4月16日成为 Apache 软件基金会的顶级项目。主要功能数据分片 分布式事务 数...

2021-03-27 21:11:05 2398 1

原创 玩转搜索(三)-- ElasticSearch

什么是ElasticSearch概述ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,提供基于Restful标准的API接口。ElasticSearch基于Java实现,是当前最流行的企业级搜索引擎,设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。ElasticSearch不仅能对海量规模的数据完成分布式索引与检索,还能提供数据聚合分析功能。优点速度快,近实时查询 索引和检索数据量大,支持TB级数据 高扩展,

2021-02-27 19:21:10 1750 3

原创 玩转搜索(二)-- Solr实战

什么是SolrSolr是一个独立的企业级搜索应用服务器,它对外提供API接口。用户通过HTTP的POST请求,向Solr服务器提交一定格式的XML或JSON文件,Solr服务器解析文件后,根据具体需求对索引库执行增删改操作; 用户通过HTTP的GET请求,向Solr服务器发送搜索请求,并得到XML/JSON格式的返回结果。Solr可以独立运行在Jetty、Tomcat等Servlet容器中。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。

2021-02-06 19:17:52 1345 1

原创 玩转搜索(一)-- 全文检索与Lucene实现

全文检索的概念我们生活中的数据总体分为两种:结构化数据和非结构化数据。结构化数据:指具有固定格式或有限长度的数据,如关系数据库等。非结构化数据:指不定长或无固定格式的数据,如邮件、文档等。...

2021-01-24 19:11:49 558

原创 MyCat 学习及使用 -- 如何配置分库分表

什么是MyCatMycat 是什么?从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个MySQL 服务器通信,也可以用JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N 个小表,存储在后端MySQL 服务器里或者其他数据库里。Mycat 发展到目前的版本,已经不是一个单纯的MySQL

2021-01-10 19:19:59 2902 5

原创 SpringBoot+MyBatis实现多数据源

本文将介绍SpringBoot+MyBatis下如何实现多数据源的配置,这在读写分离或分库的场景中非常实用。这里的实现主要是利用Spring提供的路由数据源,以及AOP。AbstractRoutingDataSource解析Spring提供了抽象类AbstractRoutingDataSource实现数据源路由。其中包含两个容器targetDataSources和resolvedDataSources,其中targetDataSources是指我们通过方法设置的目标数据源,而resolvedData

2020-12-30 09:13:41 709

原创 Gradle实战及Maven项目迁移采坑记录

最近准备把项目从maven迁移到gradle。由于之前也没接触过gradle,中途也遇到了一些坑,这里记录一下供后来者参考,适合gradle新手小白参考。这里的版本采用的是6.7。环境安装参考官方文章,通过gradle -version 判断环境是否正确。如何使用全局参数在gradle.properties中可以定义全局参数,如以下:springBootVersion=2.3.6.RELEASE在build.gradle中通过${xxx}引用:... dependencies {

2020-12-21 11:50:15 680

原创 从零开始学Netty (四)-- 实战实现前后端分离的IM框架

网上有很多Netty的教程DEMO,但是前后端分离的例子可能比较少。这次我将会使用SpringBoot + Netty + WebSocket的技术栈,实现前后端分离的即时通讯(IM)的DEMO。主要功能服务端接收的消息主要分以下几类:1、CONNECT:当websocket 第一次open的时候,初始化channel,把用的channel 和 userid 关联起来。2、CHAT:聊天类型的消息,把聊天记录保存到数据库,同时标记消息的签收状态[未签收]。如果接收者在线,则转发给相应的.

2020-11-29 18:47:48 1032

原创 从零开始学Netty (三)-- TCP粘包/半包分析 及 解决方案

什么是粘包/半包首先来看一个Demo,在客户端连接上服务器后,给服务器发送1000次的数据。 public void channelActive(ChannelHandlerContext ctx) throws Exception { ByteBuf msg = null; String request = "demo test!" + System.getProperty("line.separator"); for(int i = 0;.

2020-11-14 19:55:02 522

原创 从零开始学Netty (二)-- 初始Netty核心组件 及 聊天室Demo

我们今天将通过一个Demo来理解Netty的几个主要组件。Netty的开发,主要是配置和实现各种Handler处理器,而其他是由Netty来替我们实现,所以我更愿意称其为“模板化”的开发模型。“模板化”的Netty首先看一个聊天室的Demo服务端代码public class DemoServer { public static void main(String[] args) throws InterruptedException { EventLoopGroup

2020-11-07 19:04:08 649

原创 从零开始学Netty (一)-- Linux网络IO模型 及 Java实现BIO、NIO、AIO

下面准备做一个Netty的系列教程,适合初次接触Netty或网络通讯的同学了解阅读。本文主要介绍Linux网络IO模型、BIO、NIO、AIO及代码实现。至于更基础的OSI、TCP/IP、HTTP等,相信大家都不陌生就不一一赘述了。由于Netty5停止维护了,所以后面所涉及的Netty都是指Netty4这个版本,故也不支持AIO。Linux网络IO模型一般服务器都运行在Linux环境下,故这里也只讨论Linux环境下的。阻塞I/O模型应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好

2020-10-23 22:00:55 686

原创 Redis通信协议RESP及模拟RedisClient

RESP协议RESP(即Redis Serialization Protocol)是Redis底层的通信协议,Redis客户端通过RESP协议与Redis服务器通信。首先来看get key1的协议报文:*2$3get$4key1其中*2表示有两个参数$3get表示第一个参数长度为3,值为'GET'$4key1表示第二个参数长度为4,值为'key1'...

2020-10-19 20:46:03 598

原创 ZooKeeper实战(三)--分布式锁

分布式锁分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,这个时候,便需要使用到分布式锁。定义一个Lock接口,需要实现获取锁和释放锁。public interface Lock { /** * 获取锁 */ public void getLock(); /**

2020-10-03 10:36:54 550

原创 ZooKeeper实战(二)--简单的服务发现与注册

发布订阅发布/订阅模式是一对多的关系,多个订阅者对象同时监听某一主题对象,这个主题对象在自身状态发生变化时会通知所有的订阅者对象。使它们能自动的更新自己的状态。发布/订阅可以使得发布方和订阅方独立封装、独立改变。当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象需要改变时可以使用发布/订阅模式。发布/订阅模式在分布式系统中的典型应用有服务发现与注册。服务发现与注册服务发现与注册是指对集群中的服务上下线做统一管理。每个工作服务器都可以作为数据的发布方向集群注册自己的基本信息,而让某些

2020-09-29 18:11:19 464

原创 ZooKeeper实战(一)--ZK特性与三个Java客户端(ZooKeeper、ZkClient、Curator)

ZooKeeper作为一个经典的CP模型分布式服务框架,在许多中间件或者集群中都需要使用到它。它主要是用来解决分布式应用中经常遇到的一些数据管理问题,主要应用场景包括:数据发布订阅、负载均衡、命名服务、Master选举、集群管理、配置管理、分布式队列、分布式锁等。本文将介绍ZK的数据模型,以及三个Java客户端框架的使用。ZK的特性会话客户端与服务端的一次会话连接,本质是TCP长连接,通过会话可以进行心跳检测和数据传输。会话(session)是zookepper非常重要的概念,客户端和服务端

2020-09-20 21:33:16 1359 1

原创 一文读懂MySQL执行计划与SQL优化

在实际工作或者面试中,经常会碰到MySQL索引、SQL优化方面的问题。本文将全面解读MySQL的执行计划以及如何优化索引,这里默认采用Innodb存储引擎。执行计划是什么使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析查询语句或是表结构的性能瓶颈。语法:Explain + SQL语句执行计划包含的信息id:查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。...

2020-08-08 19:39:00 3013

原创 Mybatis源码解读(六)--Executor组件(模板模式)

Executor是Mybatis核心接口之一,定义了数据库操作最基础的方法,SqlSession都是基于它来实现的。Executor包位于org.apache.ibatis.executor,这里采用模板模式实现。模板模式模板模式(Template Pattern):一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。定义了一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法的结构即可重定义该算法的某些实现。

2020-07-16 13:03:04 709

原创 Mybatis源码解读(五)--配置加载(建造者模式)

Mybatis启动流程就是组装Configuration对象的过程,在这其中主要就是初始化环境变量和初始化Mapper.xml的映射。Mybatis采用了建造者模式来加载配置。建造者模式建造者模式(Builder Pattern):使用多个简单的对象一步步构建成一个复杂的对象,这种设计模式属于创建型模式,提供了一种创建对象的方式。Builder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。Concre

2020-07-01 12:00:58 1083

原创 Mybatis源码解读(四)--数据源模块(工厂模式)

Mybatis的数据源模块位于org.apache.ibatis.datasource。常见的数据源组件都实现了javax.sql.DataSource接口。在Mybatis内不但集成第三方的数据源组件,自身也提供了数据源的实现。而一般情况下数据源初始化较复杂,参数较多,因此这里采用了工厂模式。工厂模式工厂模式(Factory Pattern)属于创建者模式,它提供了一种创建对象的最佳方式。定义了一个创建对象的接口,让其子类自己觉得实例化哪个工厂类,工厂模式使其延迟到子类进行。工厂接口(Fa

2020-06-17 08:52:27 931

原创 Mybatis源码解读(三)--缓存模块(装饰器模式)

Mybatis的缓存模块位于org.apache.ibatis.cache。Mybatis的缓存是基于Map实现的,从缓存里读写数据是缓存模块的核心功能。Mybatis的缓存还有很多额外的附加功能,如防止缓存击穿,设置缓存清除策略,日志功能等。这些附加功能可以以任意方式的组合附加到核心功能之上,而Mybatis采取的就是装饰器模式。装饰器模式装饰器模式(DecoratorPattern)允许向一个现有的对象添加新功能,是一种用于替代继承的技术,无需通过继承增加子类就能扩展对象的新功能。相比继..

2020-06-06 21:14:04 844

原创 Mybatis源码解读(二)--反射模块

Mybatis反射模块的代码在org.apache.ibatis.reflection。Mybatis的反射十分强大,对jdk的反射进行了很好的封装,完全可以作为一个独立的工具类在其他项目中使用。核心类解读MetaObject:封装了对象的元信息,包装了Mybatis中五个核心的反射类。也是提供给外部使用的反射工具类,通过它可以读取或修改对象的属性。public class MetaObject { //原始的java对象 private final Object originalO

2020-05-30 18:36:44 931

原创 Mybatis源码解读(一)--日志模块(适配器模式、动态代理)

Mybatis是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis的源码可以说写的非常漂亮,模块之前划分的很清晰,里面大量采用了设计模式,其中的一些模块完全可以二次封装作为工具类来使用。为什么说Mybatis的日志模块优雅日志模块的代码在org.apache.ibatis.logging。Mybatis的日志功能的实现可以说非常优雅,主要有两大优势:1、Mybatis的本身不提供日志功能,而是对接了常用的第三方日志如slf4j、log4j等。在实际使用中根据..

2020-05-25 14:25:28 1009

原创 MyBatis--一级缓存与二级缓存

概述MyBatis是一款优秀的持久层框架,也是当今互联网企业中应用最广泛的持久层框架。Mybatis包含一个强大的查询缓存特性,使用缓存可以使应用更快的获取数据,避免频繁的数据库交互。一级缓存一级缓存默认开启,想要关闭一级缓存可以在select标签上配置flushCache="true"; 一级缓存存在于SqlSession的生命周期中,在同一个SqlSession中查询时,Myb...

2020-03-31 10:19:09 1005

原创 Java并发编程--死锁及模拟银行转账实现

死锁DeadLock死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。模拟银行转账的Demo下面我们来看一个关于银行转账的死锁例子。在银行转账问题中,我们需要对转出方和转入方两个账户加锁,以确保转账过程中金额的正确性。我...

2019-12-23 10:12:53 1943

原创 Java并发编程--Semaphore及模拟实现一个连接池

什么是SemaphoreSemaphore(信号量)是java.util.concurrent包下一个重要的工具类。Semaphore类似synchronized的加强版,作用是控制线程的并发数量。而就这一点而言,synchronized关键字是实现不了的。Semaphore内部也是基于AQS实现的,将AQS下的state用作保存允许的流量数,访问特定资源前,必须使用acquire方法获得...

2019-12-16 12:19:55 979

原创 Java并发编程--AQS与自定义锁

什么是AQSAQS(Abustact Queued Synchronizer 抽象队列化同步器)是用来为Java的并发同步组件提供统一的底层支持,例如 ReentrantLock, CountdowLatch 都是基于AQS实现的。AQS采用模板方法设计模式,我们可以通过简单的继承实现模板方法,来自定义我们自己的锁。AQS的常用方法AQS定义两种资源共享方式:Exclusive(...

2019-12-02 13:25:38 1428 1

原创 Java并发编程--ForkJoin

概述从JDK1.7开始,Java提供ForkJoin框架用于并行执行任务,它的核心思想就是分而治之,本文将详细介绍这个框架的使用。什么是分而治之分而治之的基本思想是:将一个规模为N的问题分解为K个规模较小的子问题(K <= N),这些子问题相互独立且与原问题性质相同,求出子问题的解,就可以求出原问题的解。分而治之也是递归的一种,一般的实现步骤为:(1)设定阈值K(...

2019-11-22 11:26:55 992

原创 Spring Cloud 学习笔记(十)-- 配置刷新RefreshScope与Spring Cloud Bus

本人博客:https://cherishlife.com.cn/blog/33有兴趣的朋友支持下,谢谢!概述在前文中我们学习了如何使用Spring Cloud Config配置中心来管理实例的配置文件。本文来学习一下Config的配置刷新。主要方法是依靠actuator组件的refresh组件或借助Spring Cloud Bus与消息中间件实现。手动刷新手动刷新需要借助a...

2019-11-12 10:24:20 1842

原创 Spring Cloud 学习笔记(九)--Hystrix断路器

本人博客:https://cherishlife.com.cn/blog/32有兴趣的朋友支持下,谢谢!概述Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。“断路器”本身是一种开关装置,当某个服务单元...

2019-11-07 09:16:24 964

原创 Spring Cloud 学习笔记(八)--Feign详解

本人博客:https://cherishlife.com.cn/blog/31有兴趣的朋友支持下,谢谢!Feign是什么Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feig...

2019-11-04 08:56:37 1559

原创 Spring Cloud 学习笔记(七)--Ribbon负载均衡与自定义Ribbon

本人博客:https://cherishlife.com.cn/blog/30有兴趣的朋友支持下,谢谢!概述Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套客户端的负载均衡的工具。Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项,...

2019-10-31 10:49:06 1077

原创 Spring Cloud 学习笔记(六)--Gateway 关于IE跨域的坑及实现

本人博客:https://cherishlife.com.cn/blog/29有兴趣的朋友支持下,谢谢!概述在使用SpringCloud实现微服务时,经常会碰到前端页面访问多个二级域名的情况,跨域是首先要解决的问题。 解决这个问题,可以从两方面入手,一种方案是在微服务各自的业务模块中实现,即在SpringBoot层实现,另外一种方案就是在Gateway层实现。本文主要介绍网关...

2019-10-30 10:24:50 1400

原创 Java高级特性--反射详解

本人博客:https://cherishlife.com.cn/blog/22有兴趣的朋友支持下,谢谢!概述在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。java.lang.Class类是进行反射操作的源头所在,所有的反射操作都是通过这个类展开的。...

2019-10-24 15:03:13 1584

原创 Spring Cloud 学习笔记(五)--Gateway 实现多服务实例的 Swagger聚合

本人博客:https://cherishlife.com.cn/blog/28 有兴趣的朋友支持下,谢谢!概述Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 本文主要介绍如何使用网关Gateway,实现将多个实例的Swagger聚合。服务实例pom依赖包配置 <!--Swagger-UI API文...

2019-10-24 09:39:49 3357

原创 Spring Cloud 学习笔记(四)--网关Gateway Demo

本人博客:https://cherishlife.com.cn/blog/27 有兴趣的朋友支持下,谢谢!概述Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单、有效和统一的API路由管理方式,Spring Clou...

2019-10-23 09:37:16 4197

原创 Spring Cloud 学习笔记(三)--配置中心Config Demo

本人博客:https://cherishlife.com.cn/blog/26有兴趣的朋友支持下,谢谢!概述本文将继续介绍的是SpringCloud中的分布式配置中心Config的相关使用教程。Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,cl...

2019-10-23 09:26:21 964

原创 Spring Cloud 学习笔记(二)--搭建一个简单的Eureka Demo

本人博客:https://cherishlife.com.cn/blog/25有兴趣的朋友支持下,谢谢!概述本文介绍如何搭建快速入门级SpringCloud Demo。SpringCloud按照项目部署可以分为以下几个部分,注册中心(服务目录服务)、配置中心(集中式配置管理中心)、服务端(服务提供者)、客户端(服务消费者)、服务网关。将逐一进行简单介绍。PS:本文的Demo采用...

2019-10-23 09:15:56 950

原创 Spring Cloud 学习笔记(一)--什么是微服务

本人博客:https://cherishlife.com.cn/blog/24有兴趣的朋友支持下,谢谢!概述Spring Cloud是当今最火的微服务架构之一。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造...

2019-10-22 15:33:00 1042

ExchangeClient.java

通过Java实现Micro Exchange协议的邮件客户端,方便调用。

2019-10-25

空空如也

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

TA关注的人

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