RabbitMQ-高级
服务异步通信-高级篇消息队列在使用过程中,面临着很多实际问题需要思考:
1.消息可靠性消息从发送,到消费者接收,会经理多个过程:
其中的每一步都可能导致消息丢失,常见的丢失原因包括:
发送时丢失:
生产者发送的消息未送达exchange
消息到达exchange后未到达queue
MQ宕机,queue将消息丢失
consumer接收到消息后未消费就宕机
针对这些问题,RabbitMQ分别给出了解决方案:
生产者确认机制
mq持久化
消费者确认机制
失败重试机制
下面我们就通过案例来演示每一个步骤。
首先,导入课前资料提供的demo工程:
项目结构如下:
1.1.生产者消息确认RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。这种机制必须给每个消息指定一个唯一ID。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。
返回结果有两种方式:
publisher-confirm,发送者确认
消息成功投递到交换机,返回ack
消息未投递到交换机,返回nack
publisher-return,发送者回执
消息投递 ...
代理设计模式
代理设计模式前言代理设计模式原理:使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
静态代理和动态代理:
静态代理:一个代理只能服务于一种类型的对象,代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。
动态代理:动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时 根据需要动态创建目标类的代理对象。
应用场景:Spring的AOP,面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。
AOP 采取横向抽取机制(动态代理),取代了传统纵向继承机制的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。
主要作用是分离功能性需求和非功能性需求,使开发人员可以集中处理某一个关注点或者横切逻辑,减少对业务代码的侵入,增强代码的可读性和可维护性。
简单的说,AOP 的作用就是保证开发者在不修改源代码的前提下,为系统中的业务组件添加某种通用功能
静态代理代理模式可以在不修改被代理对象的基础上,通过代理对象进行一些功能的 ...
Java线程池
Java线程池线程池的基本概念什么是线程池Java中的线程池是一种管理和复用线程的机制,它可以有效地控制并发执行的多个任务。线程池包含一组预先创建的线程,这些线程可以被任务动态地分配和重复利用,而不是为每个任务都创建一个新线程。这种做法有助于减少线程创建和销毁的开销,并且可以更有效地利用系统资源。
使用线程池有哪些优势
降低资源消耗:通过重复利用现有的线程来执行任务,避免多次创建和销毁线程。
提高响应速度:因为省去了创建线程这个步骤,所以在任务来的时候,可以立刻开始执行。
提高线程的可管理性:线程池进行统一的分配、调优和监控。
避免任务过载: 当系统负载过高时,线程池可以通过控制任务队列的大小或者拒绝策略来避免任务过载。
提供更多更强大的功能:线程池的可拓展性使得我们可以自己加入新的功能,比如说定时、延时来执行某些线程。
JUC线程池架构JUC指的是Java的并发工具包java.util.concurrent。
ThreadPoolExecutor的顶层接口是Executor:将任务提交和任务执行进行解耦。用户无需关注如何创建线程,如何调度线程来执行任务,用户只需要提供Runna ...
Java类加载器
Java类加载器类加载器简介我们编写的.java扩展名的源代码文件中存储着要执行的程序逻辑,这些文件需要经过java编译器编译成.class文件,.class文件中存放着编译后虚拟机指令的二进制信息。当需要某个类时,虚拟机将会加载它,并在内存中创建对应的Class对象,这个过程称之为类的加载。
加载:将字节码文件通过IO流读取到JVM的方法区,并同时在堆中生成Class对象。
验证:校验字节码文件的正确性。
准备:为类的静态变量分配内存,并初始化为默认值;对于final static修饰的变量,在编译时就已经分配好内存了。
解析:将类中的符号引用转换为直接引用。
初始化:对类的静态变量初始化为指定的值,执行静态代码。
类的加载连接和初始化当 Java程序中需要使用到某个类时,虚拟机会保证这个类已经被加载、连接和初始化。而连接又包含验证、准备和解析这三个子过程,这个过程必须严格按照顺序执行。
类的加载通过类的完全限定名(包名和类名)查找此类的字节码文件,把类的.class文件中的二进制数据读入到内存中,并存放在运行时数据区的方法区内,然后利用字节码文件创建一个Class对象,用来 ...
Java泛型
Java泛型泛型概述集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来 解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的。因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
从JDK1.5以后,Java引入了参数化类型(Parameterized type)的概念, JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持, 从而可以在声明集合变量、创建集合对象时传入类型实参。
那么为什么要有泛型呢,直接Object不是也可以存储数据吗?
解决元素存储的安全性问题。
解决获取数据元素时,需要类型强制转换的问题。
Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生 ClassCastException异常。同时,代码更加简洁、健壮。
集合中使用泛型集合中使用泛型:
集合接口或集合类在jdk5.0时都修改为带泛型的结构,在实例化集合类时,可以指明具体的泛型类型。
使用泛型以后,在集 ...
Node管理神器NVM安装配置
Node管理神器NVM安装配置前言node版本持续更新,一些node的新特性只有在node的较高版本中才可以使用。但是如果将node版本切换到较高版本,就会导致对现有项目的一些依赖造成环境不兼容。所以,需要一个工具对node版本进行管理,允许开发环境同时存在多个node版本,开发人员可以随意切换。
什么是nvmnvm全称Node Version Manager是 Nodejs 版本管理器,它让我们能方便的对 Nodejs 的版本进行切换。 nvm 的官方版本只支持 Linux 和 Mac。 Windows 用户,可以用 nvm-windows。
nvm下载安装配置安装nvm前如果有安装node,要先卸载node。
下载安装nvm-windows 最新下载地址:https://github.com/coreybutler/nvm-windows/releases
nvm-setup.zip:这是一个安装包,下载之后点击安装,无需配置就可以使用,方便。
检查环境变量一般安装之后环境变量会自动设置后,系统自动新增NVM_HOME和NVM_SYMLINK环境变量如下图:
NVM_HOME应 ...
Java IO流
Java IO流File类的使用前言java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。
File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的目标文件。
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
File类的实例化常用的构造器有:
public File(String pathname)
pathname可以是绝对路径或者相对路径。
绝对路径:是一个固定的路径,从盘符开始。
相对路径:是相对于某个位置开始。
public File(String parent, String child)
以parent为父路径,child为子路径创建File对象。
public File(File parent, String child)
根据一个父File对象和子文件路径创 ...
MySQL表设计规范
MySQL表设计规范前言作为后端开发,我们经常需要设计数据库表。合理的设计数据库表可以减少后期的维护,以及更好的优化Sql。
1、命名规范数据库表名、字段名、索引名等都需要命名规范,可读性高(一般要求用英文),让别人一看命名,就知道这个字段表示什么意思。
表名、字段名必须使用小写字母或者数字,禁止使用数字开头,禁止使用拼音,并且一般不使用英文缩写。
主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名。
2、选择合适的字段类型设计表时,我们需要选择合适的字段类型,比如:
尽可能选择存储空间小的字段类型,就好像数字类型的,从tinyint、smallint、int、bigint从左往右开始选择
小数类型如金额,则选择 decimal,禁止使用 float 和 double。
如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
varchar是可变长字符串,不预先分配存储空间,长度不要超过5000。
如果存储的值太大,建议字段类型修改为text,同时抽出单独一张表,用主键与之对应。
同一表中,所有varchar字段的长度加起来,不能大于6553 ...
JDK8新特性
JDK8新特性详解
转载:不会学习Java的小白
一、Java发展历史1. Java的发展历史Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。
Java 8 是 oracle 公司于 2014 年 3 月发布,可以 看成是自 Java 5 以来最具革命性的版本 。 Java 8 为 Java 语言、编译器、类库、开发工具与 JVM 带来了大量新特性。
JDK Beta - 1995
JDK 1.0 - 1996年1月 (真正第一个稳定的版本JDK 1.0.2,被称作 Java 1 )
JDK 1.1 - 1997年2月
J2SE 1.2 - 1998年12月
J2ME(Java 2 Micro Edition,Java 2平台的微型版),应用于移动、无线及有限资源的环境。
J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境。
J2EE(Java 2 Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。
J2SE 1.3 - 2000年5月
J2SE 1. ...
Elasticsearch搭建
安装elasticsearch1.部署单点es1.1.创建网络因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络:
1docker network create es-net
1.2.加载镜像这里我们采用elasticsearch的7.12.1版本的镜像,这个镜像体积非常大,接近1G。不建议大家自己pull。
课前资料提供了镜像的tar包:
大家将其上传到虚拟机中,然后运行命令加载即可:
12# 导入数据docker load -i es.tar
同理还有kibana的tar包也需要这样做。
1.3.运行运行docker命令,部署单点es:
1234567891011docker run -d \ --name es \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -e "discovery.type=single-node" \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugin ...