-
设计模式集合-代理模式 TOP NEW
1. 原理 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。 代理模式的主要作用是扩展目标对象的功能,比如说在目标对象的某个方法执行前后你可以增加一些自定义的操作。 2. 静态代理 静态代理中,我们对目标对象的每个方法的增强都是手动完成的,非常不灵活。接口一旦新增加方法,目标对象和代理对象都要进行修改;需要对每个目标类都单独写一个代理类。 静态代理实现步骤: 定义一个接口及其实现类; 创建一个代理类同样实现这个接口; 将目标对象注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情。 示例: public interface SmsService { // 1.定义发送短信的接口 String send(String message); } // 2.实现... Read More
-
证书的概念及制作 TOP NEW
1. 概念 一般证书分有三类,根证书、服务器证书和客户端证书。 根证书:是生成服务器证书和客户端证书的基础,是信任的源头,也可以叫自签发证书,即CA证书。 服务器证书:由根证书签发,配置在服务器上的证书。 客户端证书:由根证书签发,配置在服务器上,并发送给客户,让客户安装在浏览器里的证书。 数字证书指的其实就是公钥证书(也可直接简称为证书)。在现代网络通讯中通行的公钥证书标准名为 X.509 v3, 由 RFC5280 定义。X.509 v3 格式被广泛应用在 TLS/SSL 等众多加密通讯协议中,它规定公钥证书应该包含如下内容: 证书 序列号(Serial Number): 用以识别每一张证书,在作废证书的时候会用到它 版本: 证书的规范版本 公钥(Public Key): 我们的核心目的就是分发公钥,因此显然要把公钥放在证书里面 公钥指纹: 即公钥的 Hash 值,当前大部分证书都使用 SHA25... Read More
-
NFS安装及原理介绍 TOP NEW
1.安装 1.1 环境准备 nfs服务端:10.10.5.10,nfs客户端:10.10.5.11,10.10.5.12 1.2 服务端安装 安装nfs服务端软件包 yum install -y nfs-utils 启动nfs服务并设置开机启动 # 启动服务 systemctl start nfs-server # 设置开机启动 systemctl enable nfs-server # 查看服务状态 systemctl status nfs-server 创建目录并设置权限 mkdir -p /nfs/data # /etc/exports文件内容的配置格式:/nfs/data *(insecure,rw,sync,no_root_squash) # 第一部分是配置共享的目录,此处是共享/nfs/data 个人觉得应该用/mnt/n... Read More
-
深入理解JVM(四) TOP NEW
概述 在前面的文章中我们介绍了JVM的运行时数据区,以及类加载的相关过程。在了解每一块内存区域的作用与类加载子系统之后,我们再来看看对象时如何创建和定位的。在语言层面,比如Java语言,我们创建对象通常是用一个关键字new来进行对象的创建,但是在虚拟机中,对象时怎么创建的呢?(注:这里所说的对象,限定于普通的Java对象,不包括数据和Class对象等) 对象的创建 虚拟机遇到一个new指令时,首先对去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析、初始化。如果没有,那必须先执行相应的类加载过程。如果类加载检查通过后,虚拟机会为新生对象分配内存,对象所需的内存大小在类加载完成后便可以完全确定。 1、对象内存空间分配 指针碰撞: 假设Java堆中的内存是绝对规整的,所有用过的内存放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点指示器,那么分配内存就仅仅是把那个指针向空闲空间那边移动一段... Read More
-
Windows环境下在Docker容器中运行一个Java服务 TOP NEW
预备工作 了解Docker相关的基本概念,容器,镜像等。这里有一个中文版的Docker入门实践,介绍了docker相关的基本概念和知识。 已经安装好了docker服务并确保可用。本文基于win 10,这里是安装教程:Install Docker for Windows 准备好一个可用的Java服务(本文基于springboot建立的一个服务) LET’S GO 1、用Dockerfile制作基础的ubuntu14.04镜像 Dockerfile是我们用来构建和制作docker镜像的基本文件,它定义了镜像的构成。新建一个文件夹命名为/docker,在此目录下新建文件夹/ubuntu-14.04,然后在此目录下新建一个文件命名为Dockerfile(虽然可以命名为其他名称,但是不建议,因为这个是约定俗成的)。这个时候你的目录应该是和下图一样,不一样也没关系,只要能进入这个Dockerfile所在的目录即可,我这样是为了看着清晰明了。 现在我们需要编写这个Dock... Read More
-
理解Java synchronized 关键字 TOP NEW
概念 在多线程编程中,线程安全问题是我们必须要面对的一个问题,Java中就使用了synchronized关键字来实现同步,在理解这个关键字之前,我们首先要明确一点,synchronized锁的不是代码,而是锁的对象。我们先看看下面的两个特性: 互斥性:在同一时间,只允许一个线程持有某个对象锁,这样就可以保证在同一时间只有一个线程在访问互斥资源,互斥性也成为原子性。 可见性:必须确保锁在释放之前,当前线程对于共享变量的修改,对下一个获得锁的线程来说,该修改是可见的(即获取到的共享变量的值是最新的),否则另一个变量获取到的变量值可能是之前缓存的副本,而不是最新的值。(Java中还有一个关键字volatile,它只保证可见性,但是不保证原子性) 实例锁和类锁 1、实例锁 Java中一个对象可以有多个实例,每个实例都有其各独立的实例锁,互不干扰,通常也称作“内置锁”或“对象锁”。对于同一个实例对象,在同一时刻只有线程可以访问这个实例对象的同步方法,不同的实例对象,并不... Read More
-
深入理解JVM(三)-Java内存区域 TOP NEW
概述 JVM在执行Java程序的过程中会把它所管理的内存区域分为多个数据区域,各个区域都其特定的用途,有的区域是线程共享的,有的区域是线程独有的。本文我们就根据JVM对内存的划分区域,对每一块区域的作用和概念做一个大致的了解。为了保证概念的准确性和描述的准确性,本文中的部分概念摘自《深入理解JVM(第二版)》,再加上一些自己的理解。根据Java虚拟机规范的规定,Java虚拟机所管理的内存包括了下图中的几个运行时数据区。(注:图中区域显示的大小,不代表实际的JVM中区域的大小比例) 程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。我认为它和计算机组成原理中的程序计数器作用完全是类似的,比如我们的程序中,需要执行循环,或者分支跳转,那么操作系统如何来判断应该如何循环,如何跳转,其实就是依赖于程序计数器的。JVM中的这个程序计数器,原理也是一样的。 ... Read More
-
深入理解JVM(二)-类加载子系统 TOP NEW
引言 上一篇文章中,对于JVM做了一个基础的概念性介绍,远远达不到需要我们掌握的程度,在上篇文章的末尾我给出了虚拟机的结构图。今天我们就来深入学习一下第一部分,类加载子系统(Class Loader SbuSystem)。为了便于阅读,我将类加载子系统的图放到了这里,便于阅读和理解。 图中我再加载部分多画了一个虚线框的用户自定义类加载器,这个后面会做解释。同时在外部添加了使用和卸载两部分,主要是为了向展示类的生命周期,但是实际上他们不是类加载子系统中的部分。 类的生命周期 类从被加载到虚拟机内存中开始,一直到卸载出内存为止,整个生命周期如下图所示。其中验证、准备、解析三个阶段统称为连接阶段。在这个生命周期中,加载->验证->准备->初始化->卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序开始(通常是交叉的混合式进行的)。你可能已经发现,我少说了一个解析阶段,这个阶段的顺序有时候不是按照图中的顺序进行的,有时候会在初始化阶段开... Read More
-
RabbitMQ系列(三)---基于Spring boot的rabbitmq实现消息异步处理 TOP NEW
概述 前面已经对rabbitmq的安装和基本概念进行了讲解,那么在实际的项目实战中,我们如何利用rabbitmq来实现一个消息异步处理的功能呢。本文就将基于Spring Boot 中的rabbitmq来实现一个简单的例子,并对实现过程中遇到的问题进行讲解。如果对spring boot还不了解的话,请自行上网学习,这里重点是对rabbitmq的实现进行讲解。 应用场景 本文主要演示的应用场景是:客户端调用后端接口,传入一个User对象,这个对象中包含了姓名,年龄,地址,手机号四个属性,我们假设这个User对象需要在服务端进行一个非常耗时的任务。服务端接收到这个User对象之后,通过生产者将其投递到队列queue中,队列异步处理这个User对象(这里演示的是在控制台打印了User中的消息),然后完成。 依赖配置 由于Spring Boot为我们提供了许多方便的stater,所以这里我们直接使用它为我们提供的依赖。本例子是基于Spring Boot 1.5.15.RELEA... Read More
-
HttpServletRequest不能重复使用请求数据 TOP NEW
前言 本文通过我在实际开发中遇到的一个问题,从而对HttpServletRequest重复使用请求数据的问题进行讲解,看完本文你将了解到: 如何从zuul网关的filter中截取HttpServletRequest的请求数据,并保证可以重复使用。 HttpServletRequest原理分析及如何用一个普通过滤器捕获客户端请求,并对数据修改后再传给服务器。 问题描述 在实际开发中可能存在这样的需求:将客户端的请求信息,包括headers,body,queryParams等信息拦截下来,然后再根据一些具体的业务需要,对请求的字段进行过滤或者是处理。但是HttpServletRequest接口中,并没有为我们暴露相应的set方法,仅有如下两个个set方法: public void setAttribute(String name, Object o); public void setCharacterEncoding(String env); 官方这么做的目的,... Read More
-
HashMap和Hashtable的区别 TOP NEW
-
深入理解JVM(一) TOP NEW
前言 作为一个JAVA开发者,不了解Java虚拟机的原理是不行的, 只有了解了基本原理之后,我们才能写出更加高效的代码,同时也有助于我们在 上线的时候排查问题。同时想要进阶学习Java知识,JVM是一个绕不开的问题, 建议有点Java基础的同学,再来看这部分内容会比较容易,我并不是很建议大家在学习Java 初期一上来就学习JVM,当然学习这个事情因人而异,只要自己能学知识到就行了。 Java虚拟机这部分内容,后面应该还会写很多篇,按照我目前的预想, 是按照由简到细的顺序进行介绍的。本篇文章打算先从一个Java程序是如何运行起来的讲起 ,然后介绍加Java虚拟机的整体结构,后面再对其做详细的介绍。 一次编译,随处运行 我们都知道Java对外的宣传口号就是一次编译,随处运行,那到底是如何实现 这一口号的呢?同时我们知道Java是一门跨平台的语言,那它又是如何实现跨平台的呢?相信 通过下面的例子,我们能有一个大致的了解。假如现在我有一个HelloWorld.java文件,内容如... Read More
-
RabbitMQ系列(二)-基本概念和原理 TOP NEW
简介 MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费- 生产者模型的一个典型的代表,生产者向消息队列中生产消息,消费者从消息队列中取出消息, 并将其消费。RabbitMQ便是MQ产品的一个典型代表,它是由Erlang编写的一款基于AMPQ协议 可复用的高性能企业消息系统。当然,消息通信解决方案并不止RabbitMQ一种,诸如ActiveMQ, ZeroMQ,Apache Qpid都提供了相关的解决方案。由于RabbitMQ的可靠性,高性能,高并发, 并且它是处了Apache Pid之外唯一实现了AMPQ标准的代理服务器,使得它相较于其竞争者, 有着更高的普及度,也更加的受大家青睐。从小到创业公司,大到商业巨头,RabbitMQ都有很高 的普及度和忠实用户。 理解消息通信 其实消息通信的整个过程非常的简单,就如上面我们说到的一样,生产者产生消息, 消费者接收到这些消息并将其消费。你的应用程序可以作为生产者,向其他应用程序发送消息, 也... Read More
-
RabbitMQ系列(一)---Windows安装rabbitmq详解 TOP NEW
前言 RabbitMQ是一个在AMPQ(Advanced Message Queuing Protocol)协议基础上的企业级消息系统, 是一个建立在Erlang OPT平台上的开源框架。所以我们在安装RabbitMQ之前,需要安装Erlang环境,再安装RabbitMQ服务。本文只对如何在Windows环境下安装RabbitMQ做了介绍,对于其作用和原理以及如何以JAVA代码实现,我会在后续的系列中逐一写出。同时后面也会对基于RabbitMQ的Spring Cloud组件消息驱动进行介绍,这里就暂且当做是万里长征第一步吧。 由于本文是基于windows安装的,对于想在linux上安装的同学,这里我也给一个靠谱的链接。 Linux安装RabbitMQ 正文 1.安装Erlang环境 首先,我们需要去Erlang官网下载我们所需要的安装包,我下载的是目前最新RELEASE的21.0版本。这里有几个可选的下载链接,由于我的电脑是64位的,所以选择OTP 21.0.1 W... Read More
-
Jekyll搭建个人博客教程 TOP NEW
关于Github Pages GIthub Pages则是github上的一项功能,可以放置网页文件到指定文件夹,然后给你一个专属域名用于展示一些项目,但现在大多用来开发制作个人博客网站。本教程就是基于此来搭建一个自己专属的博客。 搭建步骤 Fork一个Jekyll主题的工程到你的Github账户下,你可以Fork我的工程,请务必在__posts目录下,删除我已有的文章。也可以自己去JEkyll主题网站找你喜欢的主题,然后放到你的Github仓库中。 进入工程所在的setting中,修改工程名称为{your github name}.github.io。如下图所示: 在setting页面中往下拉,找到Github Pages,任意选择一个主题,并找到自己的博客地址。如下图所示: 在你fork的工程中,找到__config文件,并修改其中的个人信息为你自己的信息,然后提交保存。 ... Read More