- 博客(18)
- 问答 (1)
- 收藏
- 关注
原创 Spring Boot 的自动装配原理
ComponentScan: 扫描包下的类中添加了@Component (@Service,@Controller,@Repostory,@RestController)注解的类 ,并添加的到spring的容器中,可以自定义不扫描某些 bean。Dubbo的SPI机制:Dubbo更是把SPI机制应用的淋漓尽致,Dubbo基本上自身的每个功能点都提供了扩展点,比如提供了集群扩展,路由扩展和负载均衡扩展等差不多接近30个扩展点。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化。
2022-12-28 08:18:09
276
1
原创 Spring的常见问题
AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与OOP不同的抽象软件结构的视角,在OOP中, 我们以类(class)作为我们的基本单元, 而AOP中的基本单元是Aspect(切面)另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。默认情况下,它是类型驱动的注入。
2022-12-21 11:45:00
260
原创 分布式事务Seata的常见问题
如果在1发生了全局的回滚,tx1此时没有本地锁,无法回滚,只持有全局锁,他的全局锁不不会释放了。导致tx2等待超时了,开始放弃去获取全局锁,并把自己的本地事务也回滚了,然后释放了本地锁。这是一个抽象出来的典型的分布式事务链路,3 个服务,分别有自己的数据库,服务调用形成一个业务链路,这个链路的数据要保障数据一致性。第一,利用了 数据库本地事务 的特性,让回滚日志和业务数据的写入保证原子性:只要有业务数据提交成功,就一定有相应的回滚日志数据。直接本地提交的机制,省去了绝大部分情况下,两阶段提交的开销。
2022-12-21 08:15:00
711
原创 服务网关:SpringCloud Gateway 的常见问题
上面配置包含了一个Hystrix过滤器,该过滤器会应用Hystrix熔断与降级,会将请求包装成名为fallback的路由指令RouteHystrixCommand,RouteHystrixCommand继承于HystrixObservableCommand,其内包含了Hystrix的断路、资源隔离、降级等诸多断路器核心功能,当网关转发的请求出现问题时,网关能对其进行快速失败,执行特定的失败逻辑,保护网关安全。提供对 HTTP 请求和响应的访问,并公开额外的服务器端处理相关属性和特性,如请求属性。
2022-12-19 11:00:00
2632
原创 接口只供内部服务调用的方案(网关+AOP实现)
根据这个特点,我们可以对所有经过网关的请求的header里添加一个字段,业务侧接口收到请求后,判断header里是否有该字段,如果有,则说明该请求来自外部,没有,则属于内部服务的调用,再根据该接口是否属于内部接口来决定是否放行该请求。同时,开发者可以在业务侧直接确定接口的内外网访问权限,提升开发效率的同时,增加了代码的可读性。避免了网关侧的逻辑判断,从而提升系统响应速度。我们知道,外部进来的请求一定会经过网关再被分发到具体的业务侧,内部服务间的调用是不用走外部网关的(走k8s的service)。
2022-12-19 08:52:45
1623
原创 JVM常见的问题
方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字节码)等数据堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要在堆上分配栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是 8大基础类型加上一个应用类型,所以还是一个指向地址的指针本地方法栈:主要为 Native 方法服务程序计数器:记录当前线程执行的行号。一般来说,Java应用的类都是由它来完成加载的。
2022-12-15 19:45:00
176
原创 消息中间件的常见问题
死信队列中,可以为普通交换器绑定多个消息队列,假设绑定过期时间为5分钟、10分钟和30分钟,3个消息队列,每个队列设置DLX,并关联一个死信队列。消息接收确认:消息确认机制(ACK)默认自动确认,发送给消费者后立即确认,但存在丢失消息的可能,若消费端抛异常,回滚只保证数据的一致性,消息还是丢失。即没有成功处理就丢失。一对多,通过一个内容节点(主题topic)来发布和订阅消息,消息发布者将消息发布到某个主题,消息订阅者订阅这个主题的消息。一对一,消息生产者将消息发送到消息队列中,消息消费者从队列中接收消息。
2022-12-15 18:30:00
314
原创 Redis常见问题
哨兵模式,由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Redis主节点和从节点,并在被监视的主节点进入下线状态时,自动将下线主服务器属下的某个从节点升级为新的主节点。如果待检查的元素,经过这k个哈希散列函数的映射后,发现其k个位置上的二进制数全部为1,这个元素很可能属于集合A,反之,一定不属于集合A。RDB持久化,是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。因为,单点部署一旦宕机,就不可用了。
2022-12-15 09:45:00
261
原创 MySQL数据库常见问题总结
我们先从B树分析,B树检索一次最多需要访问h个节点,同时,数据库巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,即每次新建节点时,直接申请一个页的空间,这样就保证一个节点在物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,这样就实现了每个节点只需要一次I/O就可以完全载入。分区就是将表的数据按照特定规则存放在不同的区域,也就是将表的数据文件分割成多个小块,在查询数据的时候,只要知道数据数据存储在哪些区域,然后直接在对应的区域进行查询,不需要对表数据进行全部的查询,提高查询的性能。
2022-12-14 09:00:00
1503
原创 集合框架-常见面试题总结
Segment 的结构和HashMap类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。HashMap的数据结构: 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。
2022-12-14 07:00:00
99
原创 线上遇到慢接口的解决方案
这个时候可以采用APM工具快速定位,常见的工具:skywalking、pinpoint,cat、zipkin假如我们应用没有接入APM,可以在生产环境装一下阿里的A.rthas,利用trace接口方法,大概能分析是哪一块比较慢,定位的力度稍微有点粗糙。. 循环调用改为单次调用(比如查数据库或查其他rpc或restful接口,能批量调用尽量批量调用,数据在内存组装处理).同步调用改为异步调用(采用completableFuture异步非阻塞,并行调用不同的rpc接口)我这里给大家分享以下。
2022-12-13 12:45:00
1054
原创 延时队列的设计:定时任务轮询、DelayQueue、时间轮算法、消息中间件、Redis
首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,延迟队列相对比普通队列,区别就在延时的特性上,普通队列先进先出,按入队顺序进行处理,而延时队列中的元素在入队时会指定一个延时时间,希望能够在指定时间到了以后处理。时间轮算法,参考的时钟,从时钟中得到的一些启发设计出来的,简单的讲它是一个存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个延时任务列表。缺点∶缺乏队列顺序消息特性,相同score的任务无法顺序执行,缺乏ack特性,若任务执行失败,而队列的任务被删除了,就丢失了。
2022-12-13 09:00:00
2670
原创 线程池的使用ThreadPoolExecutor
线程池意味着可以储存线程,并让池内的线程得以复用,如果池内的某一个线程执行完了,并不会直接销毁它有生命周期,可以存活一些时间,待到下一个任务来时,它会复用这个在等待中的线程,避免了再去创建线程增加的额外系统开销。CachedThreadPool∶:允许的创建线程数量为Integer .NAX_VALE,可能会创建大量的线程,我们知道每个线程默认情况下占1M的内存空间,如果线程非常多,内存资源将会被耗尽,从而导致OOM。创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。
2022-12-12 05:35:37
1212
原创 实现完整统一响应对象
只有代码出错或者throw出来的异常才会被捕捉处理,如果被catch的异常,就不会被捕捉,除非catch之后再throw异常。3、定义一个处理返回结来的工具类RespResult.java,定义一些通用的返回结来的方法,例如返回成功结果的5Ucess方法、返回失败结果的error方法。,有多个GExceptionHandler注解的方法时,会根据抛出异常类去寻找处理方法,如果没有,就往上找父类,直到找到为止。1)返回http code 20e,对所有异常进行捕获,返回的message二次加工展示给调用方。
2022-12-11 10:15:00
399
1
原创 全局异常处理器@ControllerAdvice和@ExceptionHandler
是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。为什么要使用,因为在程序开发中,可能包名不一样,pom依赖的很多的jar 他们是如何把这些类进行注入到spring容器中的呢。
2022-12-11 08:45:00
1047
原创 性能优化-批量数据的导入导出处理
从产品侧设计的时候,引导产品,将导入导出功能设计成异步,尽量不要同步等待,虽然牺牲了一点体验,但是长期看对系统的稳定非常重要。(为了产品的体验,可以提供一个统一excel导入导出历史记录功能给产品或运营同学,支持查看对应的下载进度,可追溯),采用动态配置开关控制导入导出的数量,通过压测预估系统处理数据的阈值默认配置一个,导入导出超过阈值需要产品或运营发邮件申请,开发修改配置,如果业务确实有超大数据量要求,超过阈值太多,引导产品或运营分批导入导出解决。导入的痛点:一次加载百万级别数据到内存,发生OOM。
2022-12-11 07:07:39
1353
原创 数据校验框架Hibernate-Validator
看到这个结果发现我们添加的校验框架起作用了,响应信息中存在了"邮箱不能为空"的信息,但是前端用户一般只关心一个校验结果和校验失败信息,现在返回的这个信息太多了很难让人接受。@Length(min=, max=) 被注释的字符串的大小必须在指定的范围内,必须为数组或者字符串,若微数组则表示为数组长度,字符串则表示为字符串长度。@Size(max, min) 被注释的元素的大小必须在指定的范围内,元素必须为集合,代表集合个数。@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值。
2022-12-11 04:58:08
366
原创 Java四种线程池和参数详解
一、四种线程池Java通过Executors提供四种静态方法来创建线程池例如://创建一个可缓存线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool();//执行任务cachedThreadPool.execute(Runnable command);如下:1.newSingleThreadPool 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO、LIFO、优先
2021-04-03 16:22:50
480
空空如也
Html 鼠标悬停下拉框,鼠标不能移动
2017-11-24
TA创建的收藏夹 TA关注的收藏夹
TA关注的人