- 博客(47)
- 资源 (2)
- 收藏
- 关注
原创 【dubbo3】看懂消费者如何发现提供者
提供者向注册中心注册应用信息及对应的地址,消费者从注册中心拿到应用的ip。传统的应用级服务发现消费者需要自己另外维护请求接口与应用直接关系,一般是通过请求路径匹配应用的规则来实现。这样当需要发起请求时,先找到请求对应的应用,然后再查找应用对应的IP。提供者如果只告知注册中心自己的名称、地址,消费者是无法知道接口的地址。dubbo3的应用级服务发现的特别之处在于提供者在注册应用的同时,也向注册中心注册接口与应用的关系。消费者通过接口应用映射拿到了接口对应的应用,还要知道应用对应的实例ip才能发请求。
2023-09-09 14:23:26
746
原创 【Spring】抽丝剥茧SpringMVC-目录
最近记录SpringMVC处理请求时的路径,汇总一下DispatcherServletRequestMappingHandlerMappingRequestMappingHandlerAdapter参数解析器HandlerMethodArgumentResolverModelAttribute使用方法返回处理器HandlerMethodReturnValueHandler异步请求WebAsyncManagerHandlerExceptionResolver
2021-01-25 21:07:30
279
1
原创 【Spring】抽丝剥茧SpringMVC-HttpMessageConverter
HttpMessageConverter是SpringMVC重要功能组件之一。它提供两个基础功能:其一,从request body中读取数据并转换为对应的类型;其二,将对象写入到response body中。HttpMessageConverter是接口,规范了具体实现类的行为。HttpMessageConverter主要提供两组接口分别对应读、写。
2021-01-25 21:05:14
287
原创 【Spring】抽丝剥茧SpringMVC-ContentNegotiationManager
ContentNegotiationManager也是SpringMVC的重要功能性组件。其提供解析requst可接受的MediaType以及根据MediaType解析对应文件扩展名。ContentNegotiationManager包含2个重要的成员变量strategies:ContentNegotiationStrategy类型集合,就是用来解析MediaTyperesolvers:MediaTypeFileExtensionResolver类型集合,用来解析MediaType对应的
2021-01-23 20:55:55
1078
原创 【Spring】抽丝剥茧SpringMVC-ModelAttribute使用方法
@ModelAttribute可以用在方法上,也可以用在参数上。当它用在方法上时候,SpringMVC会将其返回值绑定到model的属性上;当它用在参数上时候,SpringMVC会从model取出对应的属性传给该参数。
2021-01-23 20:55:02
390
原创 【Spring】抽丝剥茧SpringMVC-SessionAttributes机制
请求进来的时候创建SessionAttributesHandler并将之前的session属性填充到model数据中,请求返回时将model中数据根据注解@SessionAttribute配置保存到SessionAttributesHandler中供下次请求使用。如果请求处理类标记SessionStatus为已完成,则在请求返回时将SessionAttributesHandler清理掉
2021-01-23 20:54:45
319
原创 【Spring】抽丝剥茧SpringMVC-异常处理HandlerExceptionResolver
请求在处理过程中可能会因为各种各样的原因抛出异常,例如参数解析时类型不匹配、参数必传而请求没传。HandlerExceptionResolver处理完异常返回的也是ModelAndView对象。HandlerExceptionResolver是一个接口类,其中只有一个接口方法HandlerExceptionResolver#resolveException。所有异常处理器将实现该接口。
2021-01-23 20:54:12
808
原创 【Spring】抽丝剥茧SpringMVC-视图解析及渲染ViewResolver&View
视图渲染是SpringMVC框架的重要一环,基本也就是最后一环了。请求经过前面一系列的处理最终是返回ModelAndView对象给到视图渲染模块。视图渲染模块则将其转换为前端可识别的html文本并写入response。并不是所有请求最终都会走到视图渲染模块,如果请求在前面的处理中已经将数据写到response,其实就没有必要经过视图渲染模块处理。这时只需要返回的恶ModelAndView是空对象(null),DispatcherServlet就不会走视图渲染逻辑。
2021-01-23 20:53:32
677
原创 【Spring】抽丝剥茧SpringMVC-请求间传递参数机制FlashMap
web项目有时候需要在一个请求中保存一些属性给接下来的其它请求使用。尤其是重定向场景,也许我们需要给目标请求传递些参数。FlashMap机制就提供了这么一种方式让一个请求传递一些参数给接下来的某个请求。当然要实现这个目的还有别的方式,FlashMap是其中一种,FlashMap机制保证了参数的隐蔽性,不需要将参数传递到前端。
2021-01-23 20:52:40
847
原创 【Spring】抽丝剥茧SpringMVC-异步请求WebAsyncManager
SpringMVC在执行完业务方法后要对其返回值进行处理,这项工作是在返回值处理器完成的。在SpringMVC支持的返回值处理器中有多种处理器会触发SpringMVC的WebAsyncManager机制,例如DeferredResultMethodReturnValueHandler、CallableMethodReturnValueHandler、AsyncTaskMethodReturnValueHandler等。今天我们聊聊WebAsyncManager机制。 WebAsyncMa...
2021-01-23 20:15:26
2209
原创 【Spring】抽丝剥茧SpringMVC-返回处理器HandlerMethodReturnValueHandler
源码基于SpringMVC 5.2.7HandlerMethodReturnValueHandler所有返回处理器都是HandlerMethodReturnValueHandler实现类。与参数处理器(HandlerMethodArgumentResolver)类似,HandlerMethodReturnValueHandler主要也有2个方法boolean supportsReturnType(MethodParameter returnType)功能:支持的返回类型void ha.
2021-01-23 20:14:04
710
原创 【Spring】抽丝剥茧SpringMVC-参数解析器HandlerMethodArgumentResolver
SpringMVC框架提供的默认参数解析器如下类型 支持的参数条件 备注 org.springframework.web.method.annotation .RequestParamMethodArgumentResolver 被@RequestParam注解且参数类型不是Map 被@RequestParam注解且参数类型是Map且@RequestParam注解的name属性不为空 没有注解@RequestParam且没有注解@Re
2021-01-23 20:13:18
712
5
原创 【Spring】抽丝剥茧SpringMVC-RequestMappingHandlerAdapter
request经过HandlerMapping找到了对应的Handler。但是要执行Handler,还需要从request中提取handler需要的参数,handler执行后返回值也需要经过处理才能作为response返回。这些操作都是由MVC另一个核心组件-HandlerAdapter完成。 HandlerAdapter核心事情主要有3件:参数预处理、调用Handler、返回值处理。参数预处理是从request的body、query、header等解析并转换为Handler对应的参数...
2021-01-23 20:11:55
366
原创 【Spring】抽丝剥茧SpringMVC-拦截器HandlerInterceptor
拦截器是SpringMVC用来拦截请求,开发者可以通过配置拦截器,对请求添加统一的鉴权、访问日志等处理。拦截器还支持针对不同请求做不同处理。SpringMVC中拦截器需要实现org.springframework.web.servlet.HandlerInterceptor
2020-12-25 20:19:30
537
原创 【Spring】抽丝剥茧SpringMVC-RequestMappingHandlerMapping
HandlerMapping是DispatcherServlet主要的组件之一,其作用是帮助request找到合适的Handler。RequestMappingHandlerMapping是HandlerMapping主要实现类之前,对应着注解@RequestMapping
2020-12-07 23:01:33
1110
1
原创 【Spring】抽丝剥茧SpringMVC-DispatcherServlet
DispatcherServlet 使用SpringMVC框架的同学一定知道DispatcherServlet。SpringMVC处理Http请求就是从DispatcherServlet开始。SpringMC简化了Servlet规范的开发模式,定义了通用了Servlet(DispatcherServlet)与Servlet容器(jetty/tomcat)交互。开发者专注于业务逻辑的开发。下图是DispatcherServlet的类图可以看出DispatcherServlet其实就是...
2020-11-30 15:34:24
426
2
原创 【Spring】spring如何注入ServletRequest、ServletResponse
使用姿势 spring里有很多小知识点,今天学习一下ServletRequest、ServletResponse是如何注入容器里面的。 看一个小例子,如果我们想在controller的方法里面获取request可以怎么做?参数中添加对应参数 这种方式就是在方法后面加一个HttpServletRequest或者HttpServletResponse参数,Sping做参数绑定的时候特殊处理。这个不是今天的主角。。。@RequestMapping("hello3") ...
2020-09-22 20:58:13
1669
原创 【JAVA】CompletableFuture笔记及关键源码解读-CompletionStage异步计算实现
CompletableFuture是CompletionStage实现类,表达的语意是:当一个CompletionStage完成之后触发另一个CompletionStage的执行。CompletionStage的机制构造具有相对顺序的执行链条,终点CompletionStage的完成(正常/异常)会触发直接依赖他的一批Completion完成 thenAppy/thenAccept/thenRun构建不同类型的CompletionStage
2020-09-19 21:41:53
1025
原创 【小贴士】如何用jconsole连接jmx agent-rmi、jmxmp协议
1 以rmi协议连接 jvm启动时添加参数(更多参数参考-Dcom.sun.management.jmxremote.port=88882 以jmxmp协议连接
2020-09-12 13:21:46
714
原创 【问题经验】记一次Dubbo线程耗尽的问题-druid数据库连接池突发性能
问题现象1. 应用日志输出:"[DUBBO] Thread pool is EXHAUSTED!"2. 当时服务提供者的处理时间变长原因分析 我们都知道线程池溢出会触发拒绝策略,dubbo的线程池拒绝策略是抛异常,但是在异常抛出前dump一份当前jvm的堆栈信息(非常棒!),默认保存在当前用户的路径下(可通过dump.directory修改dump路径)。 粗看一下栈信息,大量的dubbo线程(dubbo提供者的线程命名规则是:DubboServerHande...
2020-09-12 00:32:02
3662
1
原创 【Spring】深入理解spring-aop之使用篇
目录spring-aopaop的概念spring aop支持的advice类型spring aop支持的pointcut表达式spring-aop aop是经常使用的,不过之前没有完整的了解aop,促使笔者系统的学习aop是因为之前的遇到的问题。这个问题在《掉进sping-aop的陷阱》介绍过。因为sping-aop的底层实现是基于动态代理,所以有必要了解一下《动态代理》。 aop是Aspect Oriented Programming简写,即面向切面编程,是OOP(...
2020-08-23 19:42:14
441
原创 【Java】深入理解动态代理:JDK、CGLIB
代理模式 日常生活中代理司空见惯的,比如某地区总代理,直白点就是中间商。在代码的世界里也有这种“中间商”,不过这个“中间商”不收差价,有时候甚至给你点额外的小惊喜。...
2020-08-09 00:25:25
311
原创 【问题经验】掉进spingaop的陷阱-aop导致controller私有requestmapping方法NPE异常
问题描述环境:spring mvc 4.3.17现象:org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException描述:很早以前的老代码,以前同事没注意,某个Controller里面的RequestMapping方法用了private修饰(因为Spring是反射调用所以也能接受到请求)。最近,另一.
2020-08-02 00:09:03
794
3
原创 【Spring】component-scan和@ComponentScan配置解析
配置形式 component-scan和@ComponentScan两者功能一致,用来让Spring容器扫描Bean,其中前者是配置在xml文件中,后者是在类上添加注解。 配置component-scan需要在xml中配置<component-scan>,属性"base-package"指定待扫描的包,支持多值用逗号","隔开。<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www...
2020-07-27 00:44:37
2666
原创 【Spring】Spring中自定义Schema配置Bean
如何在Spring配置dubbo引用和服务<?xml version="1.0" encoding="UTF-8" ?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xsi:sch
2020-07-18 23:34:20
821
原创 【问题经验】dubbo回声测试异常(NumberFormatException:null)
现象 在用dubbo回声测试机制做回声测试时返回信息分析方案
2020-06-20 12:01:19
624
原创 【问题经验】记一次Dubbo泛化调用踩坑-zookeeper临时节点暴增
ReferenceConfig获取"服务引用"的时候先取已经实例化的"服务引用",如果没有实例化过则会调用init来实例化"服务引用"。实例化"服务引用"过程默认要check提供者是否存在,不存在则抛异常导致实例化失败(此时已经在zookeeper上创建了消费者节点)。下一次通过ReferenceConfig获取"服务引用"又会失败(也会创建消费者节点,消费者节点上会带上时间戳所以每次都会创建新的节点)。如此反复,就会无穷尽的创建zk节点
2020-06-13 18:07:34
2584
2
原创 【Dubbo笔记】dubbo SPI、Adaptive机制解读
在很多场合,系统需要根据上下文、参数决定逻辑。例如支付,使用微信、支付宝、银联支付逻辑不一样,比较直接的写法是用 【if】判断,走不同的分支;另外,设计模式里面有一种工厂模式也适用这种场景。【Dubbo】里也有很多这种场景(多协议等等),但是【Dubbo】使用SPI(Service Provider Interface) + Adaptive机制来应付这种场景。这种机制更灵活、更具扩展性。
2020-06-06 23:46:38
614
原创 nginx内部重定向(X-Accel-Redirect)在商务合作定制开发中应用
适配层系统如何将请求转发到业务系统?nginx提供的内部重定向(X-Accel-Redirect)机制是一个比较好的方式。适配层系统在处理完特殊的解签后,在response里加一个header(X-Accel-Redirect)指定请求转发的路径(业务标准实现的路径),nginx收到响应报文不会返回给客户端,而是从指定的业务路径中请求内容返回客户端
2020-05-23 18:19:46
2312
1
原创 【问题经验】请求头Accept-Language:*导致freemarker异常 NegativeArraySizeException
1 现象 现象很简单,日志里不停打印异常,请求url很普通就是首页,抛出异常是NegativeArraySizeExceptionCaused by: org.springframework.context.ApplicationContextException: Could not load FreeMarker template for URL [/templates/ind...
2020-03-22 15:53:19
1365
原创 【Freemarker】SpringMVC&Freemarker视图渲染的两级缓存
开发springmvc+freemarker项目时经常调试页面模版元素。想让修改立即生效,就关闭缓存,否则视图渲染一直走缓存。关闭缓存就要注意了,需要关闭两处缓存。第一级缓存,FreeMarkerViewResolver的视图缓存(viewAccessCache),设置cacheLimit=0则关闭。 第二级缓存,模版缓存(TemplateCache),设置template_update_delay=0则关闭。
2020-03-14 03:15:19
705
原创 @Repeatable详解-getAnnotation、getDeclaredAnnotation获取不到对象
dk8之前不存在可重复注解,如果想添加多个相同注解,只能用容器注解。jdk8引入了@Repeatable元注解。被@Repeatable修饰的注解即是可重复使用在同一个元素上的。getAnnotation、getAnnotations、getAnnotationsByType、getDeclaredAnnotation、getDeclaredAnnotations()、getDeclaredAnnotationsByType这些方法获取的都是运行时注解
2020-03-11 00:31:56
15299
1
原创 java原生SPI机制详解
SPI也是如此,SPI全称Service Provider Interface。本质就是上层软件制定所需模块的接口规范,然后基于这个规范搭建上层建筑,至于模块谁来开发实现并不关心,反正厂商按照接口规范做出来就好。SPI的核心是java.util.ServiceLoader。ServiceLoader大致的过程是在classpath*:META-INF/services/目录下查找配置文件(名称是接口的全路径类名),这个文件里面每一行就是是实现类的全路径类名。
2020-03-07 11:22:52
459
原创 并发-CountedCompleter详解
CountedCompleter维护两个动作:onCompletion)和onExceptionalCompletionCountedCompleter维护父任务变量completer,通过这个变量逐级传递上去CountedCompleter维护挂起任务(子任务)的计数(pending),子任务完成会触发父任务的pending减1作为ForkJoinTask,compute之后并没有将状态置为Normal,如果此时调用join会阻塞线程
2020-03-01 16:26:44
1503
原创 java8 双冒号(::)使用方法
双冒号(::)运算符是跟函数式接口相关的运算符,作为函数式接口的赋值操作。双冒号用于静态方法 使用方法:将类的静态方法赋值给一个函数式接口,静态方法的参数个数、类型要跟函数式的接口一致。调用这个函数式接口就相当于调用静态方法。格式ClassName::MethodName 自定义一个函数式接口如下:@FunctionalInterfacepublic inter...
2020-02-29 11:51:24
2790
原创 【问题经验】gradle工程管理小问题 classesDir leftShift()
Could not find method leftShift() Could not get unknown property 'classesDir'
2020-02-25 23:48:22
1040
1
原创 ForkJoin框架详解 一张图搞明白工作窃取(work-stealing)机制
ForkJoinPool一种ExecutorService的实现,运行ForkJoinTask任务,它采用了一种工作窃取(work-stealing)的机制。维护了WorkQueue的数组(2的整数次方),每个workQueue都有任务队列,并且用base、top指向任务队列队尾和队头。ctl 是ForkJoinPool的主要控制字段,ctl不同的bit位表示不同的含义。ForkJoinWorkerThreadFactory则是用来创建工作线程。
2020-02-23 13:51:03
5209
5
原创 LockSupport最全使用方法 原理介绍
LockSupport是线程阻塞的基本原语,可以用来创建锁或者其它的同步类(ReentrantLock基于该类实现)。每个线程使用LockSupport都关联一个 “许可证”。某个线程调用LockSupport.park,“许可证”可用,调用立即返回,否则线程将会阻塞直到中断发生、超时或许可证变为可用。LockSupport.unpark(thread)可以使许可证可用。LockSupport底层依赖的是Unsafe类。
2020-02-20 17:50:54
1234
原创 【问题经验】浏览器(chrome)发1次请求,服务端却收到2次请求
遇到一个奇怪的现象:chrome浏览器只发出1次请求,系统却收到2次首先确定是不是确实只发了1次请求,我打开chrome的调试功能,"Network"里面看到的确实只有一次请求;其次怀疑是不是网络中间环节的重试,可是问题是必现,不太像网络问题,换浏览器没问题、在其它电脑用chrome也没问题。最后发现chrome安装的插件json viewer导致的,在chrome扩展程序里关闭jso...
2020-02-13 22:30:24
2130
jmxremote_optional-1.0.1_04.jar
2020-09-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人