自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Nginx学习笔记12——Nginx高可用和keepalived

单机nginx,负载均衡到应用服务器如果只靠负载均衡完成nginx的高可用,这样就可以了吗?不行,如果第一个nginx挂了,那么服务也就停止了,所以还得加,以此类推,陷入了死循环,所以通过负载循环实现高可用的方案是不行的keepalived为当前提供服务的Nginx服务器生成一个虚拟ip地址,客户端是对虚拟ip发出请求的,keepalived会不断判断当前提供服务器的nginx服务器是否宕机,如果宕机则会通过选举机制来投票选出另一台nginx服务器提供服务,并将虚拟ip地址切换到将提供服务的ng

2022-06-23 10:53:50 1024 1

原创 Nginx学习笔记11——防盗链与http的referer

http协议中的referer,用来表示来源,当请求html页面时没有referer,但是因为html中引入了css、js、img等静态资源,这些静态资源都需要一个来源,所以referer就表示了这个来源。盗链就是当referer是其他站点通过代理、html中的引用都一些方法访问到我们这个站点的静态资源来生成的,域名不是我们自己的域名。我们可以利用referer来防止盗链,通过判断取到的referer是不是我们自己想要的域名,如果是就继续访问,否则进行拦截。目前四个虚拟机,CentOS7-1是Nginx

2022-06-23 10:42:31 3074

原创 Nginx学习笔记10——配置Nginx网关服务器

我们想要这种效果,就是对于外网,是无法直接访问tomcat服务器的,只能通过nginx,也就是内网来代理tomcat进行访问,此时nginx可以称为网关服务器,并且它还包括了反向代理、负载均衡、动静分离功能启动tomcat服务器的防火墙开启防火墙后就无法访问tomcat服务器了使用nginx代理tomcat服务器也无法访问在tomcat服务器上添加防火墙规则,指定nginx的ip地址才可访问8080端口加完规则后不是实时生效,需要重启防火墙使用nginx服务器代理tomcat服务器

2022-06-23 10:15:30 1511

原创 Nginx学习笔记09——URLRewrite伪静态

因为jsp获取url参数很方便,所以需要将tomcat服务器上的index.html转为jsp格式的,方式是在html文件开头加上,文件拓展名改为jsp即可。也可以将上篇笔记Nginx学习笔记08——Nginx动静分离中下载的jsp文件直接替换掉tomact服务器上的html文件再发一下网盘链接:https://pan.baidu.com/s/1Pbh-G9Q92hu5nVsJCb_1jA提取码:wagi修改jsp文件,在这行注释下面加上这几行代码(注意代码位置),目的是获取ur...

2022-06-23 10:14:42 373

原创 Nginx学习笔记08——Nginx动静分离

在生成页面的时候,Nginx会代理Tomcat服务器,将动态请求转发给Tomcat服务器,在Tomcat服务器上某一目录下找到html文件,加载到页面上,在html文件中,还会访问很多静态资源,如js、css、img等,这些静态资源我们会放在Nginx服务器上,也就是Tomcat上是没有的,直接从Nginx中拿出来就行,这就是动静分离。从上面的描述上来看,我们需要使用到两台虚拟机,目前我们是有4台虚拟机,从中选择两台就好了,那就CentOS7-1作为Nginx服务器,CentOS7-2作为Tomcat服务器

2022-06-22 16:02:55 194

原创 在Linux上安装部署JDK和Tomcat(超级详细)

Tomcat8+JDK8的安装包已经上传到百度网盘网盘地址:https://pan.baidu.com/s/1lVLhNuuum4dn6t9szCpzWg提取码:ps25也可以自己去官网上下载Tomcat下载地址:https://tomcat.apache.org/JDK8下载地址:https://www.oracle.com/java/technologies/downloads/#java8下载好后得到两个压缩包在Linux系统的/usr目录下新建两个文件夹(为了方便,我使用的是Xf

2022-06-22 14:19:09 402

