• RPC 浅谈


    RPC——Remote Procedure Call Protocol,这是广义上的解释,远程过程调用。但是,我接下俩要说的是应用层面的,而不是所谓协议层面的。

    上一篇文章讲到的互联网中一般都会涉及都这部分技术,那么一般学习都会基于 “Scrum 模式”(LZ 自创模式,非正式^_^)去思考——是什么?干嘛用的?有什么好处?

    LZ自认为万物围绕上面三个问题,一般就会深入展开学习,才是最有效率最能代表诉求的;好了废话不多说,正式开始。

    是什么?

    应用层开发说的RPC概念也是一种“接口”or“服务”的具体实现,也是一种SOA(面向服务架构)的实现手段。

    顾名思义,这一技术都会涉及到通讯概念中的传输层,可以理解“网络”。

    在这里我也先普及一下后面会提及到的一些基本概念知识,现有的RPC框架按底层协议区分机制一般分为两种:长连接和短连接。

    长连接:一般基于Socket,而短链接一般都是基于HTTP的,会遵循三次握手原则。

    *关于Socket,TCP/IP, HTTP 三者的概念及关系,度娘说的比LZ好。

    LZ的理解,一句话:Socket是底层通讯层的通讯端口API,TCP/IP是基于Socket那一层通讯层之上的协议,而HTTP是TCP/IP的实现。

    而我在这里说的RPC就是用具体技术代码实现的,能让对方通过传输层调用的一种服务。

    干嘛用的?

    在一般的公司,不光只有一个业务,也许会涉及到很多部门很多Team很多Project,以现有电子商务业务为例子:商品,供应链,订单,交易,财务,仓储,配送,售后,还有例

    如上一篇文章提到的很多中间件业务,这些业务下面还会有Project,每个Team负责一部分业务,这些业务逻辑实现通常对外部是透明的而业务又紧密关联的,都会相互依赖相互

    调用,这时候对方无需知道也不应该知道该业务怎么实现,只需知道我入口满足什么条件得到自己所需的信息即可,所以每个Team会发布一个服务出来提供给需求方调用。

    有什么好处?

    1.每个调用方只需要提出需求,不需要了解对方具体的业务。

    2.各自模块各自业务隔离开来,满足面向对象思维,各自封装各自的业务逻辑,不会因为不熟悉业务的人的修改而导致系统崩溃。

    3.可以实现跨语言跨平台调用,.NET可以调用JAVA服务,反之亦可。

    4.易于拓展,易于复用,当然满足了面向对象的特性肯定有具有面向对象的优势了。此处举个实例,当然的项目因为业务分布不一样,后端服务逻辑一样,有.NET平台的

    winForm端及JAVA web 的PC页面,改造的时候只需要做一套所谓的展示即可,调用的服务是一样的。

    .......(此处优势待兄弟们补充,实在是架构上的必备宝刀)

    ==================================================

    上述说了那么多,接下来就是具体的实例了。

    长连接的框架有最出名的Dubbo,MINA,Netty;Dubbo底层其实也是用后两者包装的,都是基于JAVA NIO的实现。阿里内部还有一个未开源的HSF。

    长连接框架优势:效率高,适用于内部业务系统间的调用,都经历双11这种节奏的调用,不要LZ说明了吧,脑补一下就好。

    Dubbo的资料文档太多太全了,无需LZ废话。直接度娘链接即可,LZ最近也做了源码拜读

    短链接的框架最常用的RESTFul ,Hessian,SOAP。

      RESTful WSDL Hessian
    协议 HTTP SOAP Binary
    性能
    优缺点

    优点:易扩展,数据结构多变

    缺点:安全方面,规范化不够

    优点:文档结构直观,样式统一

    缺点:数据格式大,开销大,耦合紧

    优点:简单易用,数据传输小,效率高

    缺点:安全性,异常机制不完善

    适用性

    一般的对外接口服务都能满足,不限于平台

    一般的对外接口服务都能满足,通用性高

    一般适应于系统内部间调用

    以LZ最喜欢的RESTful为实例,在java里实现RESTful有很多,Axis2,Xfire,CXF和Java6自带的WebService引擎,下面用最常见的CXF方式为实例。

    接下来就是Quick Start了。

    传送门:https://github.com/luyichenn/COD 

    这里是半成品,后续会补充集成上各种。这次着重看 cod-web  cod-ws  这两个包。

    首先,先搭建一个web项目,因为RESTful 基于HTTP 必定需要web容器,这里不做过多解释,参照git项目配置。

    然后看cod-web下resources下有ws包下面的两个配置文件,一个常规CXF配置:spring-rest-config.xml 一个是加密带token方案,参见spring-rest-token-config.xml

    具体暴露接口:  com.cod.basic.ws.rest.BasicQueryService

    这次用的是JAX-RS(JSR 311,Java API for XML-RESTful Web Services)是基于annotation的实现方式,我们通过annotation的方式把一个java class标注成RESTful

    webservice,并把它的方法标注成HTTP的CRUD。相关的annotation有@path, @Produces,@GET, @POST, @DELETE,@PUT, @PathParam等,对java开发人员在使用起来比较

    方便。

    @Path("/basic")  这个就是路径

    @Consumes({"application/json"})

    @Produces({"application/json"})

    这两个我相信一下就是解释说明数据格式的

    最终请求REST服务的路径:http://localhost:8090/service/rest/?_wadl

    参见web.xml 里的

        <servlet>
            <servlet-name>CXFServlet</servlet-name>
            <servlet-class>
                org.apache.cxf.transport.servlet.CXFServlet
            </servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>CXFServlet</servlet-name>
            <url-pattern>/service/*</url-pattern>
        </servlet-mapping>

    也就是拦截/service/* 的服务

    参见spring-rest-config.xml 里的

      <jaxrs:server address="/rest">
            <jaxrs:serviceBeans>
                <bean class="com.cod.basic.ws.rest.BasicQueryService"/>
            </jaxrs:serviceBeans>
           
            <jaxrs:providers>
                <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
            </jaxrs:providers>
    
            <jaxrs:inInterceptors>
                <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
            </jaxrs:inInterceptors>
            <jaxrs:outInterceptors>
                <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
            </jaxrs:outInterceptors>
        </jaxrs:server>

    也就是拦截<jaxrs:server address="/rest"> 的服务,最终会在浏览器里看到

    最终请求方法的URL即为:http://localhost:8090/service/rest/basic/query/findRestService?_wadl

    会看到控制台的HTTP status:200

     以上就是简单的RPC RESTful CXF实现,欢迎同学互相学习吐槽,后续会看时间继续补充系列文章。

    不能做SRE的Coding不是一个好的架构师
  • 相关阅读:
    【转贴】龙芯生态产品和解决方案巡展(第四篇)——存储
    【转贴】龙芯生态产品和解决方案巡展(第五篇)——云终端
    【转贴】龙芯生态产品和解决方案巡展(第六篇) ——操作系统
    【转贴】龙芯生态产品和解决方案巡展(一)
    【转贴】龙芯生态产品和解决方案巡展(第二篇)——笔记本电脑
    【转贴】龙芯生态产品和解决方案巡展(第三篇)——服务器
    【转贴】我们的龙芯3号---致龙芯15周年
    【转贴】GS464/GS464E
    【转贴】Windows virtio 驱动
    【转贴】Windows常用命令实例
  • 原文地址:https://www.cnblogs.com/Vincentlu/p/4185299.html
Copyright © 2020-2023  润新知