自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 基于策略模式和线程池重构分布式定时任务

前言很多业务中,我们都会使用到定时任务,例如支付宝支付的定时检查、需要周期性执行的任务等,在同一个微服务中,可能会需要写很多的定时任务。在分布式环境下,每个任务都需要写分布式锁相关的代码,而且很多用户执行的时候,可以使用线程池加快任务执行的效率,因此,提出了基于策略模式和线程池重构分布式定时任务的想法。分布式锁分布式锁实现的框架较多,本文章使用的是Redission,这也是目前为止,个人认为分布式锁最好的框架,使用起来很简单,使用方法在次不再赘述,有兴趣的小伙伴可以自己学习。策略模式策略模式属于2

2020-09-16 17:35:52 1700

原创 ngrok内网穿透-支付回调的看过来

前言在接支付宝支付时,需要传给支付宝一个notify_url,这个地址必须是公网能够访问的地址,否则支付宝调不通接口。局域网地址需要外部访问,就用到了内网穿透。下面使用ngrok完成内网穿透,废话不多说,参考步骤就可以了。步骤第一步:打开链接:https://www.ngrok.cc/user.html,直接注册即可,有账户就直接登录。第二步:开通隧道,点击立即购买如果没有特殊需求,直接使用免费隧道就行,价格为0的就是免费的第三步:填写隧道信息选择http隧道名称自己随意起;前值域名

2020-09-23 18:30:59 917 1

原创 json格式字符串与对象的转换

首先,创建一个对象:Article article = new Article();下面两种方式展示json字符串与对象的转换:使用fastjson,转换如下:// 将对象转成json格式的字符串String jsonStr = JSON.toJSON(article).toString();// 将json格式的字符串转成对象Article article = JSON.parseObject(jsonStr, Article.class);注意:fastjson要求Article必须

2020-09-23 10:34:53 773

原创 RedisTemplate自动注入失败原因及解决方案

在项目中,使用@Autowired注解注入RedisTemplate对象,spring默认scope属性是singleton,也就是单例模式,注入方式使用的是byType,如果指定泛型,可能会造成注入失败。RedisTemplate只支持两种泛型<String, String>和<Object, Object>解决方案:1) 去掉泛型2) 使用@Resource注解(jdk自带的注解),@Resource注解默认使用byName方式,如果byName方式注入失败,会自动使用

2020-09-22 16:26:30 9967 5

原创 Linux软件安装教程汇总-值得收藏

前言文章记录了常用软件的Linux安装教程,可以先收藏,后面会持续更新,把更多的软件记录下来,方便使用时参考。约定:Linux中,把安装包等个人文件放在/home目录下,软件安装在/opt目录安装教程JDK把jdk包放在/home下,执行解压命令:tar -zxvf安装包名 -C /opt,解压即安装成功解压完成后,配置jdk环境变量,执行命令:vim /etc/profile,编辑文件。如果出现command not found,执行命令:rpm -qa | grep vim,查看一下vim

2020-09-22 16:19:30 898

原创 二十四种设计模式(3)-代理模式

前言代理模式是很多框架的底层应用,spring提供了很好的代理模式,一般不用开发者手动编写代理模式实现业务,但是原理很重要。代理分为静态代理和动态代理,根据实现方式又分为JDK动态代理和CGLIB动态代理,下面从两个维度分析了代理模式:从源码角度分析了JDK动态代理和CGLIB动态代理的区别及适用场景;静态代理和动态代理的区别,为什么静态代理使用比较少?代理模式-JDK动态代理代理模式分为两种:静态代理和动态代理。静态代理是在代码编译期,就给被代理对象生成了一个不可改变的代理类,代理少的时候可

2020-09-22 16:08:18 749

原创 二十四种设计模式(2)-原型模式

前言一般对象都是通过new语句来创建,需要经过内存分配、初始化等操作,如果相同的对象需要比较多,都通过new语句创建效率就比较低了。原型模式是直接将对象从内存中拷贝一份,速度较快,但是需要注意,因为直接在内存中复制,因此对象的所有访问权限都没有用。对象中的属性可能包括简单类型和引用类型,这就涉及到浅拷贝和深拷贝的问题了。浅拷贝:我们只拷贝对象中的简单数据类型(基本数据类型及包装类,再加上String),对于数组、容器、引用对象等只是将引用地址赋值给新对象;深拷贝:不仅能拷贝基本数据类型,还能拷贝那些

