- 博客(197)
- 资源 (5)
- 收藏
- 关注
原创 docker 形态构建redis 哨兵模式集群
哨兵是 Redis 的一种运行模式,它专注于对 Redis 实例(主节点、从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个 Redis 系统的可用性。结合 Redis官方文档,可以知道 Redis 哨兵具备的能力有如下几个:2.如果一个实例距离最后一次有效回复 PING 命令的时间超过指定的值, 那么这个实例会被 Sentinel 标记为主观下线。3.正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。
2023-03-13 17:20:50
711
1
原创 Netty 通信原理
本文主要从 网络通讯原理中的select 和 epoll 系统调用入手,来打开 Netty 的大门,从认识 Netty 的基础原理 —— I/O 多路复用模型开始Netty 底层的通信机制是基于I/O多路复用模型构建的,简单一句话概括就是多路网络连接可以复用一个I/O线程,在 Java 层面也就是封装了其 NIO API,但是 JDK 底层基于 Linux 的 epoll 机制实现(其实是三个函数)。注意在老旧的 Linux 上,可能还是 select,没考证过,但是时下主流版本,肯定早就是 epoll
2022-02-14 16:25:34
1031
转载 Spring AOP 切入点表达式
1、切入点指示符用来指示切入点表达式目的,,在Spring AOP中目前只有执行方法这一个连接点,Spring AOP支持的AspectJ切入点表达式符如下: execution:用于匹配方法执行的连接点; within:用于匹配指定类型内的方法执行; this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配; target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入
2022-01-19 17:30:24
1121
原创 哈夫曼编码
哈夫曼又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。作用:即利用哈夫曼算法的理论构建出字符char和对字符进行编码code,的一个二叉树的字典 如:a->101其主要原理是:1、通过对需要编码的字符串resource中字符char的出现频率进行统计得出相应的映射关系,2、依据字符出现的频率对字符char进行编码 code3、构建哈夫
2021-12-08 19:09:56
3065
原创 java native
java中的native关键字JNI是Java Native Interface的 缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作
2021-11-30 18:23:12
2047
原创 java.util.concurrent.locks.LockSupport 详解
要学习JAVA中是如何实现线程间的锁,就得从LockSupport这个类先说起,因为这个类实现了底层的一些方法,各种的锁实现都是这个基础上发展而来的。package java.util.concurrent.locks;import java.util.concurrent.*;import sun.misc.Unsafe; public class LockSupport { private LockSupport() {} // Cannot be instantiated.
2021-11-29 18:24:18
3517
原创 事件驱动进行代码解耦
EventBus 处理的事情类似观察者模式,基于事件驱动,观察者们监听自己感兴趣的特定事件,进行相应的处理。在 Spring 环境中优雅地使用 Guava 包中的 EventBus,对我们的代码进行一定程度的解耦。当然,本文不介绍 EventBus 的原理,我所说的优雅也只是我觉得优雅,也许读者有更漂亮的代码,添加 Guava 依赖<dependency> <groupId>com.google.guava</groupId> <artifactI
2021-11-23 14:06:04
746
转载 @ConfigurationProperties注解的工作原理
@ConfigurationProperties是springboot新加入的注解,主要用于配置文件中的指定键值对映射到一个java实体类上。那么它是怎么发挥作用的呢?下面我们将揭开@ConfigurationProperties的魔法。1 概述ConfigurationPropertiesBindingPostProcessor这个bean后置处理器,就是来处理bean属性的绑定的,这个bean后置处理器后文将称之为properties后置处理器。你需要知道以下几件事:ioc容器context的e
2021-11-22 14:43:16
2558
原创 spring 对于bean的增强,BeanPostProcessor
在当前使用spring框架中经常存在对spring原有注册的bean需要进行增强就需要使用到BeanPostProcessor接口。在spring框架体系下,我们通过实现BeanPostProcessor接口降需要增强的业务接入到spring体系中,有spring容器在启动的过程中会通过getBeanNamesForType 来加载所有实现过BeanPostProcessor接口的类。从而在通过postProcessBeforeInitialization、postProcessAfterInitiali
2021-09-07 14:09:54
1040
转载 mat(Eclipse Memory Analyzer tool)--heap dump分析
在工作中可能会遇到内存溢出这种灾难性的问题,那么程序肯定是存在问题,找出问题至关重要,上一篇文章讲了jmap命令的使用方法,当然用jmap导出的文件我们也看不懂啊,那就交给memory analyzer(mat)这个工具,让他帮助我们来观察程序的内存分布情况吧。MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。但是比较主流的厂家和格式,例如 Sun, HP, SAP 所采用的 HPROF 二进制堆存储文件,以及 IBM 的 PHD 堆存储文件等都能被很好的解析。下面来看看要怎么做呢,也许对你有用
2021-09-01 17:57:31
1878
原创 领域模型设计
robbin将领域模型初步分为4大类:失血模型贫血模型充血模型胀血模型那么让我们看看究竟有这些领域模型的具体内容,以及他们的优缺点:一、失血模型失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由business object来完成(又称TransactionScript),这种模型下的domain object被Martin Fowler称之为“贫血的domain object”。下面用举一个具体的代码来说明,代码来
2021-09-01 14:53:30
1556
原创 dubbo Filter 过滤器(拦截器)
dubbo filter是在spring的filter的延伸,通过dubbo 的filter的实现可可以控制dubbo进行服务调用时的上下文RpcContext.getContext() 获取当前dubbo服务运行线程的上下文快照1、定义Filter实现com.alibaba.dubbo.rpc.Filter接口。添加Activate,其注解含义如下:group :所属组 例如消费者、服务提供者 啥的order :多个Filter的执行顺序 (越小越早)package com.test.wang
2021-08-26 14:38:31
3364
原创 idea maven 发布跳过测试方式
在开发MAVEN 项目的时候,有时进行Maven Install或者Maven deploy等操作的时候,希望跳过测试Skip Tests。下面来教大家在IntelliJ IDEA中如何跳过测试。方法一:修改pom.xml文件<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>
2021-08-18 15:11:11
3661
原创 JDK8 新特性 Lambda表达式
1.java8中Lambda表达式基础语法:(x,y) -> {}左侧是一个小括号,里面是要实现的抽象方法的参数,有几个参数就写几个参数名,无参可写空括号,无需声明参数类型;中间是一个jdk8新定义的箭头符号;右侧是一个大括号,在括号内编写抽象方法的实现内容,有参时,可直接使用左侧括号中的对应参数,与正常方法的方法体相同;使用方式:实现只有一个抽象方法的接口时会自行匹配到该方法,在箭头左侧编写对应参数个数的参数名,箭头右侧编写方法的实现代码(代码实现为单行时可去掉大括号{})示例:@Te
2021-08-06 11:01:30
240
原创 RabbitMQ详解
1、pom文件 必须导入rabbitmq 依赖包<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>3.4.1</version></dependency>2、work模式一个生产者对应多个消费者,但是只能有一个消费者获得消息!!!2.1、竞争消费者模式。2.1。
2021-08-06 09:22:03
276
原创 查询zookeper上的生产者和消费者
首先通过命令切换到/usr/zookeeper-3.4.10/bin目录,然后输入zookeper注册中心./zkCli.sh -server zookeeper_ip:zookeeper_port然后在命令行再输入:ls / 查看消费者命令:ls /dubbo/[classPath]/consumersls /dubbo/[classPath]/providers...
2021-08-04 09:51:37
420
原创 Filter中抛出异常的处理
Feileimport java.io.IOException;import java.util.ArrayList;import java.util.Collection;import java.util.LinkedList;import java.util.List;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax
2021-07-16 09:51:20
3467
转载 java PEB算法加密
1、PBE(Password Based Encryption,基于口令加密)是一种基于口令的加密算法,其特点是使用口令代替了密钥,而口令由用户自己掌管,采用随机数(这里称之为 盐)杂凑多重加密等方法保证数据的安全性。2、PBE 算法并没有 真正构建新的加密/解密算法,而是对已知的对称加密算法(eg:DES算法)做了包装;使用PBE算法对数据做加密/解密操作时,其实是使用了 DES 或者 AES 等其他对称加密算法做了相应的操作。既然,PBE算法是使用了较为常用的对称加密算法,那就无法回避密钥的问题
2021-07-14 14:27:14
428
转载 查看zookeper上注册的生产者和订阅的消费者
首先,我们需要到项目中看下,我们配置的zk的地址和端口号。之后登录zk所在的服务器,我们需要知道zk的安装目录,可以使用ps -ef | grep zookeper 查看zookeper服务的运行情况之后进入到zk的bin目录下,运行命令,2181是zk的默认端口号./zkCli.sh -server 127.0.0.1:2181也可以在在安装有zookeeper的机器上通过zkCli来连接远程zookeeper服务进入后,通过命令ls /dubbo/dubbo接口全限定名/pr
2021-07-14 09:40:35
821
原创 spring 多数据源
spring支持DataSourece通用配置#============================================================================# MySQL#============================================================================jdbc.mysql.driver=com.mysql.jdbc.Driverjdbc.mysql.url=jdbc:mysql:
2021-05-24 16:26:42
401
3
原创 spring Transactional引出的AOP切面动态代理
在说明spring 中@Transactional的使用前,我们先看下被@Transactional注解的方法的调用链从上图可以看到方法testInternationalize()所调用的对象其实sun创建的Proxy的一个bean,并不是testInternationalize()方法所在接口实现类的真实bean,而是通过spring框架进行增强的proxy bean (spring 所创建的bean可能存在多层的AOP拦截,因此其调用的根本原理也就是依据JdkDynamicAopProxy 的
2021-05-08 16:50:54
493
原创 java 导出 excel “String literals in formulas can‘t be bigger than 255 characters ASCII“ 问题
在 java中当导出的excel数据存在下拉框的时,在下拉框的数据长度较小的情况下可以使用简单的下拉框导出模式private void createDropDownList(final HSSFWorkbook wb, final HSSFSheet sheet, final List<String> list,
2021-04-14 17:20:43
1952
原创 Thrift RPC详解
RPCRPC, 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议,该协议允许运行于一台计算机的程序程调用另一台计算机的上的程序。通俗讲,RPC通过把网络通讯抽象为远程的过程调用,调用远程的过程就像调用本地的子程序一样方便,从而屏蔽了通讯复杂性,使开发人员可以无需关注网络编程的细节,将更多的时间和精力放在业务逻辑本身的实现上,提高工作效率。RPC本质上是一种 Inter-process communication(IPC)——进程间通信的形式。常见的进程间通信方式
2021-04-06 14:52:04
2758
原创 java 文件操作
//1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if (!myFolderPath.exists()) { myFolderPath.mkdir(); } } catch (Exception e) { System.out.println("新建目录操作出错"); e.printStackTrace(); .
2020-12-22 13:59:29
97
原创 Dubbo负载均衡方式自定义拓展
由于项目需求特殊,需要在dubbo中实现一种能指定远程地址的分发机制,使用了dubbo留出来的扩展点的方法实现了这个功能,也就是实现了AbstractLoadBalance接口,并重写了doSelect方法,在doSelect方法实现中,根据调度服务方法传进的参数也就是指定的远程主机的ip地址和端口进行了过滤,最终返回满足该条件的Invoker作为最终的返回值给调用端,在通过SPI机制将拓展服务负载均衡方式加载到dubbo的服务体系中主要是在dubbo-2.8.4.jar\META-INF\dubbo\
2020-11-05 17:42:18
694
原创 dubbo集群容错之loadbalance负载均衡 源码解析
首先我们看看LoadBalancepackage com.alibaba.dubbo.rpc.cluster;import java.util.List;import com.alibaba.dubbo.common.URL;import com.alibaba.dubbo.common.extension.Adaptive;import com.alibaba.dubbo.common.extension.SPI;import com.alibaba.dubbo.rpc.Invocatio
2020-11-05 17:20:35
536
转载 深入理解 NioEventLoop启动流程
NioEventLoop的启动时机是在服务端的NioServerSocketChannel中的ServerSocketChannel初始化完成,且注册在NioEventLoop后执行的, 下一步就是去绑定端口,但是在绑定端口前,需要完成NioEventLoop的启动工作, 因为程序运行到这个阶段为止,依然只有MainThread一条线程,下面就开始阅读源码看NioEventLoop如何开启新的线程总想说 NioEventLoop的整体结构,像极了这个图NioEven
2020-10-28 14:24:17
734
原创 netty之NioEventLoopGroup
Netty的NioEventLoopGroup及NioEventLoop初始化工作的源码阅读笔记, 如下图,是Netty的Reactor线程模型图,本文描述NioEventLoopGroup等价于我在图中标红的MainReactor组件,全篇围绕它的初始化展开,难免地方理解的不正确在Nio网络编程模型的图示是下面那张图, 单条Thread全职执行一个Selector,首先是服务端在启动的时候,会把代表服务端的ServerSockerChannel注册进Selector,且感兴趣的事件是Accept, 一
2020-10-28 11:35:51
10298
原创 Spring初始化后Bean进行bean的增强方式
后处理Bean也称之为Bean的后处理器,作用是:在Bean初始化的前后,对Bean对象进行增强。它既可以增强一个指定的Bean,也可以增强所有的Bean,底层很多功能(如AOP等)的实现都是基于它的,Spring可以在容器中直接识别调用。【示例】要对“所有”的bean的初始化的时候进行增强(打印一句话)第一步:创建MyBeanPostProcessor类,实现接口BeanPostProcessor//后处理bean,:用来对bean进行功能增强,可以实现,对所有,或某个bean的初始.
2020-10-26 09:46:48
2948
原创 maven 常用指令集
Maven本质上是一个插件框架,并不执行任何具体的构建任务,它把所有这些任务都交给插件来完成。作为开发利器的maven,为我们提供了十分丰富的命令,了解maven的命令行操作并熟练运用常见的maven命令还是十分必要的,即使譬如IDEA等工具给我提供了图形界面化工具,但其底层还是依靠maven命令来驱动的。因此,知其然,知其所以然,方能百战不殆。Maven的命令格式如下:mvn [plugin-name]:[goal-name]该命令的意思是:执行plugin-name插件的goal-na
2020-10-22 17:42:51
897
转载 Spring 方法级别参数校验 之MethodValidationPostProcessor
你在书写业务逻辑的时候,是否会经常书写大量的判空校验。比如Service层或者Dao层的方法入参、入参对象、出参中你是否都有自己的一套校验规则?比如有些字段必传,有的非必传;返回值中有些字段必须有值,有的非必须等等~若你追求干净的代码,甚至有代码洁癖,如上众多if else的重复无意义劳动无疑是你的痛点,那么本文应该能够帮到你。 Bean Validation校验其实是基于DDD思想设计的,我们虽然可以不完全的遵从这种思考方式编程,但是其优雅的优点还是可取的,本文将介绍Spring为此提供的解决方案~
2020-10-22 16:28:33
4298
原创 mysql insert 偶出现Deadlock死锁场景分析
有一张表A,先删除数据,如果影响行数为0,则执行INSERT插入数据。很常见的场景,在生产上也跑了很久,没有出现什么问题。但是有一次在测试环境做压测时居然出现了死锁,Deadlock found when trying to get lock; try restarting transaction因为对mysql锁不熟悉,为什么insert也会死锁,不是一般在update的时候会死锁吗? 很好奇,于是开始寻找原因…mysql锁是跟数据库设置的隔离级别有关系的,不同的隔离级别,锁也各不相同,只要是
2020-10-20 11:33:00
701
转载 spring aop切面实现对bean增强的过程
spring的两大核心就是ioc和aop。在关于ioc依赖注入的文章中,我们了解了如何根据BeanDefinition创建Bean,然后在BeanPostProcessor中处理@Autowired和@Resource两个注解,自动注入Bean。本文将讲解另外一块核心内容,aop切面。注册AnnotationAwareAspectJAutoProxyCreator 触发AnnotationAwareAspectJAutoProxyCreator...
2020-09-27 16:31:42
2140
原创 CGLIB动态代理在Spring AOP应用中的运用
首先子这里我同个一个实例引入CGLIB在spring AOP中的使用业务启动测试类import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import com.wangyong.learn.project.spring.test.BaseTest;/** * @author Administrator */public class TesAopt extends Base
2020-09-25 15:19:21
269
原创 CGLIB动态代理实现原理
CGLIB(Code Generator Library)是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问。JDK动态代理虽然简单易用,但是其有一个致命缺陷是,只能对接口进行代理。如果要代理的类为一个普通类、没有接口,那么Java动态
2020-09-16 17:28:39
411
原创 java.util.concurrent 包 的LinkedBlockingQueue学习
LinkedBlockingQueue是一个用于并发环境下的阻塞队列集合类,它可以用于生产-消费者模型。阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:方法\处理方式 抛出异常
2020-09-10 16:48:58
1033
原创 Thread的run()与start()的区别
1、start()、run()方法的定义区分start(): 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止。然后CPU再调度其它线程。 一旦得到cpu时间片,就开始执行r...
2020-09-07 17:47:19
8316
原创 Java 中关于Native关键字的解释
关于JNI 概念首先要讲一下JNI。Java很好,使用的人很多、应用极 广,但是Java不是完美的。Java的不足体现在运行速度要比传统的C++慢上许多之外,还有Java无法直接访问到操作系统底层如硬件系统,为此 Java提供了JNI来实现对于底层的访问。JNI,Java Native Interface,它是Java的SDK一部分,JNI允许Java代码使用以其他语言编写的代码和代码库,本地程序中的函数也可以调用Java层的函 数,即JNI实现了Java和本地代码间的双向交互。Native 解释:
2020-09-04 11:16:35
216
原创 二进制表示与编码转换
一:表示法:1、正数5的表示法假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为:00000000 00000000 00000000 000001015转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。2、负数-5的表示法现在想知道,-5在计算机中如何表示?在计算机中,负数以原码的补码形式表达。二、概念:1、原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。比如 000000
2020-09-03 15:13:05
2052
转载 Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
Java中的运算符(操作符) 程序的基本功能是处理数据,任何编程语言都有自己的运算符。因为有了运算符,程序员才写出表达式,实现各种运算操作,实现各种逻辑要求。 为实现逻辑和运算要求,编程语言设置了各种不同的运算符,且有优先级顺序,所以有的初学者使用复杂表达式的时候搞不清楚。这里详细介绍一下Java中的运算符。 Java运算符很多,下面按优先顺序列出了各种运算符。 优先级 运算符分类 结合顺序 运算符 由 高 到 低 ...
2020-09-03 14:43:12
323
postgreSQL中文操作手册
2017-01-13
postrgeSQL pgadmin操作手册
2017-01-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人