From 206a56c07eb6fe1f5fddddb456951938e826ddb4 Mon Sep 17 00:00:00 2001 From: Wxx <2563806166@qq.com> Date: Sat, 1 Mar 2025 21:22:59 +0800 Subject: [PATCH] =?UTF-8?q?version6:step3-=E5=BF=83=E8=B7=B3=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/common/message/RequestType.java | 18 +++++++++++++++ .../main/java/common/message/RpcRequest.java | 6 +++++ .../kama/client/netty/HeartbeatHandler.java | 12 +++++++--- .../kama/client/netty/NettyClientHandler.java | 2 +- .../client/netty/NettyClientInitializer.java | 6 ++--- .../com/kama/client/proxy/ClientProxy.java | 2 ++ .../kama/server/netty/HeartbeatHandler.java | 19 ++++++++-------- .../server/netty/NettyRpcServerHandler.java | 21 ++++++++++++------ .../server/netty/NettyServerInitializer.java | 6 ++--- .../client/netty/NettyClientInitializer.class | Bin 2292 -> 2594 bytes .../com/kama/client/proxy/ClientProxy.class | Bin 6236 -> 6423 bytes .../server/netty/NettyRpcServerHandler.class | Bin 4770 -> 5035 bytes .../server/netty/NettyServerInitializer.class | Bin 1682 -> 1995 bytes .../provider/RateLimitProvider.class | Bin 2264 -> 2264 bytes 14 files changed, 66 insertions(+), 26 deletions(-) create mode 100644 version6/krpc-common/src/main/java/common/message/RequestType.java diff --git a/version6/krpc-common/src/main/java/common/message/RequestType.java b/version6/krpc-common/src/main/java/common/message/RequestType.java new file mode 100644 index 0000000..d1eef1e --- /dev/null +++ b/version6/krpc-common/src/main/java/common/message/RequestType.java @@ -0,0 +1,18 @@ +package common.message; + +import lombok.AllArgsConstructor; + +/** + * @author wxx + * @version 1.0 + * @create 2025/2/28 18:32 + */ +@AllArgsConstructor +public enum RequestType { + NORMAL(0), HEARTBEAT(1); + private int code; + + public int getCode() { + return code; + } +} diff --git a/version6/krpc-common/src/main/java/common/message/RpcRequest.java b/version6/krpc-common/src/main/java/common/message/RpcRequest.java index b44a931..2c711a1 100644 --- a/version6/krpc-common/src/main/java/common/message/RpcRequest.java +++ b/version6/krpc-common/src/main/java/common/message/RpcRequest.java @@ -20,6 +20,8 @@ import java.io.Serializable; @Data @Builder public class RpcRequest implements Serializable { + //v6新增:请求类型 + private RequestType type=RequestType.NORMAL; //接口名、方法名、参数列表参数类型 private String interfaceName; @@ -28,4 +30,8 @@ public class RpcRequest implements Serializable { private Object[] params; private Class[] paramsType; + public static RpcRequest heartBeat() { + return RpcRequest.builder().type(RequestType.HEARTBEAT).build(); + } + } diff --git a/version6/krpc-core/src/main/java/com/kama/client/netty/HeartbeatHandler.java b/version6/krpc-core/src/main/java/com/kama/client/netty/HeartbeatHandler.java index c4587fb..dcdb627 100644 --- a/version6/krpc-core/src/main/java/com/kama/client/netty/HeartbeatHandler.java +++ b/version6/krpc-core/src/main/java/com/kama/client/netty/HeartbeatHandler.java @@ -1,15 +1,20 @@ package com.kama.client.netty; +import common.message.RpcRequest; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; +import lombok.extern.slf4j.Slf4j; + +import java.lang.ref.ReferenceQueue; /** * @author wxx * @version 1.0 * @create 2025/2/13 15:01 */ +@Slf4j public class HeartbeatHandler extends ChannelDuplexHandler { @Override @@ -20,10 +25,11 @@ public class HeartbeatHandler extends ChannelDuplexHandler { IdleState idleState = idleStateEvent.state(); if(idleState == IdleState.WRITER_IDLE) { - ctx.writeAndFlush("两秒没有写数据,发送心跳包\n"); - System.out.println("超过两秒没有写数据,发送心跳包"); + ctx.writeAndFlush(RpcRequest.heartBeat()); + log.info("超过8秒没有写数据,发送心跳包"); } - + }else { + super.userEventTriggered(ctx, evt); } } } diff --git a/version6/krpc-core/src/main/java/com/kama/client/netty/NettyClientHandler.java b/version6/krpc-core/src/main/java/com/kama/client/netty/NettyClientHandler.java index 15c98ff..7975d5f 100644 --- a/version6/krpc-core/src/main/java/com/kama/client/netty/NettyClientHandler.java +++ b/version6/krpc-core/src/main/java/com/kama/client/netty/NettyClientHandler.java @@ -23,7 +23,7 @@ public class NettyClientHandler extends SimpleChannelInboundHandler AttributeKey RESPONSE_KEY = AttributeKey.valueOf("RPCResponse"); // 将响应存入 Channel 属性 ctx.channel().attr(RESPONSE_KEY).set(response); - ctx.channel().close(); + //ctx.channel().close(); } @Override diff --git a/version6/krpc-core/src/main/java/com/kama/client/netty/NettyClientInitializer.java b/version6/krpc-core/src/main/java/com/kama/client/netty/NettyClientInitializer.java index 521aa27..8483a58 100644 --- a/version6/krpc-core/src/main/java/com/kama/client/netty/NettyClientInitializer.java +++ b/version6/krpc-core/src/main/java/com/kama/client/netty/NettyClientInitializer.java @@ -35,9 +35,9 @@ public class NettyClientInitializer extends ChannelInitializer { pipeline.addLast(new MyDecoder()); pipeline.addLast(new NettyClientHandler()); pipeline.addLast(new MDCChannelHandler()); - // 客户端只关注写事件,如果超过2秒没有发送数据,则发送心跳包 - //pipeline.addLast(new IdleStateHandler(0, 2, 0, TimeUnit.SECONDS)); - //pipeline.addLast(new HeartbeatHandler()); + // 客户端只关注写事件,如果超过8秒没有发送数据,则发送心跳包 + pipeline.addLast(new IdleStateHandler(0, 8, 0, TimeUnit.SECONDS)); + pipeline.addLast(new HeartbeatHandler()); log.info("Netty client pipeline initialized with serializer type: {}",Serializer.getSerializerByCode(3).getType()); } catch (Exception e) { log.error("Error initializing Netty client pipeline", e); diff --git a/version6/krpc-core/src/main/java/com/kama/client/proxy/ClientProxy.java b/version6/krpc-core/src/main/java/com/kama/client/proxy/ClientProxy.java index f0b7acc..8e07ea2 100644 --- a/version6/krpc-core/src/main/java/com/kama/client/proxy/ClientProxy.java +++ b/version6/krpc-core/src/main/java/com/kama/client/proxy/ClientProxy.java @@ -8,6 +8,7 @@ import com.kama.client.rpcclient.impl.NettyRpcClient; import com.kama.client.servicecenter.ServiceCenter; import com.kama.client.servicecenter.ZKServiceCenter; import com.kama.trace.interceptor.ClientTraceInterceptor; +import common.message.RequestType; import common.message.RpcRequest; import common.message.RpcResponse; import common.trace.TraceContext; @@ -46,6 +47,7 @@ public class ClientProxy implements InvocationHandler { //System.out.println(TraceContext.getTraceId() +";"+ TraceContext.getSpanId()); //构建request RpcRequest request = RpcRequest.builder() + .type(RequestType.NORMAL) .interfaceName(method.getDeclaringClass().getName()) .methodName(method.getName()) .params(args).paramsType(method.getParameterTypes()).build(); diff --git a/version6/krpc-core/src/main/java/com/kama/server/netty/HeartbeatHandler.java b/version6/krpc-core/src/main/java/com/kama/server/netty/HeartbeatHandler.java index 045bea1..277f216 100644 --- a/version6/krpc-core/src/main/java/com/kama/server/netty/HeartbeatHandler.java +++ b/version6/krpc-core/src/main/java/com/kama/server/netty/HeartbeatHandler.java @@ -4,35 +4,36 @@ import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.timeout.IdleState; import io.netty.handler.timeout.IdleStateEvent; +import lombok.extern.slf4j.Slf4j; /** * @author wxx * @version 1.0 * @create 2025/2/13 15:27 */ +@Slf4j public class HeartbeatHandler extends ChannelDuplexHandler { @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + try { // 处理IdleState.READER_IDLE时间 if(evt instanceof IdleStateEvent) { IdleStateEvent idleStateEvent = (IdleStateEvent) evt; IdleState idleState = ((IdleStateEvent) evt).state(); - // 如果是触发的是读空闲时间,说明已经超过n秒没有收到客户端心跳包 if(idleState == IdleState.READER_IDLE) { - System.out.println("超过n秒没有收到客户端心跳, channel: " + ctx.channel()); - + log.info("超过10秒没有收到客户端心跳, channel: " + ctx.channel()); + // 关闭channel,避免造成更多资源占用 + ctx.close(); + }else if(idleState ==IdleState.WRITER_IDLE){ + log.info("超过20s没有写数据,channel: " + ctx.channel()); // 关闭channel,避免造成更多资源占用 ctx.close(); } - + }}catch (Exception e){ + log.error("处理事件发生异常"+e); } } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { - System.out.println("接收到客户端数据, channel: " + ctx.channel() + ", 数据: " + msg.toString()); - } } \ No newline at end of file diff --git a/version6/krpc-core/src/main/java/com/kama/server/netty/NettyRpcServerHandler.java b/version6/krpc-core/src/main/java/com/kama/server/netty/NettyRpcServerHandler.java index f12a92d..5a40409 100644 --- a/version6/krpc-core/src/main/java/com/kama/server/netty/NettyRpcServerHandler.java +++ b/version6/krpc-core/src/main/java/com/kama/server/netty/NettyRpcServerHandler.java @@ -4,6 +4,7 @@ package com.kama.server.netty; import com.kama.server.provider.ServiceProvider; import com.kama.server.ratelimit.RateLimit; import com.kama.trace.interceptor.ServerTraceInterceptor; +import common.message.RequestType; import common.message.RpcRequest; import common.message.RpcResponse; import io.netty.channel.ChannelFutureListener; @@ -34,16 +35,22 @@ public class NettyRpcServerHandler extends SimpleChannelInboundHandler { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); - // 服务端只关注读事件,如果3秒内没有收到客户端的消息,将会触发IdleState.READER_IDLE事件,将由HeartbeatHandler进行处理 - //pipeline.addLast(new IdleStateHandler(3, 0, 0 ,TimeUnit.SECONDS)); - //pipeline.addLast(new HeartbeatHandler()); + // 服务端关注读事件和写事件,如果10秒内没有收到客户端的消息,将会触发IdleState.READER_IDLE事件,将由HeartbeatHandler进行处理 + pipeline.addLast(new IdleStateHandler(10, 20, 0 ,TimeUnit.SECONDS)); + pipeline.addLast(new HeartbeatHandler()); //使用自定义的编/解码器 pipeline.addLast(new MyEncoder(Serializer.getSerializerByCode(3))); pipeline.addLast(new MyDecoder()); diff --git a/version6/krpc-core/target/classes/com/kama/client/netty/NettyClientInitializer.class b/version6/krpc-core/target/classes/com/kama/client/netty/NettyClientInitializer.class index 15eeb3149e926361b740de8fa79691e35113376f..e6d9a30020211437652b04247723cb8ceb363ad3 100644 GIT binary patch delta 916 zcmZXROHUJF6o#L#Q<%04i6Ain;}ua_DB~5R2#Q>Uf*_WQc*C)bP$(_d!AN4#zo6+q zaD$N*m;lvySsK^w{R=Kk+^J_uLr}iO`Oft{=e*}<#jC2o*Wd3x0_`lV1-^K)Iw3_c zkv3Dd<1CxAR%$wFXG|xtV5gTHvtO*3V>x!;cA!K`-RJYugsF4d;0$LKhvuxOmbv64 zl4d-eiZ5j{cFHkF1!XLia1?s1r)zkqJEk}?xH~nwC$}v?kn;v5Tu{{2N2Aey3ijp) z$8}m1C*$b_bKY98%y=^4Hs4;T&$cqoL)&tS3j}CJ^An*>=aPZePDk#$XHZ?qHENx; zR}H%8mT_lnXLNbdR%rFX{s6sP)9EwlCz^YqwU!NXU1!K(m>aooT5ruw#s0!tNh>vD z_B@N*i%ue)@-dn_?+yC~88?{VRxaUf@kO|8aEH6O*WUKB`%LLPFtB*|_J{YEnvUQR zdKEQtp$^f!qL)xAGA@=WzmmTsw24|1#ly5nHw*`{MH<@)JYq&HuiHtoq*#qnE;i(I z1Nv09(ffh&N$owsNq-d${&m8eoQvhD@i4IyY@XcYV$r!yYvtwAEh_SKDz@m!GoZ0T z#gH3`h4YMQgg>px0J^x}FoISXuUQ(yVeua4D79SR1lcHcOmT|m)bmnKzCu_^Lafrj z291K>RM;mZGp`E3ED3>=>5H4W+8pzRX6uxZlr0w|egMxO0n&6LIzC-kQ92{#q$K8& zIkK-?I7w%>N#UIQF5~`C!)JUOO#aVm^)6QZ#ojwu_*mRI&andX0#zB=;@(?YT`0Bd RK-JRevG_b>(4Q0(=Pz-ov_Jp= delta 599 zcmZ9JOHWfl6vuyaAD!Fw5-Bl8BpL)w=(HDnAs|$&BFg(AzQy{WapA^=BzA=hf*)YE zuH3k;B+|MNm&DKEM=)_Go_m`pF_WCfoHPIPKmYk~_-8Kj{r8uzK#6KSv*)y@F%&e# zkcfUo(Y{O-t>Yb6XKc4u?mZWBo(l^7qWXHJ_NuCI`|?v6E;6JU4jJK+-SkGXW0W+P zL&mvc_q<7U)gJPXstMcYN5L4AAvd^bSN);DFdZ_(tbOm7vhyrx7DJX;-u~hLQfmfB zxG9dsY$Wm|_DPAoCE0*@CEhnXsJa9WD`Mj^ba7j3*lOSocO~=UNzx^cRTo-vcxT6h z%El-19RsNbxh7{74F;Qxx_l%zA6KqLO|H8{yLExntn-F4ZZfQ&tbm-5+a9{5HV(P@}*mMYd#zn3R#hHQKnxeL)clY_#~r;R7BfL*5GTBjLI#4M%YH1M#xFw#mm>>VV9hGU}<^IXvTe;@AEF8_7=G diff --git a/version6/krpc-core/target/classes/com/kama/client/proxy/ClientProxy.class b/version6/krpc-core/target/classes/com/kama/client/proxy/ClientProxy.class index ce4c829f285aa7c8d3e13c2da3c732ae703e870a..b138af1ee4e37a5181a4177fbec641d90d75cd7d 100644 GIT binary patch delta 2364 zcmaJ?dtj5*75|;&OYWC1x2;Kp`n9xJOG}zIq@XP$JQRTZW_TvCYl77f$fpFT(s|+aI~#z2~0$ zJFnk4d9LyPdDhga1BU=CrpCQi#C4qy)tDtvBTtdzJ6tJE{@C_}84XvG?38XbICE76WCRMKehc1T=_ ztJDsoySNiq3v@}m9q%AS)nOy58a%f5of6mJU23(bf)c9F6Y(d}Bao8VfL^uJb6Itt z#0^+LIHxz2Sv8nR4R1&!Qw5Lw=$9D4pz?XUy+ab4FswFuSC~m;Bu24W<-JwKW4KY^ zCW$TB%6Yu!;!5Qa*BCczA6_)e)GcC~xef1;@Zc7;Q`CCjD{&icS5uPijhQt?+u^pb9UqZUxK}-D-c)uUA#_7xb0XHC80?L$7)z#x zGJWYm6A!2*zH;{MA&HOTVU_T;ggdcQ;$!d;j911ERY;O6v3F7`N{kT`@V)hvIt*@VLqU&Ytd zT7S&{bsQ1+hQv{PQ{CaemyW4QIiqMw=V1y@OMDyOQ7h%bj_(nu+Qj$y6E^V!{xq2Q z5r68m;!h-gs;g>d(jA%MzQJA{^79fu(?NKW{pk@-!Wf>n@FIR8@Joqb;n(U}*-pPz zwMBQ+%M<&HPEy%xf&^3JKlv_z3G%69B{RuCaiU~7QJHECEG@pkqH3BYh`V$X)v9dZ zDGICQ!THpnwgw}{973ha1}oLkU@-6-7%0=k{)R6rh%Yu9l)bLu1 z63k}ZFn-Sx3F5UJC-4XU{*iwMOa8>aKjSZq^b*58!ZHh>#ym>%n6VER4LA|BH^m_?ucN zEtwv=gdxr_mn;xTDk?A+z3i7e%a%j+Ief)<0!>}+`i@8*PpxU#!{S0oEFBwq5MY;d zPn^$kesU%g2vISWa3%t9(K(zG7X|pf&^h`p$TmYPanZSq#N(ZHxo=1^ju*%xc@R@f z%Wt(s*^T4D@ABew2JfHYeJ3AU;)c7~GtFZghjwFb)HbGh<~i+kywedHJ-bm94L+;Y z$6-Z-Kh(S1JT!j#ICtKUbu@-Uu!!ze{s%IdHZ#$Wnk>82$WATh-dc$vT!CTc#Q+bB zQ77Cb>|_|tG>xWnx`5=_z>`=+JpUY7fdVEIsg%y+z-q9BY$la)HW>v;IZJe{129e@ zEHEXqG=sw4lZ;JzS{9PSY%U;&bQ4bEIdVFF5xLZmSU$8TbP+!d4g?w%fvcU z9g`}~LRLAh0=}R>j~6D;t$_#&b=zsPKn2`XsnKaBozGw98SyKcO?7+zX1#;0yF>s delta 2178 zcmZvcdw|qc6~{k!<~Q^E&CK0pcLrEyUx>@X?y%D?2&gL{$QxZim%t6A)@6l-WtV0b z;-QVzs+E<>wM>N~dTcLp1sryk#4XIoGAko{m}X_~GRp^%KT-I*uP?Y6^StQOxIj$FTQG;)QhbC!Em%+$={ zO4H{gy?W+ou41mqI?ZyJuUWuCGcr&YT&!8b)n-9pO{9sXF3U8_xz-#AEDknnR`7Q7 zW}rf?GNr*pq=k35tk$gI2D2=~+LcU)l?-7Z@+?(hD*&9ZhnfP|M<{oyNXm~+&6ZdL9PEb*hYH#aKty|FA(YZC% z9^pPd>2km30Uk8Bgj12de9Gn1ntgo6%<;ucL8QE_iO*_2_dlE2T#o{@IW5Oz~N?lbZ z>`>*VA^NzgG_OT3RTrCNEa8k-RGNlZrP&dS7C(nWspXzDjW0)nJ+TV)ycvqsrC$(P zRPJHC{HqxuO;pN6ekBr(l7AU5@@rXtBcCIZ-^%wpelJMR3!D*I7*t}Al0nMrGF+UY zCd1ogH#NhwWQNORJ0rvF4D%YD#9?Cjt3{20cp#nOng=L8$aT?`aVN|5e$+rB?qpai zTCI()+{E1>+96Aa4|yK8dYgSTdWoa-w8Xt5Y<-07xf?I;X1UqV{mihCx7y?T{T!vQ zd7!N+d%y=-vo?=ey zBVv{I_Y=#D)T{gOa__9U&*%Kk-3-#7<$!|?b&!WFO2l3q?8i|9lEJ$;zyNoq@ncJ{ zlS=s~<H&OZd2mcf{OyzZ66-t>%1YM zrKIyt@h?11OTaB@LT6awQsL5cPNE9AL|l9>RWAR|i{;UqE@x3Lcb1$JQvM$um%Zn; zC>b$2Hd`Pr@YTAjeBxb>uQEyl;w{7`Wym;>rm1c5PihwS4mH&ch&*48u#Jryr3`Jk z>|B(8b0HJNl%oQYiDG;zC^_+oa~Jx>-g#nEawl?&B$HfprCXF1oS?|tjxsEa{N~bh zQv5g`{kHt_U2#169oesv!;D79KRqxi5Ose}C zhFuj^HNn#Yt+&CjXW zc_%#;dkb=04iG}o$RIyC#B~-(<$$bJm|Tuu8o^d-lo~Cotz3zG6>6-UqGGk43Uv`7 LHBMEjYU2L^Sya#O diff --git a/version6/krpc-core/target/classes/com/kama/server/netty/NettyRpcServerHandler.class b/version6/krpc-core/target/classes/com/kama/server/netty/NettyRpcServerHandler.class index 525d979fd58fbc57e5985c827da9a172a4246e8c..0f74e4897ded3daf0121cbe0aa55f30055c875bd 100644 GIT binary patch delta 1852 zcmaJ>c~q2D6#uf#%in)zA5DGKEfN5G&iK)4y zJvBAWB$rYX6df4LB{ePE%T{eYhow`ePXF~!%l!rqc21|xocHc~@80kCe(!hhou2L2D|{0tKYG9+|vJ>0n?(6OPVbN}J) z^~X9+Hg#@j>pI@twYRb3;@a-E){f2VEKm^3aW7N`L#3zOs}YLh7^1O}ie?lSW)~<( zK%$H!j-g22e!Ebzaiqd79IU_;j^P{*q=_b$5}$yP9HTTSi>tieU6<$bEUj`|Fa~2~ zjN=%O3E~%4$1;RVmmp2#2t$_Gq;o`#!6c4sOlB~aRe60R+YpjX{Kle(=Qh+g)VVVh zgkvg44$>IHN!;lk!Y_A~xrBFdPf zR^TBSl^n~koN^@=vKX<}m}$yKHHQaYaosrHQj0nnK8|`c2t^u83O&rR601a>lww(p zH8LLMcnp5AMk*uc6C6)st>}`H)OC1D#(Ito*vJqqYAn%Wlsqk}0-HECV+&Q4ufgY| zB4S8O7IA7naY!D-o)MSj1h!pt$%#yeFjE@aDY8r>mFF~hcas3gLRFKJW}C2=A)<3v zu(Ne%=fcpQ>Ju~qX{nwlX;%yFpkJL%JDK@5!L3$ z#A?MRell;14J)a4l`SuH)i_;CswiDb&dM@(O?{=;?*q@iq%r~jX0s&4Bt`Xh-Nib{I070 zebiq%#J~uNRuNjB$x1M2G|6*}cGt)n$WF6ghk6<;LJq>L!zp_JeNN+^BRz)$f*90$ zIQR$#v?Ja|At^;P4Qt1U)L}u4)?v;mg3{wS%_HIGWQGuWJXGq0K1iZo9ZI`o+SxE1 zc8s8T9EE0KG;%Q(C+G_seKC%rU&Tp+B4%ht3t4S-3PdrqYQ-61ewNlo===1GLx7eB za<JiA%SJOurbviz?4GU8RQ0VKgl$+h%}nbuoux9m-)nHp&s^g zSOT=8yhV$ou&Q)})et~UDhW$tMF5Ya8?8pGfi{l^(3mb+rFJ~sk}hc|JEZfdE!Epg zN;Utml2W5pDhXnj9ua%|8Y;bF0v2E)w%)PZ?$~F^(~~DHO_NB*Dd>x-R4%zlB&i+9 zr^p#J&%|8JB7|b<>=NogXGou7nCM)hraMn_J|b}e7YSuCCHE5Epff*-&?{dfE>p(n ze~ON;;3~=27e2g6^`{Zc$8~}+gz}jH-5+qscuU5dzoMtqsrHQqLk+D?^<>^gfA#K(EqDE2<}~my{A}2^Kz;8sa_jX$3Qy2x$eQ z*i!A65FWsbA+Ud8@ert?{V|+r^L{T?se1+SzQ)u-yzQy;j{tf%EmY@It delta 1509 zcmZvc*>_V_6vlri!@WuFAuTOK6B!D0plP581!;vcNEIklp-e>?0+b43)q6NR2;he z&*`(kc&_XS{bYVtbygouUkXf#XGS>6O*Z{B{TZN$n1mBC8$D$uxfE&!5mq>fmFt>X zrzToftZ8x>LXl0eri4;OiHSQU=1ueTx)Wu#^l1I&-!zSd~X7;Z7wy_1|Os%>u7jAOj1_9dMOOthJ#napkGqOZ-V z<#wApG*g*o8vIqN&TR7+=FZgAbEm?$A<^2RDDBE!V9nCZromkI*E(~VXER^3fJRee zH3q7|=bpjbU+ehZ9H&zL^Jk=C=W zNY9!2;IJVtDDtlEPG9ZVb#?RMYX`UfzH`sD_Vy54c+qC7W*fcC{@^(4WzBYWm|ubm z9m7tWU7FpzYHCB9%palc=0YfDo^blBcRThu&8qJyMegdv`b5Q=L`!o;!@Aa0EzLIR zj!2Ih6}}MSB45~i>56m7G=(qvzE;$l?f%|oa?T{*w~Au3BV6pY`QEhWR3x`Z=Xi+X z$C6#1TP#^Ed@d#Nye6kzvif8l8oxyNI4aLh6ZCMblbl#QMellX6cA@1!zoQl*X)&$ST+IscwJ7CiZ|Gg%IpsCrVuC~ zmxCM<;J3u;Mdk3eY*j*P>+*TuF`oL=$dyG)11)5N@#rx~WQ#5@^d;Y`RVk`9%^ zXmo}|VfJ1(iTrL7`Ml2uf`22U$9-XvSM*WKL@!%1ww0&2d1mYcl_|!GCN=dU$P^{m z1umEA!exe+_-XEfPUaky$YiC&Ev)uMd?^;o^@xlWDekTINBj|=99mMeR$CFPlShtL zTQ1Dg))|&GdgBd^u0PVy=#N+pY1+KxJ@2B*M^v$h#XR1%Zt7Z}6pve!k!YE#q~zmB z_LTodlnE3wQA#mI%u}gjnmncH0#V0OX0VBw8GU9;H5bUYuIGr%b>#CQ9|_D-iujmz zv55xV>a}rH3a7-MLwM+G`Py0BJKT&_>yja zR|+GyV?wd=_<5o!UiyD9odFJYf!*kZ0H4yUi`bw{3VnU)n zAkLHj;EPwRM$^8kiSf~&G42^CHrh$%oU_+jd+p0}=eI%W>+g?W04$)`mfEdwwXW7Q zU4NwBt<>&pY7JGd-q-3)U0tE5pjUJ)(eGDPvr_JrpXqAS(u2uBjL=wE1Fst|(Y)ZH!AlQDP zI3}S82+N2d+Wy{j1~6r6;tX*m*ZvW6u7G+$((wmz$p0QP9 zo!@CCNC_}-rYpT{;7tj|X^MWqNeJ*Xx&_9NkMW-&lx?3NmR)eT;1pkDu!F;eEga== zqfdLw9gP1A2Fmsi2z3zKL$oY6mE_ZVPz#(XN8VztgR?#274^Ykna(i?z0-#f#*u^{ zMFdbq5Kl0Pi^Tf6ed7``6ww4&L6+te@E8NQOinpM`4&NW`e}W1nj@!(;^>wl9V|qm z?=bhbu$?r3$133Ns`>>aYk_PiP3v1D&h(n?d5MweHn{gV|DRRd@{%oIvFBwqMo6Br NuaFCetGH&}g+Ir|p9lZ| delta 569 zcmZvY%TC)+5Qe{V?8LHTAc2yGTQHbQaGW+kZ0;Dq4jN-Lk1v3D!JAILoRJ z&}G$@a1p58QmJpySE)KqBajdapYi-N=bQh`udd?`@A~ig6|l%^!)urxYshS9H{;Xc z(CO1f*1Xe)IhSsq9v&#t3;XZ)50=ayJ)O;v=b=Nvr;mO`(AW;lN428{P0lLi1}G+X zh80$6>W#yQS+=U3A!82XJ`+qTV)NUM&1b9T2TUc+k)l#ES5{;K+je7$4i!b%*e;mM zRL1iNdF)eV`s=Q3E45(uQa_JEVtIi=Cs6sbu#*|+v3-eCw=Qt& z=~FUIa<9+m)x5na4Ah$p-4%m+^o`LbrFP+qAT_gc9_2|%D9W6WfH9sj&XzcNB5Lq| zwrI~J6Bj(^g?M#Xms@j!cqyta%DjBC067!aOH$Diy{Jh!Dt~A6c3@h1pwQyy(I1kw un*m;H2`alLD_9gn0-J5a+^GBmeZr&rS$>P_wo$jfw75wgyUa=}*8TxE`$&iY diff --git a/version6/krpc-core/target/classes/com/kama/server/ratelimit/provider/RateLimitProvider.class b/version6/krpc-core/target/classes/com/kama/server/ratelimit/provider/RateLimitProvider.class index 499dd034eeffc1722cebf77240052a9744fecb55..52a1470e5eec50f24e1aa0ee5fab35a38ea598a8 100644 GIT binary patch delta 34 pcmca1ctdc*Y-Uj|Mg|@iS2xE{pOE+<#}HR$1_p+d%^R3CSOKbI2-g4r delta 34 pcmca1ctdc*Y-Z6EMg|@iS2xE{pOE+<#}HR$1_lPM%^R3CSOKwX2-g4r