2020-09-22 15:48:25 748

原创 Docker常用命令汇总-建议收藏查看

Docker常用命令汇总Docker安装yum list installed | grep docker -------------- 从已安装列表里查看是否安装了dockeryum install docker -y -------------- 安装docker,安装路径默认为:/var/lib/dockeryum remove docker.x86_64 -yyum remove docker-client.x86 -yyum remove do

2020-09-21 18:29:58 1057

原创 Linux常用命令汇总-建议收藏查看

Linux常用命令集合切换目录cd /usr/local ---------- 切换到/usr/localcd / ---------- 切换到根目录cd ./ ---------- 切换到当前目录cd …/ ---------- 切换到上级目录pwd ---------- 查看当前路径文件夹及文件命令ll ---------- 查看当前目录下文件,详细l

2020-09-21 18:27:00 1039

原创 Optional的用法-代码案例

前言Optional是一个容器对象,用来判断对象是否为null,记住,只会判断是否为null,代替的 if else 的写法。废话不多说,下面就来看看一下写法吧。代码示例1:String s = Optional.ofNullable(user) .map(o -> o.getUsername()) .orElseGet(() -> { return "李四";});用法说明:Optional.ofNul

2020-09-21 17:30:15 5699

原创 二十四种设计模式(1)-概述

前言设计模式每个开发者都会或多或少的接触过,使用过,设计模式的目的很简单,就是一些解决问题的方案,经过时间的检验,这种方案是最优的,这就形成了一套设计模式。很多的架构都是基于多种设计模式开发的,学习设计模式有利于我们更好的理解源码,提高学习水平。我们最常听说的设计模式有23种,也有人说是24种,本系列文章默认为24种。设计模式很多,但是在真正的开发过程中,我们用到的也就是我们熟悉的几种,本系列文章就是挑选一部分常用的设计模式,在开发中熟练使用即可。下面会根据设计模式的分类进行讲解。不管是什么设计模式,

2020-09-21 16:07:04 1365 1

原创 《阿里巴巴Java开发手册》精简笔记

前言《阿里巴巴Java开发手册》是一本开发参考手册,内容是对于开发中的一些规范约束,绝大部分规范都是开发中共同遵守的一些常识,另外一部分是阿里巴巴内部使用的一些规范,各个公司可能要求不一样。总体来说,该手册是值得学习和肯定的,下面是一些需要特别注意的,另外大部分要求可以看看就可以了,都是普遍性的规范。笔记内容单个方法的总行数不超过80行除注释外的方法签名、左右大括号、方法内代码、回车及任何看不见字符的总行数不超过80行;所有整型包装类对象之间值的比较,全部使用equals方法;浮点数之间的等值

2020-09-21 14:10:52 1243

原创 Spring启动时类的初始化与依赖加载时机

