RPC,Restful概念理解suntao1@tydic.com微信:sunsansou介绍RPCHession序列化SOAJMSRMIRestfulWebSerivces技术快速发展:单一应用-》大型传统行业异构整合-》互联网发展》》》在过程中不断的涌现新的架构思考与技术这么多设计思想与技术,每个的含义,它们之间的关系,作用范围….阵营传统互联网关注:整合、异构、数据一致谈传统不得不谈SOA前几年很火的概念》》WebService》》ESB》》面向服务》》…不太关注:效率、快速关注:高效、简单效率、高扩展》》分布式》》网络通信》》云》》….不太关注:不符合第一条,参见第一条传统越来越Over了,都在向互联网转型,业务转型的同时,技术也在转型路径传统架构涉及的内容不是我们此次主题,重点看下当下互联网,并聚焦在系统间调用这主题上;互联网系统更多,同样需要通信,但与传统架构不同,最大的不同点是现今采用的是“分布式架构”,分布式另做主题,先简单理解一下什么是分布式:1+2+3+4…,传统:一台机器做,买大机器,好机器,一直算下去互联网:搞N台PC,1台算1+2,2台算3+4,1台+2台+3台….服务内部服务外部首要:内部间,高效,快速通信首要:简单、易用RPCRestfulRPC(1)RemoteMethodInvocation,远端过程调用,不陌生吧,Dubbo底层就用RPC通俗上讲,RPC是一个框架;远程调用的框架,不废话,用一段代码理解:publicclassRpcFramework{publicstaticvoidexport(finalObjectservice,intport)throwsException{ServerSocketserver=newServerSocket(port);for(;;){finalSocketsocket=server.accept();newThread(newRunnable(){publicvoidrun(){ObjectInputStreaminput=newObjectInputStream(socket.getInputStream());StringmethodName=input.readUTF();Class?[]parameterTypes=(Class?[])input.readObject();Object[]arguments=(Object[])input.readObject();ObjectOutputStreamoutput=newObjectOutputStream(socket.getOutputStream());Methodmethod=service.getClass().getMethod(methodName,parameterTypes);Objectresult=method.invoke(service,arguments);output.writeObject(result);}》》》》将服务暴露RpcConsumerRpcProviderTreFerHelloServiceHelloServiceImplExportA机器B机器RPC(2)publicstaticTTrefer(finalClassTinterfaceClass,finalStringhost,finalintport)throwsException{return(T)Proxy.newProxyInstance(interfaceClass.getClassLoader(),newClass?[]{interfaceClass},newInvocationHandler(){publicObjectinvoke(Objectproxy,Methodmethod,Object[]arguments)throwsThrowable{Socketsocket=newSocket(host,port);ObjectOutputStreamoutput=newObjectOutputStream(socket.getOutputStream());output.writeUTF(method.getName());output.writeObject(method.getParameterTypes());output.writeObject(arguments);ObjectInputStreaminput=newObjectInputStream(socket.getInputStream());Objectresult=input.readObject();}》》》publicinterfaceHelloService{Stringhello(Stringname);}publicclassHelloServiceImplimplementsHelloService{publicStringhello(Stringname){returnHello+name;}}将服务引用服务接口服务实现RPC(3)publicclassRpcProvider{publicstaticvoidmain(String[]args)throwsException{HelloServiceservice=newHelloServiceImpl();RpcFramework.export(service,1234);}}publicclassRpcConsumer{publicstaticvoidmain(String[]args)throwsException{HelloServiceservice=RpcFramework.refer(HelloService.class,127.0.0.1,1234);for(inti=0;iInteger.MAX_VALUE;i++){Stringhello=service.hello(World+i);System.out.println(hello);Thread.sleep(1000);}}}服务提供者服务请求者RPC(4)RPCHessionThriftRMIWebServicesHessian是一个轻量级的remotingonhttp工具,使用简单的方法提供了RMI的功能。相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。thrift最初由facebook开发用做系统内各语言之间的RPC通信。RMI是Java的一组拥护开发分布式应用程序的API哈哈,其实它也算,底层HTTP上加个SOAP信封RPC-HessionpublicinterfaceIGreetingService{publicStringgreeting(Stringname)throwsIOException;}publicclassGreetingServiceimplementsIGreetingService{@OverridepublicStringgreeting(Stringname)throwsIOException{returnWelcomeottheHassianworld,+name;}}servletservlet-namehessian/servlet-nameservlet-classcom.caucho.hessian.server.HessianServlet/servlet-classinit-paramparam-namehome-api/param-name!--接口声明--param-valuecom.tom.hessian.common.IGreetingService/param-value/init-paraminit-paramparam-namehome-class/param-name!--接口实现--param-valuecom.tom.hessian.server.GreetingService/param-value/init-paramload-on-startup1/load-on-startup/servletservlet-mappingservlet-namehessian/servlet-nameurl-pattern/hessian/url-pattern/servlet-mappingpublicclassGreetingServiceTest{publicstaticvoidmain(String[]args)throwsException{//RPC访问地址Stringurl=接口的动态代理工厂HessianProxyFactoryfactory=newHessianProxyFactory();IGreetingServicegreetingService=(IGreetingService)factory.create(IGreetingService.class,url);//远程方法调用System.out.println(hello(),+greetingService.greeting(tom));}}Restful(1)什么是Restful?不是具体技术,是架构、是思想、是框架百度知道上的话就不说了,听不懂吧,哈哈哈。。。。其实只要符合以下条件就是RestfultC/S结构(这是Internet服务的一个基本特征)无状态(很熟悉吧,呵呵)可以cache(想起了浏览器?)分层系统(想起了无数的架构?)统一的接口(如果这是可能的,程序员有福了,:D)codeondemand(可选,其实是一种扩展性的要求)你想到什么?HTTP协议吗?Yougotit!!!,以HTTP为例,名词即为URI(统一资源标识),动词包括POST,GET,PUT,DELETE等(还有其它不常用的2个,所以整个动词集合是有限的),资源的形态Restful(2)那接口如何设计就是Restful?看twitter开放平台,这个最restful了,不想看国外,看国内,国内最restful的是人人网的开放平台;相看看多么暴力吗?看下边:醉了吗?…………….总结尝试用最简单的话总结一下:SOARPCREST面向服务WSDL越来越没人愿意用了,性能啊面向方法适用于两边都是Java的系统,那可是可能把对象引用都一块序列化了的,另外现在高速序列化的框架不少,有兴趣可以去看看;比如Hession比RMI强在哪?强多少?面向资源一个地址URL,面向资源,有限的动作,还有就是土,越土越实在!