
后端
文章平均质量分 93
程序员小潘
Java开发工程师,现居杭州,优快云博客专家,热衷于分享计算机编程相关知识,欢迎关注~
展开
-
RPC核心模块汇总
分享背景问题:能否画张图描述一下RPC的整个流程?(越详细越好)同一个进程:对象(参数) > 对象(结果)RPC:对象 > 打包 > 序列化 > 网络传输 > 反序列化 > 解包 > 对象远程服务调用 > 网络通信 > 协议(应用层)RPC调用需要保证可靠性 > 基于TCP协议 > 自定义应用层协议为什么会导致粘包/拆包?TCP作为传输层(4层)协议,并不知道应用层(7层)数据报文的含义。优化性能,减少网络拥塞。粘/拆包的解决方案?如果你使用Netty,它提供了开箱即用的解码器。Dubbo粘原创 2022-07-13 08:46:56 · 1502 阅读 · 0 评论 -
Java后端实现视频分段渐进式播放
大文件的分片上传可以看笔者前面的文章:大文件分片上传前后端实现。这篇文章,主要记录一下,服务端如何将一个大的视频文件做切分,分段响应给客户端,让浏览器可以渐进式的播放。原创 2020-11-17 22:16:07 · 15359 阅读 · 42 评论 -
用了好几年的MyBatis还不知道其原理?来,带你手写MyBatis!
MyBatis是一款优秀的持久层框架,相信很多Java开发者都使用过它来操作数据库。如下代码是一个最简单的例子:编写一个接口,定义一个保存方法,写好需要执行的sql语句,MyBatis就能帮我们把数据保存到数据库。使用非常的简单,但是大家有没有想过这样一个问题:我们只写了接口,并没有实现类,MyBatis如何实现其中的逻辑呢?理解一个框架原理最好的方法,就是自己去实现一下。实现思路基本如下:执行sql?使用JDBC。只有接口没有实现类?JDK动态代理生成代理对象。依赖注入?扫描Mapp原创 2020-08-14 21:22:10 · 11568 阅读 · 0 评论 -
手写MyBatis数据库连接池
1、资源池(Pool)技术资源池(Resource Pool)是一种设计模式,预先构建好N个资源,需要的时候直接从池子里面拿,用完再放回去。预先构建好资源,节省了构建资源的时间,可以提升应用程序的响应速度。资源使用完毕后放回池子里,让其他线程可以复用资源,避免了资源反复创建和销毁的开销。基于这种设计模式,于是就有了:线程池,连接池,内存池,对象池等池技术。线程的创建和销毁开销是很大的,如...原创 2020-04-22 15:26:43 · 3830 阅读 · 0 评论 -
手写MyBatis分页插件
目录前言MyBatis插件手写分页插件总结前言在开发查询类的接口时,有一个让开发者比较头疼的问题:分页。如果每次都要开发者自己去写limit,计算起始行和偏移量就太烦了,于是市面上诞生了一些优秀的分页插件,例如:PageHelper。PageHelper使用起来非常简单,如下示例代码:Page page = PageHelper.startPage(1, 10);//sql: sele...原创 2020-03-16 20:15:00 · 4258 阅读 · 0 评论 -
Spring七种事务传播行为
事务传播行为“事务传播行为”描述的是:当一个事务方法被另一个方法调用时,该事务方法如何进行?是创建新事务?丢弃事务?还是加入到已存在的事务呢?针对这些情况,Spring框架定义了七种事务传播行为,开发人员可以根据实际的业务场景来选择合适的传播行为。七种事务传播行为Spring将其定义在一个枚举类Propagation中,分别如下:REQUIRED如果当前没有开启事务,就开启一个新事...原创 2020-01-16 20:24:17 · 4108 阅读 · 2 评论 -
RabbitMQ常见问题解决方案
上一篇博客记录了一下RabbitMQ的服务搭建和简单入门,但是光这些还远远不够。要想将RabbitMQ用于生产中,需要考虑和解决很多问题。目录消息转换器生产者如何确保消息发送不丢失?消费者如何防止消息丢失?消息预取死信交换机消息转换器原生的RabbitMQ只能发送字节数组,与SpringBoot整合后,Spring允许开发者发送一个对象,原因在于Spri...原创 2020-01-11 20:55:49 · 6940 阅读 · 1 评论 -
RabbitMQ快速入门
简介RabbitMQ是什么?RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。RabbitMQ是AMQP的一种实现,消息队列的一种,类似的实现还有:ActiveMQ,kafka等。RabbitMQ可...原创 2020-01-09 20:54:20 · 3408 阅读 · 0 评论 -
如何实现一个比较完美的分布式锁?
在分布式系统中,存在一个让人很头痛的问题:锁。单机器时,控制并发相对简单,使用Java提供的synchronized关键字或者显式锁ReentrantLock。但是在分布式系统中,JVM级别的锁已经不能满足系统的需求,需要实现分布式锁,可以借助Redis或Zookeeper实现,本篇博客记录一下用Redis实现一个比较完美的分布式锁。通过一个“商品秒杀抢购”案例来实现。商品抢购案例购买商...原创 2020-01-07 21:01:55 · 4189 阅读 · 0 评论 -
Redis分布式锁防止缓存击穿
缓存击穿和缓存穿透不同的是,缓存击穿是指:缓存中没有,但是数据库中存在的热点数据。例如:首页的热点新闻,并发访问量非常大的热点数据,如果缓存过期失效,服务器会去查询DB,这时候如果大量的并发去查询DB,可能会瞬间压垮DB。画了个简图,如下所示:解决方案:DB查询加分布式锁。未加锁的情况解决问题之前,先看一下不做处理的代码和运行情况。根据商品ID查询商品详情代码清空Redis缓存...原创 2020-01-05 21:44:20 · 5022 阅读 · 0 评论 -
手写布隆过滤器防止缓存穿透
什么是布隆过滤器?布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。如果要判断一个元素是否存在,以前的思路是遍历集合,将元素依次比较。链表、数组等数据结构都是这种思路,只是不同的数据结构判断的...原创 2020-01-05 16:58:38 · 3731 阅读 · 0 评论 -
Redis Cluster高可用集群搭建
笔者前面的博客分别介绍了Redis“主从复制”和“哨兵模式”服务的搭建,但是这两种服务还有一些问题没有解决,例如:单台Master写性能存在瓶颈数据无法分布式存储,单机内存有限为了解决这些问题,Redis还提供了一种扩展性更强,可用性更好的Cluster集群方案。Redis Cluster集群是什么?Redis Cluster集群是一个由多个主从节点集群组成的分布式服务器群,它具有数...原创 2020-01-04 19:31:46 · 3675 阅读 · 0 评论 -
Redis哨兵模式
Redis哨兵模式在2.8版本开始引入,它的主要目的是:Master节点的自动故障转移。Redis主从复制,Master只有一台,当Master节点出现故障时,整个服务将无法写入数据,服务可用性较差。此时一般需要人为操作,将其中一台Slave晋升为Master,且其他Slave均需要从新的Master复制数据。人为修改Redis节点角色,首先是不及时,其次是比较麻烦。为了解决这个问题,Re...原创 2020-01-04 12:54:05 · 3248 阅读 · 0 评论 -
Redis主从复制服务搭建及原理
Redis主从复制服务搭建及原理单机的问题在一台机器上部署单个Redis节点,存在哪些问题?机器故障,数据丢失。容量瓶颈,单台机器内存有限。性能瓶颈无法高可用针对单机存在的问题,Redis也提供了多种集群方案:主从复制哨兵模式集群该篇博客主要针对“主从复制”做一下简单记录。主从复制将节点的角色分为Master和Slave,主机和从机。Master主要负责数据的写...原创 2019-12-31 21:21:44 · 3218 阅读 · 1 评论 -
Redis数据持久化机制及数据恢复
什么是数据持久化?我们知道Redis是基于内存的非关系型数据库,对数据的增删改查操作都直接在内存中进行,再加上Redis不用维护数据之间的“关系”,导致它性能很高,速度很快。但是基于内存有一个问题是:一旦机器断电,内存中的数据会丢失。数据丢失是很严重的问题,所以Redis是支持数据持久化的。数据持久化:将内存中的数据写入到磁盘,数据永久保存。Redis的持久化机制Redis支持两种持久...原创 2019-12-29 15:50:27 · 3526 阅读 · 0 评论 -
Redis命令总结
在学习Redis,五大数据类型,整理了一下操作命令,以防忘记时方便查阅。Stringstring是redis最基本的类型,一个Key对应一个Value,string类型是二进制安全的,可以包含任何数据,比如jpg图片或者序列化的对象。一个redis中字符串value最多可以是512M。SETSET key value [EX seconds] [PX milliseconds] [NX|...原创 2019-12-28 21:18:20 · 3209 阅读 · 0 评论 -
Linux下Redis的安装和启动
Redis安装和启动去官网下载自己需要的版本,解压安装:https://redis.io/download。wget http://download.redis.io/releases/redis-5.0.7.tar.gztar -zxvf redis-5.0.7.tar.gzcd redis-5.0.7makemake install默认安装目录: /usr/local/bin。...原创 2019-12-28 21:16:12 · 3160 阅读 · 0 评论 -
Spring Boot零配置实现原理及模拟实现
利用Spring Boot可以快速的构建一个Spring应用,尤其是Web应用,Spring Boot内嵌了Tomcat容器,项目开发完成后打包成一个可执行的Jar包直接就能运行,大大减少了项目构建和部署的成本。Spring Boot非常强大,它是如何实现的?过去的步骤在没有用Spring Boot之前,是这么做的:1、在web.xml手动配置Spring配置文件和DispatcherSe...原创 2019-12-14 22:09:49 · 4143 阅读 · 0 评论 -
Maven基础知识
Maven简介什么是Maven?Maven是跨平台的项目管理工具,使用Java语言开发,可以对Java项目进行项目构建、依赖管理、项目信息管理。理想的项目构建方式清理 -> 编译 -> 测试 -> 报告 -> 打包 -> 部署自动化跨平台可重用标准化为什么使用Maven?不用Maven:手工操作多,编译、测试、打包、部署都要独立操作需要手...原创 2019-12-14 19:43:21 · 3075 阅读 · 0 评论 -
Solr7服务搭建及简单使用
前言最近在搭一套微服务环境,其中“帖子模块”需要用到Solr的全文检索和高亮查询,服务搭建完毕后决定将Solr的服务搭建过程和查询简单记录一下。之前用Lucene实现过类似的功能,Solr也是基于Lucene的,但Solr是面向企业级的搜索服务,功能更强大。服务搭建下载软件前往Solr官网下载,下载链接。解压并启动现在Solr已经内置了容器,可以单独运行,无需依赖Tomcat。./...原创 2019-12-11 21:45:44 · 3151 阅读 · 0 评论 -
SpringCloud相关服务搭建
目录EurekaEurekaServerEurekaClient搭建Eureka服务集群Eureka客户端注册Ribbon服务间调用负载均衡策略自定义负载均衡策略不同服务不同策略FeignHystrix服务降级、超时熔断限流Feign整合HystrixZuul搭建Zuul服务过滤...原创 2019-11-30 22:28:47 · 3217 阅读 · 0 评论 -
实现简单的Spring容器
在学习Spring的时候,常听到的两个东西:IOC和DI。IOC:控制反转,将对象的生命周期交给Spring去维护,我们需要对象时从容器中拿。DI:依赖注入,类与类之间的依赖关系也交给Spring去维护。例如:A依赖B,程序运行时Spring会帮我们自动注入B实例。Spring的容器有两大类:BeanFactory和ApplicationContext。具体的内容可以参考笔者以前的博客,今...原创 2019-11-27 21:25:55 · 3231 阅读 · 0 评论 -
Spring学习笔记 三
JDBC框架原生的JDBC使用很麻烦,需要开发者手动的打开链接,处理异常,关闭连接等等。Spring JDBC对原生的JDBC进行了封装,由Spring JDBC去实现底层细节,开发者只关心 执行Sql和返回结果。尽管如此,实际开发中仍然不会使用Spring JDBC,因为有更加优秀的持久层框架:MyBatis。PersonDao持久层对象@Datapublic class Perso...原创 2019-11-16 13:40:53 · 3077 阅读 · 0 评论 -
Spring学习笔记 二
AOPSpring 框架的一个关键组件是面向方面的编程(AOP)框架。面向方面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。有各种各样的常见的很好的方面的例子,如日志记录、审计、声明式事务、安全性和缓存等。AOP底层实现:代理机制。AOP用到了两种代理机制:JDK代理和CGLIB代理。...原创 2019-11-16 13:40:23 · 3068 阅读 · 0 评论 -
Spring学习笔记 一
概述Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。特点控制反转 IOC学习Spring时,I...原创 2019-11-16 13:39:42 · 3174 阅读 · 0 评论 -
MyBatis一级缓存及失效
MyBatis提供了查询缓存机制,对于大量重复的查询使用缓存可以减轻数据库压力。官网介绍MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:...原创 2019-11-04 20:18:32 · 4427 阅读 · 1 评论 -
Linux下安装RabbitMQ
百度上安装RabbitMQ的帖子很多,大多都是复制粘贴,很多写的也不太详细,安装的erlang和RabbitMQ版本不兼容导致无法启动,对新手很不友好,该篇博客会记录详细的步骤,跟着作者一步一步来,本人确保成功安装并启动。RabbitMQ和erlang的对应版本请看官网链接安装步骤1、下载Erlang安装包http://erlang.org/download/otp_src_20.3.ta...原创 2019-10-13 11:16:19 · 4752 阅读 · 0 评论 -
RabbitMQ的六种工作模式
周末之余学习了一下RabbitMQ的几种工作模式,写了一些Demo,特此记录。前言操作RabbitMQ需要先得到连接,下列所有例子均需要创建连接,为了方便先写一个工具类。public class MQUtil { public static Connection getConnection() throws IOException, TimeoutException { //创建连接工...原创 2019-10-12 09:19:29 · 4726 阅读 · 0 评论 -
SpringBoot项目部署到Tomcat
将项目打包方式修改成war修改项目pom.xml文件:war移除自带的tomcat添加依赖org.springframework.bootspring-boot-starter-tomcatprovided启动类稍作修改public class BlogApplication extends SpringBootServletInitializer implements ...原创 2019-10-12 09:15:55 · 4668 阅读 · 0 评论