前言当我们将对象交给spring管理的时候,经常会做一些初始化操作,初始化有很多种实现方法:static静态代码块、init()方法、构造方法(不建议)等等方式,但是有时我们会引用依赖,而依赖的加载时机经常会造成困扰绕,下面就一次性梳理明白,而且我们还可以通过一些手段改变依赖的加载时机。代码测试直接上代码:@Componentpublic class Test { @Autowired private ApplicationContext context; static

2020-09-18 18:32:49 3144

原创 Lua脚本实现Redis组合操作的原子性

前言我们一定会在项目中遇到过这种场景:一段代码中,redis进行多次取值存值,虽然单个redis操作具有原子性,但是redis组合操作就不能保证整体的原子性了,这时候我们可以通过lua脚本来实现redis组合操作的原子性。Lua脚本能够保证redis所有操作的原子性,但是需要注意,Lua脚本中的命令如果有失败的命令,Lua脚本不会回滚,例如有3条插入语句,第一条执行没报错,第二条执行报错了,那么第一条语句就会插入到redis中。代码实现下面以springboot中使用lua脚本为例,可以参考下面的使

2020-09-17 18:23:48 2149 2

原创 RabbitMQ系列(4)-基于反射原理实现手动确认模式下消息的自动接收

前言RabbitMQ在消费消息时,有两种处理方式:第一种:自动确认模式,也是默认模式,消息会在到达消费者之后立即从队列删除,不管消费端是否成功消费该条消息。这样情况下,如果消费者在消费消息过程中出现异常,或者网络等因素导致消费失败,那么消息就丢失了,适用于消息不太重要的场景,比如推送通知等;第二种:手动确认模式,为了解决自动确认模式下造成消息丢失的情况,需要引入消息确认机制。有两种实现,一种是消息改为手动确认,也就是说只有消费者完成消息消费,手动确认消息,消息才回从队列中删除掉;另一种是事务控制。在实

2020-09-17 17:07:29 1694

原创 基于spring源码将对象以手动方式注册到spring容器

前言Spring 中用BeanDefinition接口描述一个bean,描述对象的信息,依赖的信息,Spring容器中用ConcurrentHashMap<String, BeanDefinition> beanDefinitionMap存储beanName和BeanDefinition对象的映射关系【beanDefinitionMap 可参考DefaultListableBeanFactory】。Spring在实例化一个bean,都是先从 beanDefinitionMap 中获取bea

2020-09-17 16:16:16 1839

原创 RabbitMQ系列(3)-控制台手动添加消息

前言在业务场景中,有时候我们会遇到这样的问题:用户下单后,给支付系统发送一条消息,但是,由于网络波动或者支付系统bug问题,导致支付系统没有能够成功消费该消息,这个时候,不应该让用户重新去下单,而是可以帮助用户手动解决该问题,让后面支付、合同、工单、外勤等系统接着往下走流程,就可以在控制台手动添加消息来解决,从而使流程能够跑通,作为暂时解决问题的手段之一。实现打开RabbitMQ控制台,按照如下配置进行设置:参数说明:Payload:消息内容,json格式即可;content_type:消息内

2020-09-17 14:00:00 5182 2

原创 RabbitMQ系列(2)-TTL实现延迟消费

前言延迟消费在实际开发中有很多的应用场景,例如:一条消息,需要在30分钟后消费,这个时候就可以使用消息的TTL属性实现延迟消费。具体的实现思路:生产者发送消息 -----> 交换机 ------> 路由到消息队列(设置消息的TTL属性,表示消息失效后路由到死信交换机) ----> 死信交换机 ----> 路由到死信队列,从私信队列中消费具体代码生产者和消费者代码/** * 消息生产者. * 消息通过正常交换机路由到正常队列,在正常队列中设置消息TTL最大存活时间,超过时

2020-09-16 18:26:10 1453

原创 RabbitMQ系列(1)-工作模式介绍

前言RabbitMQ是生产环境中常用的消息中间件,文章对其原理及使用做了详尽的介绍,包含其工作原理、所有的工作模式、死信、如何优雅的使用手动确认模式、延迟消费TTL、控制台手动添加消息等,如果感兴趣可以查看该系列其他的文章。本章部分内容参考了其他文章,在此表示感谢。RabbitMQ的作用同步变异步消息场景:用户下单完成后,发送邮件和短信通知。可以将发邮件和发短信使用MQ完成,不影响主流程。应用解耦合场景:用户下单后,订单系统需要多渠道通知用户。流量削峰一般在秒杀或者团购活动中使用。场景:

2020-09-16 18:04:15 1277

原创 SQL语句中Update和Insert语句合并

前言在实际开发中,经常遇到更新和插入操作,很多时候,我们会将两个方法的sql合并为一个,即可以实现插入操作,也可以实现更新操作,下面给与详细的示例sql实例mapper方法:Integer batchUpdatePilicoinAward(List list);<insert id="batchUpdatePilicoinAward"> insert into royalty_detail (trade_id,pilicoin_award,update_time,award_s

2020-09-15 15:26:29 8719

原创 Idea配置多个git账号步骤

Idea配置多个git账号步骤前言需求描述详细步骤合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入前言很多时候,我们的Idea需要同时配置多个git账号,例如一个账号是公司开发账号,一个是个人开发账号,就需要在同一个Idea中配置两个账号

2020-09-15 15:02:08 8133 4

Prometheus、grafana、alertmanager安装文件.rar

Prometheus、grafana、alertmanager三个软件的安装包,其中Prometheus、alertmanager是tar.gz格式,grafana安装包是rpm格式,都是linux系统安装包

2020-09-17

空空如也

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

TA关注的人

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