自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 设计模式-Decorator(装饰器模式)

装饰器模式,顾名思义,就是给一个行为或者对象添加上自己想要的各种装饰,那么下面我们看这个需求场景。

2023-03-26 14:24:25 122

原创 设计模式-抽象工厂模式

工厂模式在我个人的理解来看,我认为工厂模式顾名思义就是像一个工厂一样把所有的零件组装起来最后生产出一个完整的成品,在工厂模式中主要是分为这四种角色,抽象工厂,具体工厂,抽象产品,具体产品,所有代码如下抽象产品Foodpublic abstract class Food { abstract void printName();}抽象产品Weaponpublic abstract class Weapon { abstract void shoot();}抽象产品Vehicl

2023-03-26 11:20:23 129

原创 设计模式-策略模式

在Main类中,定义了一个整型数组a,然后调用Sorter类中的sort方法对整型数组进行排序,最后对整个数组做输出。在Sorter中定义sort方法,sort方法中使用了简单排序算法(由于该排序算法的时间复杂度是o(n^2),所以不建议数据量的大的数组使用该方法进行排序)最后得到的结果是一个从小到大排序好的数组。此时,就会产生相应的问题,如果说此时排序的数组变成了float类型,double类型,那么就算我们上面可以复制那段代码,把整型数组代码换成其他各种类型,这就造成了代码十分冗余的情况产生,那么此

2023-03-25 19:35:47 141

原创 设计模式-单例模式

【代码】设计模式-单例模式。

2023-03-23 20:36:15 108

原创 spring整合dubbo实现跨服务调用

spring整合dubbo实现多个服务之间相互调用最近刚学习了dubbo,一个开源优秀的RPC框架,使用的是spring整合dubbo实现多服务之间调用,当然现在基于注解版本的,以及整合springboot版本的都已经实现,可以在dubbo官网中查看,以后也会慢慢更新相应的博客,所以这里从最基本也是最繁杂的spring配置文件开始。在实现这个服务相互调用之前,我们有必要了解dubbo的整体架构。Dubbo Register:dubbo注册中心,服务提供者启动时将服务注册到注册中心中,服务消费者启动时从

2022-04-14 16:27:59 2272 1

原创 linux服务器(虚拟机)上安装nginx以及基本命令

linux服务器(虚拟机)上安装nginx以及nginx基本命令最近了解到nginx具有反向代理和负载均衡等强大功能时,所以自己在网上找了点学习资料学习nginx,学习任何事情事情第一步,就是要先把该东西安装好。所以此处,我们就介绍如何在linux上安装nginx。下载安装nginx之前需要下载相关依赖,1.1下载pcre依赖。我这里是直接用wget指令在linux服务器中直接下载。指令如下所示:wget http://downloads.sourceforge.net/project/pcre/pc

2022-04-08 23:45:02 3315

原创 RabbitMQ之备份交换机