原创 Nginx学习笔记07——Nginx负载均衡

配置负载均衡会用到三台虚拟机,如下修改CentOS7-1的配置文件,使用proxy_pass来反向代理upstream,在upstream中配置两台Nginx服务器(注意upstream的名称和proxy_pass反向代理的域名一致)修改好CentOS7-2和CentOS7-3的index.html,用来区分,之后将CentOS7-1、CentOS7-2、CentOS7-3三台Nginx服务器都打开浏览器中访问CentOS7-1的ip地址,会发现浏览器会在CentOS7-2和CentOS7-3两

2022-06-22 14:03:47 948

原创 Nginx学习笔记06——Nginx反向代理

正向代理用户和外网不能互通,通过代理服务器将用户请求发送给外网反向代理用户和nginx是互通的,用户和应用服务器是不互通的,用户发送请求到nginx,nginx作为代理将请求发送给应用服务器(如tomcat等),tomcat接受nginx的请求处理好后将结果发送给nginx,nginx将结果发送给用户如下图,是隧道式代理(瓶颈在于nginx代理服务器,即使应用服务器的带宽很大,但是如果代理服务器的带宽很小,那么请求都会阻塞到代理服务器)反向代理和正向代理的区别是代理服务器的提供方不同,对于反向

2022-06-22 11:24:49 593

原创 Nginx学习笔记05——Nginx虚拟主机配置

多个域名对应到一个ip地址上,由nginx服务器端判断访问的是哪个域名,也就是访问不同的目录如果是单机,http协议请求头不需要加域名如果两个域名同时解析到一个ip地址,在请求头上加上域名,用来区分不用目录的资源在下面目录找到hosts文件修改host文件,下面加上ip地址和域名如果不能保存,修改host文件的权限改为完全控制修改host文件完成后,使用域名访问创建两个站点,一个是视频站点vedio,一个是音乐站点music目录分别为和分别在两个站点目录下创建index页面,也就是跳

2022-06-22 10:54:54 224

原创 Nginx学习笔记04——Nginx基础配置

使用Xftp进入目录下打开nginx.conf配置文件,将所有带注释的代码全部删除以下是各行代码的解释这个mine.types文件是用来定义返回的content-type的可以看到,不同类型的请求文件,对应的content-type不同这是零拷贝,可以选择打开和关闭关闭sendfile开启sendfile...

2022-06-21 16:24:04 400

原创 Nginx学习笔记03——Nginx目录结构和基本运行原理

使用Xftp进入目录主要的配置文件,这个配置文件会引用其他的配置文件网页和静态资源,index.html是默认主页,50x.html是报50x错误时显示的页面记录日志,access.log记录用户访问日志,error.log记录报错日志,nginx.pid记录nginx主进程的id号nginx主进程文件...

2022-06-21 16:16:21 168

原创 Nginx学习笔记02——安装部署Nginx

VMware和CentOS7安装VMware虚拟机,在VMware中安装CentOS7操作系统,我这边只提供Vmware和CentOS7的下载地址,网上有很多教程,一步一步跟着安装就行。VMware下载地址(下载Windows版本的就行):https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.htmlCentOS7镜像下载地址:http://mirrors.aliyun.com/centos/7.9.

2022-06-21 16:12:17 402

原创 Nginx学习笔记01——引言

因为自己对SpringCloud没有了解,而Leader告诉我现在alibaba的SpringCloud比较主流,十分推荐我们学习,所以我就兴致勃勃地打开B站,搜索相关的教程。引入眼帘的就是尚硅谷的SpringCloud教程,这播放量,就它了,又可以白嫖了!先看课程介绍,什么?前置知识需要会Nginx,这是个什么玩意,没听说过啊,好吧,只能慢慢来了,点开了尚硅谷的Nginx教程,开始学习。现在已经学完了核心技术篇,所以打算将我记录下来的所有笔记总结到这里,方便之后进行复习,也分享给大家,从安装虚拟机,到

2022-06-21 15:09:12 175

