问题æè¿°åœ¨æœåС噍¾~–程ä¸ï¼Œé€šå¸¸éœ€è¦å¤„ç†å¤š¿Uä¸åŒçš„è¯äh±‚åQŒåœ¨æ£å¼å¤„ç†è¯äh±‚之å‰åQŒéœ€è¦å¯¹è¯äh±‚åšä¸€äº›é¢„处ç†åQŒå¦‚åQ?br />¾Uªå½•æ¯ä¸ªClient的毋ơ访问信æ¯ã€?/li> 对Client˜q›è¡Œè®¤è¯å’ŒæŽˆæƒæ£€æŸ¥ï¼ˆAuthentication and AuthorizationåQ‰ã€?/li> ‹‚€æŸ¥å½“å‰Session是å¦åˆæ³•ã€?/li> ‹‚€æŸ¥Clientçš„IPåœ°å€æ˜¯å¦å¯ä¿¡èµ–或ä¸å¯ä¿¡èµ–åQˆIP地å€ç™½åå•ã€é»‘åå•åQ‰ã€?/li> è¯äh±‚æ•°æ®æ˜¯å¦å…ˆè¦è§£åŽ‹æˆ–è§£ç ã€?/li> æ˜¯å¦æ”¯æŒClientè¯äh±‚的类型ã€Browser版本½{‰ã€?/li> æ·ÕdŠ æ€§èƒ½ç›‘æŽ§ä¿¡æ¯ã€?/li> æ·ÕdŠ è°ƒè¯•ä¿¡æ¯ã€?/li> ä¿è¯æ‰€æœ‰å¼‚帔Rƒ½è¢«æ£¼‹®æ•获到åQŒå¯¹æœªé¢„料到的异常åšé€šç”¨å¤„ç†åQŒé˜²æ¢ç»™C(j¨©)lientçœ‹åˆ°å†…éƒ¨å †æ ˆä¿¡æ¯ã€?br /> 在å“应返回给客户端之å‰ï¼Œæœ‰æ—¶å€™ä¹Ÿéœ€è¦åšä¸€äº›é¢„处ç†å†è¿”回:(x¨¬)
对å“应消æ¯ç¼–ç æˆ–压羃ã€?/li> 为所有å“åº”æ·»åŠ å…¬å…±å¤´ã€å°¾½{‰æ¶ˆæ¯ã€?/li> ˜q›ä¸€æ¥Enrichå“应消æ¯åQŒå¦‚æ·ÕdР公共嗿®µã€Sessionä¿¡æ¯ã€Cookieä¿¡æ¯åQŒç”šè‡›_®Œå…¨æ”¹å˜å“应消æ¯ç‰ã€?/li> 如何实现˜q™æ ·çš„éœ€æ±‚ï¼ŒåŒæ—¶ä¿æŒå¯æ‰©å±•性ã€å¯é‡ç”¨æ€§ã€å¯é…ç½®ã€ç§»æ¤æ€§ï¼Ÿé—®é¢˜è§£å†³ è¦å®žçŽ°è¿™¿U需求,最直观的方法就是在æ¯ä¸ªè¯äh±‚处熘q‡ç¨‹ä¸æ·»åŠ æ‰€æœ‰è¿™äº›é€»è¾‘åQŒäØ“(f¨´)了凞®‘代ç é‡å¤ï¼Œå¯ä»¥ž®†æ‰€æœ‰è¿™äº›æ£€æŸ¥æå–æˆæ–ÒŽ(gu¨©)³•åQŒè¿™æ ·åœ¨æ¯ä¸ªå¤„ç†æ–ÒŽ(gu¨©)³•ä¸è°ƒç”¨å³å¯ï¼š(x¨¬)public Response service1(Request request) { validate(request); request = transform(request); Response response = process1(request); return transform(response); }
æ¤æ—¶åQŒå¦‚果出现service2æ–ÒŽ(gu¨©)³•åQŒä¾ç„‰™œ€è¦æ‹·è´service1ä¸çš„实现åQŒç„¶åŽå°†process1æ¢æˆprocess2å›_¯ã€‚这个时候我们å‘现很多é‡å¤ä»£ç ,¾l§ç®‹å¯¹å®ƒé‡æž„åQŒæ¯”如æå–公共逻辑到基¾cÀLˆæ¨¡ç‰ˆæ–ÒŽ(gu¨©)³•åQŒè¿™¿Uä‹É用ç‘ô承的方å¼ä¼?x¨¬)引起å¾cÕd¯¹çˆ¶ç±»çš„耦åˆåQŒå¦‚æžœè¦è®©æŸäº›æ¨¡å—å˜çš„å¯é…ç½®éœ€è¦æœ‰å¤ªå¤šçš„判æ–逻辑åQŒä»£ç å˜çš„è‡ƒè‚¿ï¼›å› è€Œå¯ä»¥æ›´˜q›ä¸€æ¥ï¼Œž®†æ‰€æœ‰å¤„ç†é€»è¾‘抽象å‡ÞZ¸€ä¸ªProcessor接å£åQŒç„¶åŽä‹É用Decorate模å¼åQˆå³å¼•用优于¾l§æ‰¿åQ‰ï¼š(x¨¬)public interface Processor { Response process(Request request); } public class CoreProcessor implements Processor { public Response process(Request request) { // do process/calculation } } public class DecoratedProcessor implements Processor { private final Processor innerProcessor; public DecoratedProcessor(Processor processor) { this .innerProcessor = processor; } public Response process(Request request) { request = preProcess(request); Response response = innerProcessor.process(request); response = postProcess(response); return response; } protected Request preProcess(Request request) { return request; } protected Response postProcess(Response response) { return response; } } public void Transformer extends DecoratedProcessor { public Transformer(Processor processor) { super (processor); } protected Request preProcess(Request request) { return transformRequest(request); } protected Response postProcess(Response response) { return transformResponse(response); } }
æ¤æ—¶åQŒå¦‚果需è¦åœ¨çœŸæ£çš„处ç†é€»è¾‘之å‰åŠ å…¥å…¶ä»–çš„é¢„å¤„ç†é€»è¾‘åQŒåªéœ€è¦ç‘ô承DecoratedProcessoråQŒå®žçްpreProcess或postProcessæ–ÒŽ(gu¨©)³•åQŒåˆ†åˆ«åœ¨è¯äh±‚处ç†ä¹‹å‰å’Œè¯·æ±‚处ç†ä¹‹åŽæ¨ªå‘切入一些逻辑åQŒä¹Ÿž®±æ˜¯æ‰€è°“çš„AOP¾~–程åQšé¢å‘切é¢çš„¾~–程åQŒç„¶åŽåªéœ€è¦æ ¹æ®éœ€æ±‚æž„å»ø™¿™ä¸ªé“¾æ¡ï¼š(x¨¬)Processor processor = new MissingExceptionCatcher( new Debugger( new Transformer( new CoreProcessor()); Response response = processor.process(request); ......
˜q™å·²¾l是相对比较好的设计了,æ¯ä¸ªProcessoråªéœ€è¦å…³æ³¨è‡ªå·Þqš„实现逻辑å›_¯åQŒä»£ç å˜çš„简‹zï¼›òq¶ä¸”æ¯ä¸ªProcessorå„自独立åQŒå¯é‡ç”¨æ€§å¥½åQŒæµ‹è¯•方便;整æ¡é“¾ä¸Šèƒ½å®žçŽ°çš„åŠŸèƒ½åªæ˜¯å–å†³äºŽé“¾çš„æž„é€ ï¼Œå› è€Œåªéœ€è¦æœ‰ä¸€¿U方法酾|®é“¾çš„æž„é€ å³å¯ï¼Œå¯é…¾|®æ€§ä¹Ÿå˜å¾—ç‰|´»åQ›ç„¶è€Œå¾ˆå¤šæ—¶å€™å¼•用是一¿U陿€çš„ä¾èµ–åQŒè€Œæ— 法满‘›_Ѝæ€çš„éœ€æ±‚ã€‚è¦æž„é€ è¿™æ¡é“¾åQŒæ¯ä¸ªå‰¾|®Processor需è¦çŸ¥é“å…¶åŽçš„ProcessoråQŒè¿™åœ¨æŸäº›æƒ…况下òq¶ä¸æ˜¯åœ¨èµ·åˆž®ÞqŸ¥é“çš„ã€‚æ¤æ—Óž¼Œæˆ‘们需è¦å¼•å…¥Intercepting Filteræ¨¡å¼æ¥å®žçŽ°åŠ¨æ€çš„æ”¹å˜æ¡é“¾ã€?br />Intercepting Filteræ¨¡å¼ åœ¨å‰æ–‡å·²¾læž„å»ÞZº†ä¸€æ¡ç”±å¼•用而æˆçš„Processor链,然而这是一æ¡é™æ€é“¾åQŒåƈ且需è¦ä¸€å¼€å§‹å°±èƒ½æž„é€ å‡º˜q™æ¡é“¾ï¼Œä¸ÞZº†è§£å†³˜q™ä¸ªé™åˆ¶åQŒæˆ‘们å¯ä»¥å¼•入一个ProcessorChainæ¥ç»´æŠ¤è¿™æ¡é“¾åQŒåƈ且这æ¡é“¾å¯ä»¥åЍæ€çš„æž„å¾ã€?br /> 有多¿Uæ–¹å¼å¯ä»¥å®žçŽ°åÆˆæŽ§åˆ¶˜q™ä¸ªé“¾ï¼š(x¨¬)在å˜å‚¨ä¸ŠåQŒå¯ä»¥ä‹É用数¾l„æ¥å˜å‚¨æ‰€æœ‰çš„ProcessoråQŒProcessor在数¾l„ä¸çš„ä½¾|®è¡¨½Cø™¿™ä¸ªProcessor在链æ¡ä¸çš„ä½¾|®ï¼›ä¹Ÿå¯ä»¥ç”¨é“¾è¡¨æ¥å˜å‚¨æ‰€æœ‰çš„ProcessoråQŒæ¤æ—¶Processor在这个链表ä¸çš„ä½¾|®å³æ˜¯åœ¨é“¾ä¸çš„ä½¾|®ã€?/li> 在抽象上åQŒå¯ä»¥æ‰€æœ‰çš„逻辑都å°è£…在Processorä¸ï¼Œä¹Ÿå¯ä»¥å°†æ ¸å¿ƒé€»è¾‘使用Processor抽象åQŒè€Œå¤–围逻辑使用Filter抽象ã€?/li> 在浽E‹æŽ§åˆ¶ä¸ŠåQŒä¸€èˆ¬é€šè¿‡åœ¨Processor实现æ–ÒŽ(gu¨©)³•ä¸ç›´æŽ¥ä‹É用ProcessorChain实例(é€šè¿‡å‚æ•°æŽºå…¥)æ¥æŽ§åˆ¶æµ½E‹ï¼Œåˆ©ç”¨æ–ÒŽ(gu¨©)³•è°ƒç”¨çš„è¿›æ ˆå‡ºæ ˆçš„ç‰ÒŽ(gu¨©)€§å®žçްpreProcess()å’ŒpostProcess()处ç†ã€?/li> 在实际ä¸ä½¿ç”¨˜q™ä¸ªæ¨¡å¼çš„æœ‰åQšServletçš„Filter机制ã€Nettyçš„ChannelPipelineä¸ã€Structs2ä¸çš„Interceptorä¸éƒ½å®žçŽ°äº†è¿™ä¸ªæ¨¡å¼ã€?br />Intercepting Filter模å¼åœ¨Servletçš„Filterä¸çš„实现åQˆJetty版本åQ?/h2>å…¶ä¸Servletçš„Filter在Jetty的实çŽîC¸ä½¿ç”¨æ•°ç»„å˜å‚¨FilteråQŒFilter末尾å¯ä»¥ä½¿ç”¨Servlet实例处ç†çœŸæ£çš„业务逻辑åQŒåœ¨‹¹ç¨‹æŽ§åˆ¶ä¸Šï¼Œä½¿ç”¨FilterChainçš„doFilteræ–ÒŽ(gu¨©)³•æ¥å®žçŽ°ã€‚å¦‚FilterChain在Jettyä¸çš„实现åQ?br /> public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException // pass to next filter if (_filter < LazyList.size(_chain)) { FilterHolder holder = (FilterHolder)LazyList.get(_chain, _filter ++ ); Filter filter = holder.getFilter(); filter.doFilter(request, response, this ); return ; } // Call servlet HttpServletRequest srequest = (HttpServletRequest)request; if (_servletHolder != null ) { _servletHolder.handle(_baseRequest,request, response); } }
˜q™é‡ŒåQŒ_chain实际上是一个Filterçš„ArrayListåQŒç”±FilterChain调用doFilter()å¯åŠ¨è°ƒç”¨½W¬ä¸€ä¸ªFilterçš„doFilter()æ–ÒŽ(gu¨©)³•åQŒåœ¨å®žé™…çš„Filter实现ä¸ï¼Œéœ€è¦æ‰‹åŠ¨çš„è°ƒç”¨FilterChain.doFilter()æ–ÒŽ(gu¨©)³•æ¥å¯åŠ¨ä¸‹ä¸€ä¸ªFilter的调用,利用æ–ÒŽ(gu¨©)³•è°ƒç”¨çš„è¿›æ ˆå‡ºæ ˆçš„ç‰ÒŽ(gu¨©)€§å®žçްRequestçš„pre-processå’ŒResponseçš„post-process处ç†ã€‚如果ä¸è°ƒç”¨FilterChain.doFilter()æ–ÒŽ(gu¨©)³•åQŒåˆ™è¡¨ç¤ºä¸éœ€è¦è°ƒç”¨ä¹‹åŽçš„FilteråQŒæµ½E‹ä»Žå½“å‰Filter˜q”回åQŒåœ¨å®ƒä¹‹å‰çš„Filterçš„FilterChain.doFilter()调用之åŽçš„逻辑åå‘处ç†ç›´åˆ°½W¬ä¸€ä¸ªFilter处ç†å®Œæˆè€Œè¿”回ã€?br />public class MyFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // pre-process ServletRequest chain.doFilter(request, response); // post-process Servlet Response } }
整个Filteré“„¡š„处熋¹ç¨‹å¦‚下åQ?br />Intercepting Filter模å¼åœ¨Netty3ä¸çš„实现 Netty3在DefaultChannelPipelineä¸å®žçŽîCº†Intercepting Filter模å¼åQŒå…¶ä¸ChannelHandler是它的Filter。在Netty3çš„DefaultChannelPipelineä¸ï¼Œä½¿ç”¨ä¸€ä¸ªä»¥ChannelHandlerContext䏸™Š‚点的åŒå‘链表æ¥å˜å‚¨ChannelHandleråQŒæ‰€æœ‰çš„æ¨ªåˆ‡é¢é€»è¾‘和实际业务逻辑都用ChannelHandler表达åQŒåœ¨æŽ§åˆ¶‹¹ç¨‹ä¸Šä‹É用ChannelHandlerContextçš„sendDownstream()å’ŒsendUpstream()æ–ÒŽ(gu¨©)³•æ¥æŽ§åˆ¶æµ½E‹ã€‚ä¸åŒäºŽServletçš„FilteråQŒChannelHandleræœ‰ä¸¤ä¸ªåæŽ¥å£åQšChannelUpstreamHandlerå’ŒChannelDownstreamHandler分别用æ¥è¯äh±‚˜q›å…¥æ—¶çš„处熋¹ç¨‹å’Œå“应出åŽÀL—¶çš„å¤„ç†æµ½E‹ã€‚对于Client的请求,从DefaultChannelPipelineçš„sendUpstream()æ–ÒŽ(gu¨©)³•å…¥å£åQ?br />public void sendDownstream(ChannelEvent e) { DefaultChannelHandlerContext tail = getActualDownstreamContext( this .tail); if (tail == null ) { try { getSink().eventSunk( this , e); return ; } catch (Throwable t) { notifyHandlerException(e, t); return ; } } sendDownstream(tail, e); } void sendDownstream(DefaultChannelHandlerContext ctx, ChannelEvent e) { if (e instanceof UpstreamMessageEvent) { throw new IllegalArgumentException( " cannot send an upstream event to downstream " ); } try { ((ChannelDownstreamHandler) ctx.getHandler()).handleDownstream(ctx, e) } catch (Throwable t) { e.getFuture().setFailure(t); notifyHandlerException(e, t); } }
如果有å“应消æ¯ï¼Œè¯¥æ¶ˆæ¯ä»ŽDefaultChannelPipelineçš„sendDownstream()æ–ÒŽ(gu¨©)³•为入å£ï¼š(x¨¬)public void sendUpstream(ChannelEvent e) { DefaultChannelHandlerContext head = getActualUpstreamContext( this .head); if (head == null ) { return ; } sendUpstream(head, e); } void sendUpstream(DefaultChannelHandlerContext ctx, ChannelEvent e) { try { ((ChannelUpstreamHandler) ctx.getHandler()).handleUpstream(ctx, e); } catch (Throwable t) { notifyHandlerException(e, t); } }
在实际实现ChannelUpstreamHandler或ChannelDownstreamHandleræ—Óž¼Œè°ƒç”¨ChannelHandlerContextä¸çš„sendUpstream或sendDownstreamæ–ÒŽ(gu¨©)³•ž®†æŽ§åˆ¶æµ½E‹äº¤¾l™ä¸‹ä¸€ä¸ªChannelUpstreamHandler或下一个ChannelDownstreamHandleråQŒæˆ–调用Channelä¸çš„writeæ–ÒŽ(gu¨©)³•å‘é€å“应消æ¯ã€?br />public class MyChannelUpstreamHandler implements ChannelUpstreamHandler { public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception { // handle current logic, use Channel to write response if needed. // ctx.getChannel().write(message); ctx.sendUpstream(e); } } public class MyChannelDownstreamHandler implements ChannelDownstreamHandler { public void handleDownstream( ChannelHandlerContext ctx, ChannelEvent e) throws Exception { // handle current logic ctx.sendDownstream(e); } }
当ChannelHandlerå‘ChannelPipelineContextå‘é€äº‹ä»¶æ—¶åQŒå…¶å†…部从当å‰ChannelPipelineContext
èŠ‚ç‚¹å‡ºå‘æ‰‘Öˆ°ä¸‹ä¸€ä¸ªChannelUpstreamHandler或ChannelDownstreamHandler实例åQŒåƈå‘å…¶å‘é€?
ChannelEventåQŒå¯¹äºŽDownstream链,如果到达铑ְ¾åQŒåˆ™ž®†ChannelEventå‘é€ç»™C(j¨©)hannelSinkåQ?br />public void sendDownstream(ChannelEvent e) { DefaultChannelHandlerContext prev = getActualDownstreamContext( this .prev); if (prev == null ) { try { getSink().eventSunk(DefaultChannelPipeline. this , e); } catch (Throwable t) { notifyHandlerException(e, t); } } else { DefaultChannelPipeline. this .sendDownstream(prev, e); } } public void sendUpstream(ChannelEvent e) { DefaultChannelHandlerContext next = getActualUpstreamContext( this .next); if (next != null ) { DefaultChannelPipeline. this .sendUpstream(next, e); } }
æ£æ˜¯å› 䨓(f¨´)˜q™ä¸ªå®žçްåQŒå¦‚果在一个末ž®„¡š„ChannelUpstreamHandlerä¸å…ˆ¿U»é™¤è‡ªå·±åQŒåœ¨å‘末ž®¾æ·»åŠ ä¸€ä¸ªæ–°çš„ChannelUpstreamHandleråQŒå®ƒæ˜¯æ— 效的åQŒå› 为它的nextå·²ç»åœ¨è°ƒç”¨å‰ž®±å›ºå®šè®¾¾|®äØ“(f¨´)null了ã€?br /> 在DefaultChannelPipelineçš„ChannelHandler链æ¡çš„å¤„ç†æµ½E‹äØ“(f¨´)åQ?br /> 在这个实çŽîC¸åQŒä¸åƒServletçš„Filter实现利用æ–ÒŽ(gu¨©)³•è°ƒç”¨æ ˆçš„˜q›å‡ºæ ˆæ¥å®Œæˆpre-processå’Œpost-processåQŒè€Œæ˜¯åœ¨è¿›åŽÈš„é“‘Ö’Œå‡ºæ¥çš„链å„自调用handleUpstream()å’ŒhandleDownstream()æ–ÒŽ(gu¨©)³•åQŒè¿™æ ·ä¼š(x¨¬)引è“vè°ƒç”¨æ ˆå…¶å®žæ˜¯ä¸¤æ¡é“„¡š„æ€Õd’ŒåQŒå› è€Œéœ€è¦æ³¨æ„è¿™æ¡é“¾çš„æ€»é•¿åº¦ã€‚è¿™æ ·åšçš„好处是˜q™æ¡ChannelHandler的链ä¸ä¾èµ–于æ–ÒŽ(gu¨©)³•è°ƒç”¨æ ˆï¼Œè€Œæ˜¯åœ¨DefaultChannelPipeline内部本èín的链åQŒå› 而在handleUpstream()或handleDownstream()å¯ä»¥éšæ—¶ž®†æ‰§è¡Œæµ½E‹è{å‘给其他¾U¿ç¨‹æˆ–线½E‹æ± åQŒåªéœ€è¦ä¿ç•™C(j¨©)hannelPipelineContext引用åQŒåœ¨å¤„ç†å®ŒæˆåŽç”¨˜q™ä¸ªChannelPipelineContext釿–°å‘è¿™æ¡é“¾çš„åŽä¸€ä¸ªèŠ‚ç‚¹å‘é€ChannelEventåQŒç„¶è€Œç”±äºŽServletçš„Filterä¾èµ–äºŽæ–¹æ³•çš„è°ƒç”¨æ ˆï¼Œå› è€Œæ–¹æ³•è¿”å›žæ„å‘³ç€æ‰€æœ‰æ‰§è¡Œå®Œæˆï¼Œ˜q™ç§é™åˆ¶åœ¨å¼‚æ¥ç¼–½E‹ä¸ä¼?x¨¬)å¼•èµ·é—®é¢˜ï¼Œå› è€ŒServletåœ?.0åŽå¼•入了Async的支æŒã€?br />Intercepting Filter模å¼çš„缺ç‚?/h2>½Ž€å•æä¸€ä¸‹è¿™ä¸ªæ¨¡å¼çš„¾~ºç‚¹åQ?br />1. ç›¸å¯¹ä¼ ç»Ÿçš„ç¼–½E‹æ¨¡åž‹ï¼Œ˜q™ä¸ªæ¨¡å¼æœ‰ä¸€å®šçš„å¦ä¹ (f¨¤n)曲线åQŒéœ€è¦å¾ˆå¥½çš„ç†è§£è¯¥æ¨¡å¼åŽæ‰èƒ½ç‰|´»çš„应用它æ¥ç¼–½E‹ã€?br />2. 需è¦åˆ’分ä¸åŒçš„逻辑åˆîC¸åŒçš„Filterä¸ï¼Œ˜q™æœ‰äº›æ—¶å€™åÆˆä¸æ˜¯é‚£ä¹ˆå®ÒŽ(gu¨©)˜“ã€?br />3. å„个Filter之间å…׃ín数殞®†å˜å¾—困难。在Netty3ä¸å¯ä»¥è‡ªå®šä¹‰è‡ªå·±çš„ChannelEventæ¥å®žçŽ°è‡ªå®šä¹‰æ¶ˆæ¯çš„ä¼ è¾“ï¼Œæˆ–è€…ä‹É用ChannelPipelineContextçš„Attachmentå—æ®µæ¥å®žçŽ°æ¶ˆæ¯ä¼ 输,而Servletä¸çš„Filter则没有æä¾›ç±»ä¼¼çš„æœºåˆ¶åQŒå¦‚æžœä¸æ˜¯å¯ä»¥é…¾|®çš„æ•°æ®åœ¨Configä¸ä¼ 递,其他时候的数æ®å…׃ín需è¦å…¶ä»–机刉™…åˆå®Œæˆã€?br /> å‚è€?/h2>Core J2EE Pattern - Intercepting Filter ]]>Reactor模å¼è¯¦è§£ http://www.aygfsteel.com/DLevin/archive/2015/09/02/427045.htmlDLevin DLevin Wed, 02 Sep 2015 07:14:00 GMT http://www.aygfsteel.com/DLevin/archive/2015/09/02/427045.html http://www.aygfsteel.com/DLevin/comments/427045.html http://www.aygfsteel.com/DLevin/archive/2015/09/02/427045.html#Feedback 2 http://www.aygfsteel.com/DLevin/comments/commentRss/427045.html http://www.aygfsteel.com/DLevin/services/trackbacks/427045.html å‰è®°
½W¬ä¸€‹Æ¡å¬åˆ°Reactoræ¨¡å¼æ˜¯ä¸‰òq´å‰çš„æŸä¸ªæ™šä¸Šï¼Œä¸€ä¸ªå®¤å‹çªç„¶è·‘˜q‡æ¥é—®æˆ‘什么是Reactor模å¼åQŸæˆ‘上网查了一下,很多人都是给出NIOä¸çš„
Selector的例å,而且ž®±æ˜¯NIO里Selector多èµ\å¤ç”¨æ¨¡åž‹åQŒåªæ˜¯ç»™å®ƒè“v了一个比较fancyçš„åå—而已åQŒè™½ç„¶å®ƒå¼•入了EventLoopæ¦?
念,˜q™å¯¹æˆ‘æ¥è¯´æ˜¯æ–°çš„æ¦‚念åQŒä½†æ˜¯ä»£ç å®žçŽ°å´æ˜¯ä¸€æ ïL(f¨¥ng)š„åQŒå› 而我òq¶æ²¡æœ‰å¾ˆåœ¨æ„˜q™ä¸ªæ¨¡å¼ã€‚然而最˜q‘开始读Nettyæºç åQŒè€ŒReactoræ¨¡å¼æ˜¯å¾ˆå¤šä»‹¾lNettyçš„æ–‡ç« ä¸è¢«å¤§è‚†å®£ä¼ 的模å¼åQŒå› è€Œæˆ‘å†æ¬¡é—®è‡ªå·±ï¼Œä»€ä¹ˆæ˜¯Reactor模å¼åQŸæœ¬æ–‡å°±æ˜¯å¯¹˜q™ä¸ªé—®é¢˜å…³äºŽæˆ‘的一些ç†è§£å’Œž®è¯•ç€æ¥è§£½{”ã€?br />
什么是Reactor模å¼
è¦å›ž½{”这个问题,首先当然是求助Google或WikipediaåQŒå…¶ä¸Wikipedia上说åQ?#8220;The reactor design pattern is an event handling pattern for handling service requests delivered concurrently by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to associated request handlers.”。从˜q™ä¸ªæè¿°ä¸ï¼Œæˆ‘们知é“Reactor模å¼é¦–å…ˆæ˜?strong>事äšg驱动的,有一个或多个òq¶å‘输入æºï¼Œæœ‰ä¸€ä¸ªService HandleråQŒæœ‰å¤šä¸ªRequest Handlers