在RabbitMQ中,我们并不知道该如何处理这些无法路由的消息,最多打个日志,然后触发报警,再来手动处理。而通过日志来处理这些无法路由的消息很不优雅,特别是所在的服务器有多台机器的时候。所以这里就可以使用备份交换机来把这些无法路由的消息全部放到备份交换机的备份队列里面。代码架构图:配置类代码如下所示:@Configurationpublic class ConfirmConfig { //交换机名称 public static final String CONFIRM_EXCHAN

2022-04-04 16:50:02 1901

原创 RabbiiMQ借助队列TTL实现延迟队列

队列TTL代码架构图创建两个队列QA和QB,两者队列TTL分别设置为10s和40s,然后再创建一个交换机X和死信交换机Y,他们的类型都是direct,创建一个死信队列QD,他们的绑定关系如下:队列和交换机配置类代码@Configurationpublic class ExerciseTtlQueueConfig { private static final String X_EXCHANGE = "X"; private static final String QUEUE_A =

2022-04-04 16:08:43 1514

原创 RabbbitMQ之死信队列的三大来源(TTL,队列最大长度,消息被拒绝)

死信队列死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer将消息投递到broker或者直接到queue里了,consumer从queue取出消息进行消费,但是某些时候由于特定的原因queue中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信当然就有死信队列。死信的来源1.消息TTL过期2.队列达到最大长度(队列满了,无法再添加数据到mq中)3.消息被拒绝死信队列代码架构图可以看出死信消息的处理过程是与正常队列有关,如果消息在正常队列中不

2022-04-04 14:30:28 638

原创 RabbitMQ之主题交换机

RabbitMQ之主题交换机RabbitMQ中的交换机大致分为四种,默认,直连(Direct),主题(Topic),扇形(Fanout),其中灵活性最大的应该算是Topic主题交换机了。主题交换机中的路由键有两个替换符需要大家注意到:*(星号)可以代替一个单词#(井号)可以代替零个或多个单词主题交换机生产者代码public class EmitLogTopic { public static final String EXCHANGE_NAME = "topic_logs";

2022-04-04 12:40:19 2183

原创 RabbitMQ之直连交换机(Direct exchange)

直连交换机上一篇博客中讲解了扇形交换机,但是由于扇形交换机属于广播类型的交换机,如果我们需要一对一这种类型的发送接收消息,使用扇形交换机就不太合适,可以使用直连交换机。直连交换机直连交换机生产者代码public class DirectLogs { //交换机的名称 public static final String EXCHANGE_NAME = "direct_logs"; public static void main(String[] args) throws E

2022-04-04 12:17:42 1102

原创 RabbitMQ之扇形交换机

ExchangesExchange概念RabbitMQ消息传递模型的核心思想是:生产者生产的消息从不会直接发送到队列中,而是发送到交换机,并且生产者都不知道这些消息 传递到了那些队列中。交换机总共有以下几种类型:扇形交换机(fanout),主题交换机(topic),直联交换机(direct),默认交换机(“”)在前面博客中我们直接声明一个队列,然后交换机那块直接使用“”代替,实际上我们使用的就是默认或无名称交换机。消息能够发送到队列中是由于routingkey绑定的key指定的。此处表示默认交换

2022-04-03 18:09:32 1159

原创 RabbitMQ之发布确认(单个发布确认,批量发布确认,异步发布确认)

RabbitMQ之发布确认发布确认原理生产者将信道设置成confirm模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者,(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,,broker回传到生产者的确认消息中delivery-tag域包含了确认消息的序列号。confirm模式最大的好处在于

2022-04-03 17:22:53 2733 3

原创 RabbitMQ持久化,不公平分发,预取值

RabbitMQ持久化默认情况下RabbitMQ退出或由于某种原因崩溃时,他忽视队列和消息,除非告知它不要这么做。确保消息不会丢失需要做两件事情:我们需要将队列和消息都标记为持久化。队列如何实现持久化队列创建时如果没有选择持久化,那么rabbitmq重启时,该队列就会被删除,如果要实现队列持久化,只需要在生命队列时把持久化参数(durable)设置为true,则队列就会自动设置成持久化队列。就是有一点需要注意,如果在声明该队列为持久化队列之前,该队列在rabbitmq中已经存在,并且不是持久化的,

2022-04-03 12:19:43 339

原创 RabbitMQ之手动应答消息(消息不丢失)

RabbitMQ之手动应答消息1.为什么需要手动应答当消费者完成一个任务需要一段时间,如果其中一个消费者处理一个长的任务并且只处理了部分突然他挂掉了,会发生什么情况。RabbitMQ一旦向消费者传递了一条消息,便立即将该条消息标记为删除。在这种情况下,突然有个消费者挂掉了,我们将丢失正在处理的消息。以及后续发送给该消费者的消息,因为他无法接收到。2.应答分类2.1手动应答相应的,使用手动应答时,需要把autoAck属性设置为false,然后进行手动应答。消息手动应答 有如下几个方法A.Chan

2022-03-25 21:26:55 3927 1

原创 RabbitMQ之轮询模式

RabbitMQ之轮询模式 在这个案例中我们会启动两个工作线程,一个消息发送线程,两个工作线程。然后在发送线程中不断发送消息,验证两个工作线程是以何种方式拿到消息的。1.发送消息线程代码public class ExerciseT { private static final String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException

2022-03-25 19:51:22 2815

原创 RabbitMQ进行简单的消息发送和消费

RabbitMQ进行简单的消息发送和消费在完成该功能之前,需要在虚拟机上下载安装rabbitmq,并且通过网页可以访问到rabbitmq server,可以参考我的上篇文章linux上下载以及安装rabbitmq1.不管使用什么组件,第一步都是导入相关依赖 <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</a

2022-03-25 17:02:42 4628

原创 Git报错关于 refusing to merge unrelated histories

refusing to merge unrelated histories把远程仓库的地址都配置好了之后,执行git pull操作,往往会出现如上图所示 报错信息,这个问题出现的根本原因就是本地的库和远程的库本质上是两个库,如果是直接从git上面clone过来的项目则不会出现该报错信息,在termianl中执行下列这条命令git pull origin master --allow-unrelated-histories。 。当出现如下图所示图像时就可以正常的git pull push操作。

2022-03-21 12:45:45 210

原创 linux虚拟机上下载安装rabbitMQ

centos虚拟机中从头开始搭建rabbitmq服务

2022-03-20 22:13:43 2133

原创 RabbitMQ入门知识&&基本概念

MQMQ(Message Queue),顾名思义,MQ即为消息队列,其本质也就是一个队列,遵循先进先出的规则,是一种跨进程的通信机制,用于上下游传递消息,可以实现物理解耦+逻辑解耦。使用MQ的作用?(为什么要使用MQ)1.流量削峰 例如一个订单系统中一次最多只可以处理一万个订单,但是在峰值的时候可以达到两万次甚至更多,这时候使用消息队列,进入队列排队,虽然会出现响应不及时的问题,但是不会出现用户不能下单的问题,实现流量削峰。2.应用解耦 一个大型系统中由许多小模块组成,当其中一个模块调用其他模

2022-03-13 23:24:01 1981

原创 2021-09-09

MarkDown学习一级标题设置,#加上空格,然后标题内容,回车即可产生效果二级标题就是前面有两个#号,加空格,标题内容,然后回车二级标题三级,四级标题以此类推。字体Hello,World两边都加上两个*号就变成粗体Hello,World两边每边一个*号就会变成斜体如果既要斜体,又要粗体,直接每边三个*号就可以Hello WorldHello World两边两个~号就会出现上面的效果图#### 引用选择狂神说java,走向人生巅峰

2021-09-09 14:09:07 59

原创 springboot整合mybatis实现简单的一对多级联查询

本文的目的是用springboot整合mybatis实现一个简单的一对多查询。(查询一个用户有多少件衣服)第一步:数据库中,可以直接在navicat中建立两张我们需要用到的表usersDROP TABLE IF EXISTS `users`;CREATE TABLE `users` ( `id` int(0) NOT NULL AUTO_INCREMENT, `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_a...

2021-08-21 18:13:26 881 3

原创 部分全局函数

&lt;script&gt;   var str = "张三";   //alert(encodeURI(str));后面的全部都是运行结果,下同//%E5%BC%A0%E4%B8%89   //alert(encodeURIComponent(str));//%E5%BC%A0%E4%B8%89   //alert(decodeURI(encodeURI(str)));//张三   //aler...

2018-07-11 16:01:58 162

原创 Date String

Date对象:getTime()返回1970年1月1号至今的毫秒数,用于解决浏览器缓存问题。match() 找到一个或多个正则表达式的匹配。substr()从起始索引号提取字符串中指定数目的字符substring()提取字符串中两个指定的索引号之间的字符。&lt;script&gt;   var str = "-a-b-c-d-e-f-";   var str1 = str.substr(2,4)...

2018-07-11 15:28:12 156

原创 Boolean对象

Boolean对象创建Boolean对象的语法:new Boolean(value);//构造函数Boolean(value);//转换函数如果value不写,那么默认创建的结果为false;

2018-07-11 14:56:35 140

原创 javascript内置对象

1.Array对象数组的创建:Array对象:Array对象用于在单个的变量中存储多个值。创建Array对象的语法:new Array();new Array(size);new Array(element0,element1,element2,element3,........elementn)数组的特点:长度可变!数组的长度=数组最大角标+1;...

2018-07-11 11:33:14 217

空空如也

空空如也

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

TA关注的人

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