原创 Spring IOC仿写,实现基于配置文件和注解注入,超级详细

前言本篇文章是基于上次对Spring IOC和AOP的仿写扩展的,最好先看一下之前的那篇文章:仿写Spring IOC和AOP,仿写思路和代码讲解上次仿写的IOC是基于配置文件实现注入的,这次拓展了基于注解的注入,同时调整了实现IOC的整体架构,改动的地方还是很多的,所以我会重新讲解实现IOC的整体思路和代码实现整体思路先来说一下整体的设计思路:首先要对配置文件进行扫描如果扫描到了<component-scan base-package="com.pojo"/>,说明开启了对注解的

2022-03-30 00:22:51 543

原创 dubbo-admin2.7一步一步配置安装流程,很详细

Zookeeper首先去Zookeeper的官网上下载Zookeeper:Zookeeper官网我这里下载的是3.7的,上面描述了3.7是最新的稳定版下载后解压得到apache-zookeeper-3.7.0-bin文件夹,在bin目录下使用cmd运行zkServer.cmd,这个就是zookeeper的服务端zkServer.cmd发现报错了,报错的原因是没有zoo.cfg配置文件,这个文件在根目录下的conf文件夹下,可以看到有一个zoo.sample.cfg文件,这个文件就是配置文件

2022-03-24 17:06:59 2650 3

原创 打包时出现Downloading https://...to

这种情况就是文件下载不下来,我们可以手动下载先把前面的链接复制下来https://nodejs.org/dist/v9.11.1/node-v9.11.1-win-x64.zip 放到浏览器中,跳转后应该就会自动开始下载这个文件复制后面那个地址,去资源管理器中找一下,可以发现这个文件确实没有下载下来,是0KB我们把刚才下载的那个文件复制到这里删除没有下载好的那个,把自己下载那个文件的名字修改一下,这样就好了再次执行打包命令应该也不会报这个错误了...

2022-03-24 16:28:00 858

原创 线程的状态有哪些,怎样流转的

新建状态:创建一个线程时的状态就绪状态:新建的线程不自动开始运行,需要调用start方法,调用之后即启动了线程,进入就绪状态运行状态:当线程获得cpu时间片后,进入运行状态,开始执行run方法阻塞状态:线程还没有结束,暂时让出cpu给其他线程,情况如下通过调用sleep方法调用一个在i/o上被阻塞的操作试图获得一个锁,但是该锁正被其他线程持有着等待某个触发条件死亡状态:run方法执行完退出线程自然死亡一个未捕获的异常终止了run方法使线程突然死亡...

2022-03-22 21:38:51 155

原创 synchronized与ReentrantLock的区别

Synchronized的实现设计锁升级,无锁 偏向锁 轻量级锁 重量级锁,ReentrantLock的实现利用cas保证线程操作原子性和volatile保证可见性Synchronized不需要用户手动释放锁,代码执行完后会自动释放,ReentrantLock需要手动释放,否则可能会导致死锁Synchronized是不可中断类型的锁,ReentrantLock可以中断,通过trylock设置过期时间或者使用interrupt方法来中断Synchronized是非公平锁,ReentrantLock可以.

2022-03-22 21:31:53 105

原创 乐观锁与悲观锁讲解,CAS、synchronized、锁升级、ReentrantLock、AQS

什么是乐观锁和悲观锁乐观锁:总是假设最好的情况,每次拿数据的是时候都认为别人没有进行修改,所以不会加锁,但是为了保证线程安全,每次修改的时候都会判断这个数据有没有被修改过,适用于写少的场景,因为在写操作较多时如果失败会不断通过自旋判断数据有没有被修改,十分消耗CPU资源,CAS是实现乐观锁的一种方式,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。悲观锁:总是假设最坏的情况,每次拿数据的时候都认为别人会修改数据,所以每次

2022-03-22 14:07:38 1290

原创 ConcurrentHashMap讲解

