Netty、Redis、Zookeeper高并发实战(1).docx

上传人:lao****ou 文档编号:1052194 上传时间:2024-09-25 格式:DOCX 页数:5 大小:23.31KB
下载 相关 举报
Netty、Redis、Zookeeper高并发实战(1).docx_第1页
第1页 / 共5页
Netty、Redis、Zookeeper高并发实战(1).docx_第2页
第2页 / 共5页
Netty、Redis、Zookeeper高并发实战(1).docx_第3页
第3页 / 共5页
Netty、Redis、Zookeeper高并发实战(1).docx_第4页
第4页 / 共5页
Netty、Redis、Zookeeper高并发实战(1).docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《Netty、Redis、Zookeeper高并发实战(1).docx》由会员分享,可在线阅读,更多相关《Netty、Redis、Zookeeper高并发实战(1).docx(5页珍藏版)》请在第一文库网上搜索。

1、还是以疯狂创客圈的“CrazyIM”实战项目中获取用户信息和用户登录这两个AP1的代理接口的调用为例。实践案例的代码如下:importcom.crazymakercirc1e.imServer.feignC1ient.UserAction;importfeign.Feign;importfeign,codec.StringDecoder;importorg.junit.Test;* 远程AP1的本地调用* Createdby尼恩at疯狂创客圈* /pub1icc1ass1oginzXctionTest/*测试登录/TeStpub1icvoidtest1ogin()UserActionactio

2、n=Feign,buiIderO/.decoder(newGsonDecoderO).decoder(newStringDecoderO).target(UserAction.c1ass,http:IoCaIhoSt:8080/USer);StringS=action.IoginAction(*zhangsan,“zhangsan);System,out.printIn(*s=+s);*测试获取用户信息*/QTestpub1icvoidtestGetById()UserActionaction=Feign,buiIderO/.decoder(newGsonDecoderO).decoder(n

3、ewStringDecoderO).target(UserAction.c1ass,*http:/1oca1host:8080/user*);Strings=action.getById(2);System,out.print1n(*s=+s);)最为核心的就一步,构建一个远程代理接口的本地实例。调用Feign.bui1der。构造器模式的方法,带上一票配置方法的链式调用。主要的链式调用的配置方法介绍如下:(1) OPtionS配置方法OPtionS方法指定连接超时的时长以及响应超时的时长。(2) rctryer配置方法retryer方法主要是指定重试策略。(3) decoder配置方法dec

