- 博客(63)
- 收藏
- 关注
原创 Spring Cloud之Zuul
自定义过滤器的使用场景非常广泛,如鉴权、安全认证、灰度发布等场景都可以通过自定义过滤器实现@Override// 设置过滤类型 FilterConstants.PRE_TYPE FilterConstants.ERROR_TYPE FilterConstants.ROUTE_TYPE FilterConstants.POST_TYPE@Override// 优先级 越小越优先执行return 0;@Override// 是否需要过滤,true为需要过滤,这里可以加相应的判断条件。
2023-02-14 18:25:03
760
原创 Spring Cloud之Eureka
readOnlyCacheMap在于readWrtiteCacheMap定时同步,客户端拉取服务时默认先从readOnlyCacheMap取,如果没有再从readWrtiteCacheMap取,所以可以修改这个默认配置直接从readWrtiteCacheMap取。支持P,因为有定时踢出和自我保护,即使Client没有续约上,其他Client也能从Server拉取到注册表信息。不支持C,每个Eureka服务有三个缓存,数据同步有时间间隔,最差情况下,服务列表在30秒内不一致。
2023-02-10 10:51:03
477
原创 Spring事务传播特性
Spring有7种事务传播特性,其意义是确定多个具有事务控制的service相互调用时所形成的的事务边界,下表列出Spring的7种事务传播特性以及含义。
2022-08-18 15:58:46
418
原创 静态代理与动态代理
JDK代理使用的是反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。CGLIB代理使用字节码处理框架asm,对代理对象类的class文件加载进来,通过修改字节码生成子类。JDK创建代理对象效率较高,执行效率较低;CGLIB创建代理对象效率较低,执行效率高。JDK动态代理机制是委托机制,只能对实现接口的类生成代理,通过反射动态实现接口类;...
2022-08-12 16:51:08
199
原创 Spring创建Bean实例的方式
在Spring框架中创建Bean的流程步骤可归纳为getBean -> doGetBean -> createBean -> doCreateBean,其中createBean的核心逻辑就是创建Bean实例。下面通过源码分析来查看具体有几种方式可以创建Bean实例。
2022-08-03 19:56:59
470
原创 BeanFactory和FactoryBean的区别
在Spring中,有两个很容易混淆的类BeanFactory和FactoryBean,它们都可以用来创建对象,设计都使用了于工厂模式。
2022-08-01 17:43:58
350
原创 Spring中BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的区别
BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor是在Spring的invokeBeanFactoryPostProcessors方法中被调用,都属于Spring的后置处理器或者叫增强器,操作对象是BeanDefinition,不了解BeanDefinition可以看进行了解。...
2022-07-28 18:17:04
445
原创 Spring中的ConfigurableListableBeanFactory
其实每个接口都有自己独特的功能,如ListableBeanFactory表示这些Bean是可列表的,AutowireCapableBeanFactory定义了Bean的自动装配规则,ConfigurableBeanFactory允许Bean工厂自定义配置,如是单例模式还是原型模式。Spring通过以下方法创建ConfigurableListableBeanFactory,解析XML文件,加载BeanDefinition。......
2022-07-22 15:52:28
2289
原创 Spring中的BeanDefinition
通过xml配置通过注解通过AbstractApplicationContext中addBeanFactoryPostProcessor方法。
2022-07-15 19:05:57
965
原创 RocketMQ消息存储机制
RocketMQ默认的消息存储路径在/root/store/生产者每次投递的消息都存储在commitLog文件里,再开启一个线程(ReputMessageService)异步的生成consumerQueue和indexFile消费者根据queueOffset到conumerQueue找到对应消息的commitLogOffset,再到commitLog文件中找到具体的消息并返回 可以将ConsumeQueue理解为CommitLog的索引,因为CommitLog存储了所有topic的消息,通过引入Consum
2022-06-30 20:15:23
1864
1
原创 RocketMQ的tag过滤和sql过滤
在RockerMQ中可以用topic将业务划分,例如将订单、商品、活动等业务划分在不同的topic。为了使业务逻辑更清晰还可以用tag再次划分,例如将订单划分为服装订单、家电订单、酒水订单等。在服务端采用的是tag的hashcode过滤,当消费者的tag与订阅的queue中消息的tag的hashcode一致时就会直接返回,但这样只能过滤大部分tag,因为存在hash碰撞,所以还要在客户端还要根据tag值进行过滤发送完之后在console中就能看到消息标签那列存在定义的值sql过滤 介绍
2022-06-29 17:24:14
867
原创 RockerMQ消息发送与消费模式
目录消息发送模式简介代码三种发送模式的区别消息消费模式简介集群消费模式介绍代码步骤 广播消费模式介绍演示RocketMQ有三种发送模式,分别是同步发送、异步发送、单向发送,不同的模式适用于不同的业务场景三种发送模式的区别同步发送:消息发送到master broker后并同步到slave broker后,才会响应客户端,效率慢,但丢失数据的风险小异步发送:消息发送到master broker后就响应客户端,无需等待成功同步到slave broker,效率高,风险也高。例如master broker处
2022-06-24 18:27:44
476
原创 ActiveMQ+SpringBoot基本使用
项目准备准备好一个SpringBoot项目配置pom.xml在pom.xml的dependencies标签中添加以下依赖包<!-- ActiveMQ依赖包 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId></depen
2022-06-02 12:00:05
1000
原创 ActiveMQ消息存储方式
AMQ方式基于文件的方式存储,只适用于5.3之前的版本,了解即可KahaDB存储kahaDB是5.4之后版本的默认存储方式,以日志形式存储数据,默认存储在kahadb这个目录下,可以通过conf/activemq.xml文件中的<kahaDB directory="${activemq.data}/kahadb"/>来修改存储路径。在这个目录下会生成4个文件:db-.log,db.data,db.redo,lockdb-.log存储消息内容,默认大小是32M,达到阈值随着
2022-05-27 15:21:03
915
原创 Docker安装ActiveMQ
官方网站http://activemq.apache.org/docker pull webcenter/activemqdocker run --name my-activemq -d -p 8161:8161 -p 61616:61616 -p 61613:61613 webcenter/activemq访问 http://localhost:8161/admin默认账号密码 admin admin
2022-05-26 11:30:34
241
原创 了解Kafka架构设计
AKF原则传统的单机应用存在容量有限、压力大、单点故障等问题,因此需将Kafka设计成一个分布式应用。按照微服务拆分原则之一的AKF原则从3个维度解决以上问题。Y轴:业务拆分通过定义Topic达到拆分业务的目的Z轴:数据分区在y轴上再拆分,对topic中的数据拆分成若干个PartitionX轴:绝对复制,横向拓展搭建partition副本,通过主备的方式解决单点故障问题Kafka高速读写策略通过采取了分区技术,并发度高,并且相同逻辑的数据将发往同一分区,以保障消息
2022-05-23 18:30:43
384
原创 Kafka2.13集群搭建
准备3台服务器,并配置hosts172.17.0.2 node0172.17.0.3 node1172.17.0.4 node2在其中一台服务器中搭建Zookeeper(单机或集群都可以)Zookeeper集群搭建参考链接下载Kafkawgethttps://mirrors.tuna.tsinghua.edu.cn/apache/kafka/3.2.0/kafka_2.13-3.2.0.tgz解压压缩包tar xf kafka_...
2022-05-19 17:44:41
905
原创 部署kafka集群后创建主题报错WARN [AdminClient clientId=adminclient-1] Error connecting to node 14ca304
[2022-05-19 06:58:54,549] WARN [AdminClient clientId=adminclient-1] Error connecting to node 14ca3043f87b:9092 (id: 0 rack: null) (org.apache.kafka.clients.NetworkClient)java.net.UnknownHostException: 14ca3043f87b: Name or service not known需要将14ca3043f
2022-05-19 15:04:24
2804
原创 docker安装centos8
拉取镜像docker pull centos:centos8启动容器docker run -d -p 10022:22 --name service1 --privileged=true sshd_centos添加–privateged参数是为了使容器内的root拥有真正的root权限,否则不能使用systemctl管理系统进入容器docker exec -it service1 /bin/bash配置服务器cd /etc/yum.repos.dsed -i 's/mir
2022-05-18 11:54:08
528
原创 Kafka基本使用
Kafka下载地址:Apache Kafka1.解压资源包tar xf kafka_2.12-3.1.0.tgz 2.进入Kafka目录cd kafka_2.12-3.1.0/3.启动内置zookeepernohup bin/zookeeper-server-start.sh config/zookeeper.properties > zoo.log &4.启动Kafkanohup bin/kafka-server-start.sh config/
2022-04-28 21:34:12
1545
原创 BIO、NIO、AIO、多路复用器
1、BIO(Blocking IO)1.1 介绍BIO是同步阻塞IO,当有客户端连接进来时,需要开辟一个线程给这个客户端,所以当连接过高时,会对服务器造成负载过高甚至卡死,1.2 Java代码示例public static void main(String[] args) throws Exception { ExecutorService threadPool = Executors.newCachedThreadPool(); ServerSocket
2022-04-25 18:46:06
1089
原创 JVM之GC日志
GC日志有什么用在Java中,GC日志能够帮助我们分析内存动态分配和垃圾回收,让我们有针对的对程序进行优化如何查看GC日志先准备一个案例程序public class GCTest { public static void main(String[] args) { int i = 0; List<User> userList = new ArrayList<>(); while (true) {
2022-04-14 17:19:54
3571
原创 JVM调优之性能监控工具
jstackjstack简介jstack是JDK自带的堆栈追踪工具,通过jstack可以生成指定进程号的线程快照,通过线程快照可以快速获取到各线程的状态,从而分析出程序长时间卡顿、cpu过高、死锁等原因jstack使用运行一个死锁的程序,以下是死锁程序的实例代码:public class JstackTest { private static Object l1 = new Object(); public static void main(String[] ar
2022-04-12 19:31:21
605
原创 JVM之垃圾回收
简介JVM具有自动垃圾回收处理,比起手动回收,开发效率提高了,并且不会出现忘记回收和多次回收的问题。通过了解垃圾回收的原理,选择合适的垃圾回收器,可以提高程序的性能。如何标记垃圾在没有任何引用指向一个对象时称为垃圾,通过引用计数法/根可达算法来标记垃圾引用计数法就是通过给对象添加一个引用计数器,有对象被一个地方引用时,计数器加1,当没引用时则减1,这种算法有一个缺陷,无法标记互相引用的对象,在Java中没用这种算法作为标记垃圾的算法 根可达算法就是通过一些GC Roots的对象作为起始点,
2022-04-08 19:20:38
602
原创 JVM运行时数据区
一、程序计数器每个线程独有的,如果执行的是JAVA方法,则记录当前线程正在执行的字节码指令地址,如果执行的是Native 方法,值为undefined,程序计数器是唯一不会出现OOM的内存区域二、虚拟机栈每个线程独有,随着线程的创建而创建,随着线程的销毁而销毁 每个方法执行的同时会创建栈帧,只有位于顶部的栈帧才是有效栈帧,称为当前栈帧 栈帧会存储局部变量表、操作数栈、动态链接、方法出口等 执行引擎执行的所有操作只针对当前栈帧 栈帧随着方法的调用而创建,随着方法的结束和销毁 ...
2022-04-07 17:46:38
1038
原创 JVM类加载器
ClassLoader描述只有Class被JVM加载到内存时,其他Class才能引用,.class文件是怎么被加载到JVM中的就是通过ClassLoader,JVM是按需动态加载,采用双亲委派机制。JVM什么时候加载.class文件当执行new操作时候当执行Class.forName当执行ClassLoader.loadClass在Java程序中通过getClassLoader()可以打印类加载器例如:public static void main(String args[]) {
2022-04-06 17:09:35
652
原创 MySQL日志简述(redo log、undo log、bin log)
一、前言redo log、undo log、bin log是MySQL中的三大核心日志,其中redo log、undo log是innoDB引擎层的日志,bin log是server层的日志。理解这三种日志,对于帮助我们理解事务有十分重要的意义。二、redo logredo log确保了事务的持久性,记录了数据修改之后的值数据在修改时,...
2022-04-02 17:57:46
1391
原创 mysql的锁机制
一丶简介mysql针对不同存储引擎有不同类型的锁。MyISAM和MEMORY存储引擎采用的是表级锁;InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下优先采用行级锁,无法用行级锁时会使用表级锁表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。可以通过检查table_locks_waited来分析系统上的表锁定争夺,值越高表锁争夺越严重:show status like ‘table_locks%’;行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生
2022-03-23 17:24:13
1295
原创 mysql事务详解
一、事务的基本要素原子性(Actomicity):同一个事务下的数据修改,要么全都执行要么全都不执行一致性(Consistent):在事务开始到结束,数据都必须保持一致隔离性(Isolation):每一个事务之间互不干扰,同一数据只允许一个事务对其操作持久性(Durable):事务完成后,对数据的操作是永久的二、并发事务带来的问题脏读:事务A读取了事务B修改的数据,此时事务B回滚,此时事务A读取的是脏数据不可重复读:事务A多次读取某数据时,数据B对数据进行了修改或者删除,导致事务A读取的数据
2022-03-22 15:19:22
3959
原创 mysql执行计划
通过mysql执行计划可以查看SQL语句的具体执行过程,达到优化SQL的目的,以提高SQL语句执行效率执行计划包含的信息ColumnMeaningidThe SELECT identifierselect_typeThe SELECT typetableThe table for the output rowpartitionsThe matching partitionstypeThe join typepossible_keysThe p
2022-03-21 15:53:33
1159
原创 mysql执行计划type描述
explain输出的type值描述表示如何连接,有以下值system在表中只有一行记录时(相当于系统表),这是const的特例const使用唯一索引时,例如使用id或UNIQUE索引作为查询条件EXPLAIN select * from t_user where id = 1eq_ref联合查询中,用主键或者唯一非空索引作为=操作查询时EXPLAIN select * from t_user u, t_user_detail d where u.id = d.idref在使用了非唯一
2022-03-04 16:35:38
507
原创 ArrayBlockingQueue
介绍Queue设计出来的目标就是为了高并发,而在多线程中BlockingQueue扮演至关重要的角色,因为它提供了很多对多线程友好的接口。ArrayBlockingQueue是一个阻塞式队列,并且是有界队列需要指定容量。通过继承关系图可以知道ArrayBlockingQueue继承自AbstractQueue并实现了BlockingQueue,间接的实现了Queue接口和Collection接口,全局锁是ReentrantLock,通过数组来保存数据,常用的操作包括:offer(E e):插入元素
2021-12-31 16:26:58
634
原创 线程池之ThreadPoolExecutor使用
如图ThreadPoolExecutor的父类是AbstractExecutorService,AbstractExecutorService的父类是ExecutorService,ExecutorService的父类是Executor,所以ThreadPoolExecutor就相当于线程池的执行器ThreadPoolExecutor共有四个构造方法,我们以参数最多的对其参数进行解释corePoolSoze:核心线程数,最开始时的线程数量maximumPoolSize:最大线程数量,当核心线程数.
2021-12-30 18:42:54
1134
原创 强引用、软引用、弱引用、虚引用介绍
前言为了使程序更灵活的控制对象的生命周期,java设置了4种引用,分为强引用、软引用、弱引用、虚引用。强引用如果一个对象具有强引用,那么垃圾回收器一定不会回收它。例如:Object o = new Object();如果要回收它只能将o = null;软引用软引用的含义:当有一个对象(字节数组)被一个软引用所指向的时候,只有系统内存不够用的时候,才会回收它。下面看一个例子,在跑这个程序时需要将堆大小设置到25m以下:public class TestSoftReference {
2021-12-25 17:54:45
592
原创 Java多线程之CountDownLatch
简介CountDownLatch常用于让多个线程并行执行和让线程等待其他线程完成之后再执行,提供了以下方法方法说明await()使当前线程进入同步队列进行等待,直到latch的值被减到0或者当前线程被中断,当前线程就会被唤醒。await(long timeout, TimeUnit unit)带超时时间的await()。countDown()使latch的值减1,如果减到了0,则会唤醒所有等待在这个latch上的线程。getCount()获得latch的数值
2021-12-21 17:22:48
489
原创 Java多线程之Exchanger
简介Exchanger用于两个线程间的通信,无论哪个线程先调用都会等到另外一个线程调用时进行数据交换例子public class TestExchanger { private static Exchanger<String> exchanger = new Exchanger<>(); public static void main(String[] args) { new Thread(()->{ try {
2021-11-26 17:52:38
828
原创 java多线程之ReadWriteLock
简介ReadWriteLock是一个读写互斥、读读不互斥的锁。ReadWriteLock是一个接口,内部有两个方法readLock和writeLock,一个是读锁,一个是写锁。ReetrantReadWriteLock实现了ReadWriteLock接口,添加了可重入性并支持公平与非公平模式。ReadWriteLock支持锁降级就是从写锁变成读锁,不支持锁升级就是从读锁变成写锁例子package com.test.juc.lock;import java.util.concurrent.locks
2021-11-08 16:26:54
336
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人