什么是ConcurrentHashMapConcurrentHashMap是线程安全且高效的HashMap为什么要使用ConcurrentHashMapHashMap可能导致程序死循环线程安全的HashTable效率非常低下线程不安全的HashMap下面代码使用HashMap进行put操作会引发死循环,CPU利用率接近100%,所以不能使用HashMap final HashMap<String, String> map = new HashMap<String, Str

2022-03-21 23:05:55 2753

原创 浏览器中输入URL后发生了什么

解析URL解析应用层协议类型,比如http、https、ftp等解析域主机,比如http默认是www解析域名,比如baidu.com解析主机端口,比如http默认是80端口,https默认是443解析资源路径,就是第一个/后面的东西解析资源名,就是最后一个/后面的东西查询DNS浏览器不能直接通过域名找到对应的服务器,只能通过ip地址,所以要根据域名去查询ip地址,一般会通过浏览器缓存、操作系统缓存、路由缓存等查询TCP/IP的连接与断开共有四层,再发生方那里,每一层都会加上一个头部再

2022-03-21 18:18:01 2934

原创 仿写Spring IOC和AOP,仿写思路和代码讲解

前言因为自己在反射和代理这方面用的不多,所以掌握的不太好,正好在看spring的ioc和aop,这两个机制多多少少都用到了反射,尤其是aop,还用到了代理模式,所以借此机会简单仿写一下spring的ioc和aop,花了两天时间终于做好了,思路我觉得还是比较清晰的,记录在这里吧IOC仿写说明一下,我只仿写了通过配置文件注入的方式,注解的方式等以后我可以也会做出来如果不太清楚IOC的朋友可以看我写的另外一篇博客:IOC讲解首先理清一下思路:肯定要有个实体类,通过配置文件的bean标签和proper

2022-03-20 23:31:18 511

原创 仿写HashMap,思路清晰