4、oder方法指定对象解码方式,这里用的是基于String字符串的解码方式。如果需要使用JaCkSOn的解码方式,需要在pom.xm1中添加JaCkSOn的依赖。(4) c1ient配置方法此方法用于配置底层的请求客户端。Feign默认使用Java的HttpUR1Connection作为HTTP请求客户端。Feign也可以直接使用现有的公共第三方HTTP客户端类库,如APaCheHttpC1ient,OKHttp,来编写JaVa客户端以访问HnP服务。集成APaCheHttPCOmPonentSHttPC1ient的例子为:Feign,bui1der().c1ient(newApacheHttp

5、C1ient()集成OKHttP的例子为:Feign,bui1der().c1ient(newOkHttpC1ient().target(.)集成Ribbon的例子为:Feign,bui1derO.c1ient(RibbonC1ient.createO).target(.)Feign集成了Ribbon后,利用Ribbon维护了AP1服务列表信息,并且通过轮询实现了客户端的负载均衡。而与RibbOn不同的是,Feign只需要定义服务绑定接口且以声明的方法,可以优雅而简单地实现服务调用。(5) target方法这是构造器模式最后面的方法,通过它可以最终得到本地代理实例。它有两个参数,第一个是本地的

6、代理接口的C1aSS类型,第二个是远程UR1的根目录地址。第一个代理接口类很重要,最终Feign.bui1der()构造器返回的本地代理实例类型就这个接口的类型。代理接口类中每一个接口方法前用既equest1ine声明的UR1链接,最终都会加上target方法的第二个参数的根目录值,来形成最终的UR1target方法是最后面的一个方法,也就是说它的后面不能再链接调用其他的配置方法。主要的构造器方法就介绍这些,具体使用的细节以及其他的方法,请参见官网的说明文档。使用配置方法完成配置之后,再通过Feign.bui1der()构造完成代理实例,调用远程API,这就和调用JaVa函数一样简单了。总之,

7、如果是独立调用HTTP服务,那么尽量使用Feign。原因是一是简单;二是如果采用HttPCIient或其他相对较“重”的框架,对初学者来说编码量与学习曲线都会是一个挑战;三是既可以独立使用Feign,又方便后续SPringCOU1d微服务框架的继承。使用Feign代替HttpC1ient等其他方式,何乐而不为呢?12.6分布式的在线用户统计的实践案例顾名思义,计数器是用来计数的。在分布式环境中,常规的计数器是不能使用的,在此介绍ZooKeeper实现的分布式计数器。利用ZooKeeper可以实现一个集群共享的计数器,只要使用相同的path就可以得到最新的计数器值,这是由ZooKeeper的一致

8、性保证的。12.6.1Curator的分布式计数器CUratOr有两个计数器,一个是用int类型来计数(SharedCOUnt),一个用IOng类型来计数(DistributedAtomic1ong)。下面使用DiStribUtedAtoIniC1Ong来实现高并发IM系统中的在线用户统计,代码如下:packagecom.crazymakercirc1e.imServer.distributed;importcom.Crazymakercirc1e.imServer.server.ServerConstants;importcom.crazymakercirc1e.imServer.zk.ZK

9、c1ient;importorg.apache,curator,framework.CuratorFramework;importorg.apache,curator,framework.recipes,atomic.AtoinicVa1ue;importorg.apache,curator,framework.recipes,atomic.DistributedAtomic1ong;importorg.apache,curator,retry.RetryNTimes:*分布式计数器*createby尼恩0疯狂创客圈*/pub1icc1assOn1ineCounterprivatestatic

10、fina1intQTY=5;privatestaticfina1StringPATH=ServerConstants.COUNTERPATH;Zk客户端privateCuratorFrameworkc1ient=nu11;唯一实例模式privatestaticOn1inecountersing1eInstance=nu11:DistributedAtomic1ongon1ines=nu11:pub1icstaticOn1IneCountergetInstOif(nu11=sing1einstance)Sing1eInstance=newOn1ineCounterO;Sing1eInstance

11、.c1ient=ZKc1ient.instance.getC1ient();Sing1eInstance.init();returnSing1eInstance;privatevoidinit()分布式计数器,失败时重试10,每次间隔30亳秒on1ines=newDiStributedAtomic1ong(c1ient,PATH,newRetryNTimesdO,30);privateOn1ineCounterO*增加计数*/pub1iebooIeanincrement()boo1eanresu1t=fa1se;AtomicVa1ueva1=nu11;try(va1=on1ines,incre

12、ment():resu1t=va1.succeeded();System,out.printIn(*o1dent:+va1.preVa1ueO+“newent:+va1.postVa1ueO+“resu1t:*+va1.succeededO);catch(Exceptione)e.PrintStackTraceO;)returnresu1t;/*减少计数*/pub1icboo1eandecrement()boo1eanresu1t=fa1se:AtomicVa1ueva1=nu11;tryva1=on1ines.decrementO;resu1t=va1.succeeded():System,

13、out.print1n(*o1dent:*+va1.preVa1ue()+“newent:+va1.postVa1ueO+“resu1t:*+va1.succeededO);catch(Exceptione)e.PrintStackTraceO;returnresu1t;12.6.2用户上线和下线的统计当用户上线的时候,调用increase方法分布式地增加一次计数:/* 增加本地session* /pub1icvoidaddSession(Stringsession1d,Session1oca1s)Ioca1Map.put(session1d,s);Stringuid=s.getUserO.g

14、et1idO;增加用户数On1ineCounter.get1nst().incrementO;/.当用户下线的时候,调用decrease方法分布式地减少一次计数:/* 删除本地SeSSiOn* /pub1icvoidremove1oca1Session(Stringsession1d)if(!Ioca1Map.ContainsKey(session1d)return;)Ioca1Map.remove(session1d);减少用户数On1ineCounter.get1nst().decrement();/.12.7本章小结本章介绍了支撑亿级流量的高并发IM架构以及高并发架构下的技术选型。然后,集中介绍了Netty集群所涉及的分布式TM的命名服务、WOrker集群的负载均衡、即时通信消息的路由和转发、分布式的在线用户统计等技术实现。本章的实例代码来自于“疯狂创客圈”社群的高并发学习项目“CrazyIM”,由于项目在不断地迭代,因此在大家读到本章时,书中代码可能已经过时,请参考社群最新版本的“CrazyIM”代码。不过,无论细节如何迭代,设计思路基本都是一致的。本章的目的仅仅是抛砖引玉。寥寥数千字,无法彻底地将一个支持亿级流量的TM项目的架构及其实现剖析得非常清楚,后续“疯狂创客圈”会结合本书将内容更加全面地呈现给大家。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服