最近在看HashMap的源码,了解了HashMap的原理和方法实现的过程,觉得如果自己仿写可以简单仿写一个HashMap可能就会更加清楚了,说干就干。说明一下,自己只仿写了put和get方法,其他方法其实大致原理差不多。首先,HashMap的底层是一个数组,数组中的元素Node有四个属性,Key,Value,Key的Hash值和为了解决产生Hash冲突而设置的Next结点,如下:class Node<K,V>{ K key; V value; int hash;

2022-03-19 13:51:21 704

原创 链表相交(Java)

思路:设A链表长度为a,B链表长度为b,两个链表的交集长度为c,那么从A链表头结点开始,走完自己一遍之后,再走B链表,走到相交结点,需要的步数为a + (b - c),同样,对于B链表,从头结点开始,走完自己一遍,再走A链表,走到相交结点,需要的步数为b + (a - c),可以发现,a + (b - c) = b + (a - c),所以,让他们同时开始走,如果有相交结点,总会相遇的,而相遇时共同指向的那个结点就是相交结点,如果没有相交结点,那他们就会把两个链表都走完,最终全是null,两种情况最后只.

2022-03-12 14:33:10 1222

原创 Java观察者模式讲解及代码实现

概念观察者模式又叫做发布-订阅模式,是对象间的一对多的关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新组成抽象主题角色(Subject)也叫抽象目标类,抽象主题知道自己的观察者有哪些,提供删除和新增观察者的方法以及通知观察者的抽象方法,由抽象类或接口实现抽象观察者角色(Observer)包含了一个更新的抽象方法,当收到具体主题的更新通知后调用,由抽象类或接口实现具体主题角色(Concrete Subject)也叫具体目标类,实现抽象目标类的通知方法,当具

2022-03-03 17:11:34 4523

原创 Java单例模式讲解和实现及相关问题总结

特点单例类只能有一个实例。单例类必须自己创建自己的唯一实例。单例类必须给所有其他对象提供这一实例。懒汉式单例在第一次调用getInstance方法的时候实例化public class Singleton { public static Singleton singleton = null; private Singleton() { } public static Singleton getInstance(){ if (singleton

2022-03-02 23:47:54 510

原创 Java的三种工厂模式

场景:一家饭店菜单上有两种饭,分别是黄焖鸡米饭和河北正宗安徽牛肉板面,顾客点餐我们要做出顾客选的那种饭首先肯定是有一个接口Cook,cook方法表示做饭public interface Cook { void cook();}创建两个类来实现Cook接口public class CookMi implements Cook{ @Override public void cook() { System.out.println("黄焖鸡米饭"); }

2022-03-01 19:57:48 886

原创 如何保证MQ消息队列的可靠性传输

MQ的基本原则:数据不能多一条,也不能少一条,不能多,就是要保证幂等性,不能少,就是要保证可靠性,数据不能发生丢失RabbitMQ生产者丢失数据可能在生产者向RabbitMQ发送消息的中途发生数据丢失第一种方法是使用RabbitMQ提供的事务机制,在生产者发送数据之前开启RabbitMQ 事务channel.txSelect,然后发送消息,如果该消息没有接收到,就会发生异常,然后执行回滚事务channel.txRollback,然后重新发送消息即可,如果收到了消息,就执行提交事务channel.tx

2022-03-01 10:15:23 652

原创 如何保证MQ消息队列的幂等性

对于每个消息,都有一个offset,用来代表这条消息的序号,消费者消费了消息之后每隔一段时间都会把自己所消费的消息的offset提交一下,下次消费的时候就按上次的offset接着来。这样就会出现一个问题,如果消费者已经消费了一条消息,在提交之前,消费者进程被重启了或者发生意外宕机了,这样的话,当消费者再次启动之后,它还会重复消费这条消息,如果消费者对消息的处理是在数据库中插入一条记录,那么这样的话就会重复插入两个一样的记录,显然是不正确的。那么我们要怎样保证幂等性呢?假如消费者在消费消息的时候会往数据库

2022-02-27 22:45:27 1733

原创 如何保证MQ消息队列的高可用

RabbitMQ对于RabbitMQ,有三种模式,分别是单机模式,普通集群模式、镜像集群模式,其中镜像集群模式可以实现高可用单机模式一台RabbitMQ实例,想想都不可能保证高可用,一般在开发中也不会使用单机模式普通集群模式有多台RabbitMQ实例,每个都放在单独的机器上,生产者生产出的queue只放在其中一个RabbitMQ实例上,其他实例上存放的是queue元数据(元数据存放一些RabbitMQ的配置信息,可以通过元数据找到拥有实际数据的queue),如果消费者拉取的正好是放有queue实际

2022-02-26 19:09:24 2294

原创 什么是MQ消息队列

什么是消息队列相当于存放消息的一个容器,生产出来的消息都放到这个容器里面,如果我们想使用消息就直接从容器中取即可,是分布式系统中重要的组件,常用的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能。为什么要使用消息队列解耦使用发布订阅模式,生产者发布消息,消费者订阅消息,生产者把消息放到分布式消息队列中就结束了对这个消息的管理,消费者从分布式消息队列中

2022-02-25 22:32:26 1552

原创 HashMap和TreeMap的区别

HashMap和TreeMap都是非线程安全的HashMap通过hashcode()对元素进行快速查找,元素没有顺序TreeMap中的元素都是有序的HashMap继承了AbstractMap类,覆盖了hashcode()和equals()方法,以确保两个相等的映射返回相同的哈希值TreeMap不仅继承了AbstractMap类,还实现了SortedMap接口,每个添加进TreeMap的元素都会实现Comparator接口,以此实现对存入元素的排序HashMap是基于哈希表实现的,我们可以对初始容.

2022-02-25 15:42:31 511

原创 ArrayList和LinkedList的区别及源码分析

数据结构不同ArrayList是基于动态数组实现的LinkedList是基于链表实现的效率不同当随机访问(set和get)时,ArrayList的效率是高于LinkedList的。因为ArrayList只需设置或查找相应下标的值即可,而LinkedList需要移动指针到下标处的结点再访问当在指定下标添加和删除(add和remove)时,LinkedList的效率和ArrayList的效率就需要分情况讨论了,ArrayList在进行增删操作时需要移动下标后的所有元素,LinkedList需要.

2022-02-25 15:08:15 580

原创 TCP的三次握手和四次挥手及相关问题解答

字段含义seq: 报文序列号,4个字节,用来标记数据段的顺序,每个报文对应一个序列号ack: 确认号,4个字节,表示期待收到的下一个报文段的序列号,确认号当前序列号+1SYN: 请求建立连接,SYN=1表示请求建立连接ACK: ack确认号标志位,ACK=1表示确认号有效FIN: 请求终止连接,FIN=1表示请求终止连接三次握手第一次握手:A向B发送连接请求,SYN=1,并且随机生成一个序列号seq=x,发送完毕后进入同步已发送状态第二次握手:B收到A发送的连接请求,首先确认A向B的连

2022-02-25 02:05:25 1091

原创 TCP和UDP的区别和使用场景

区别:TCP是面向连接的,传递数据前会通过三次握手来建立连接,UDP是无连接的,发送数据时不需要建立连接TCP是可靠,稳定的,在数据传递时有确认重传、滑动窗口、流量控制、拥塞控制机制,传递的数据是无差错、不丢失、不重复、按序到达的,传递数据比较慢,占用资源高,UDP没有那些机制,不保证数据的可靠传递,传递数据比较快,占用资源低TCP因为有很多机制来保证数据可靠传递,所以很容易被人利用,实现DOS、DDOS、CC等攻击,UDP没有这些机制,被利用的漏洞比较少,但也是无法能够避免攻击的,如UDP Flo

2022-02-25 00:27:47 1404

原创 MySQL事务隔离级别

什么是事务?事务是逻辑上的一组操作,这一组操作要么都执行,要么都不执行。用银行转账作为一个例子,假如小明要去银行给小红转账1000元,需要进行的操作有,小明余额减少1000,小红余额增加1000,如果在这两个操作中间突然出现了错误,比如银行转账系统崩溃,导致了小明余额减少1000,但是小红余额不变,这样就不对了,所以事务就是要保证这两个操作要么都成功,要么都失败事务的特性(ACID)原子性事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么全部失败一致性执行事务前后

2022-02-22 14:16:28 439

原创 数据库索引详解

什么是索引?索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash。索引的优缺点优点大大加快数据的检索速度(大大减少的检索的数据量),大部分系统都是读请求大于写请求的通过建立唯一索引,可以保证数据库中数据的唯一性缺点创建索引和维护索引需要耗费许多时间,如果对表中的数据进行增删改操作时,索引也需要进行修改,降低了效率占用物理存储空间,索引需要使用物理文件进行存储,会占用一定的空间B树和B+树B树所有结点既存放键(Key),也存放数据(da

2022-02-21 17:05:32 755

原创 Spring AOP详细配置与使用实例

什么是AOPAOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续。是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP在Spring的作用提供声明式事务:允许用户自定义切面横切关注点:跨越应用程序多个模块的方法或

2022-02-18 15:02:42 546

原创 Spring IOC详细配置与使用实例

IOC理论推导新建一个maven项目,导入以下依赖<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.12</version></dependency>UserDao接口public interface UserDao {

2022-02-18 14:53:21 835

原创 HashMap和Hashtable有什么区别

HashTable是同步的,线程安全,HashMap是不同步的,线程不安全,但是HashMap的效率比HashTable高HashTable继承自Dictionary类,HashMap继承自AbstractMap类HashMap去掉了HashTable中的contains方法,但是多了containsValue和containsKey方法HashMap允许有null,HashTable不允许有nullHashMap使用Iterator进行遍历,HashTable使用Enumeration进行遍历.

2022-02-14 20:50:34 410

空空如也

空空如也

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

TA关注的人

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