• 远程调用(REST和RPC)


    一. 微服务的框架

    1. 1 种类

    1. SpringCloud:受编程语言限制JAVA;功能丰富,生态好。
    2. Dobbo:服务治理能力强,但是受编程语言限制JAVA;TCP长连接,序列化Hessian2;
    3. CSE:打包微服务注册,发现,通信和治理等基础功能,支持REST和RPC协议。多语言
    4. gRPC:跨语言、跨平台,但服务治理能力弱;使用HTTP2+protobuffer序列化
    5. 提问:为什么要CSE:
      1)开源开放:支持接入原生SpringCloud,ServiceComb,Dubbo应用;
      2)拥抱云原生:华为核心业务云转型基础基座
      3)安全可靠:提供微服务基于角色的安全接入,多AZ容灾等能力
      4)场景化管理:基于业务场景的可视化微服务应用管理及治理。

    1. 2 比较

    1.2.1 SpringCloud(品牌机)与Dobbo(组装机)

    一. 远程调用方式

    网络中进程通信:socket编程
    本地进程的通信:共享内存,有名管道,匿名管道;

    1. 基于HTTP协议的Restful风格 API接口调用(HTTP+RESTful+JSON)

    1.1 什么是REST

    REST基本上是一种软件体系结构,具有一些的特征,不是标准,不一定要遵守,它是一种针对网络应用的设计开发方式,可以降低开发的复杂性提高系统的可伸缩性
    1)它应该是无状态的
    2)它应该仅使用URI访问服务器上的所有资源
    3)它没有内置的加密
    4)它仅使用一种协议即HTTP
    5)对于执行CRUD操作,就应该使用HTTP动词如get,post,put和delete
    6)它只能以JSON或XML,atom,OData等形式(轻量级数据)返回结果。

    1.2 什么是RESTful风格

    1. 基于REST构建的API就是Restful风格,需要遵守所有的特征
    2. spring cloud :基于springboot,而springboot是基于HTTP协议REST风格的RPC。
    3. REST是指一组特定体系结构样式的属性。
    4. HTTP是定义良好的协议,它恰好表现出了RESTful系统的许多功能。

    1.3 使用

    1. 使用对象:Http请求 RestfulApi请求工具类 RestfulHttpClient
    2. 原因:http请求都是使用 restful 风格,系统之间的交流也是使用 restful 风格的http请求,所以就写了一个工具类来简化这些工作。
    3. 这个工具类是基于 HttpURLConnection (还有HttpClient实现和Spring的RestTemplate实现)
    4. 使用代码:get请求;put请求和异步请求
    try {
        //发送GET请求获取用户信息,默认GET请求
        RestfulHttpClient.HttpResponse response = RestfulHttpClient
                .getClient("http://localhost/user/{id}")
                .addPathParam("id", "100")
                .request();
        if(response.getCode() == 200){
            User user = response.getContent(User.class);
        }
    } catch (IOException e) { }
    
    try {
        //发送PUT请求更新用户信息
        RestfulHttpClient.HttpResponse response = RestfulHttpClient
                .getClient("http://localhost/user/{id}")
                .put()
                .addPathParam("id", "100")
                .body(user)
                .request();
        if(response.getCode() == 200){
            String result = response.getContent();
        }
    } catch (IOException e) { }
    
    
    try {
    	/*-- 2019-4-16 新增:发送异步请求 --*/
        //发送异步请求
         Future<HttpResponse> future = getClient("https://www.baidu.com")
                 .asyncRequest();
         System.out.println("do something else");
         RestfulHttpClient.HttpResponse response = future.get();
        if(response.getCode() == 200){
            String result = response.getContent();
        }
    } catch (IOException | InterruptedException | ExecutionException e) { }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    2. RPC调用(远程过程调用)

    Http协议和TCP协议的区别:

    1. Http协议是应用层协议,定义了传输数据内容的规范,通用性更强,具有RESTFul风格
    2. TCP是传输层的协议和连接方式的规范,作为底层协议更加高效
    3. 选用:对外使用通用性更高的HTTP协议;对微服务之间和系统内部之间使用RPC的tcp协议。

    URL与URI的区别

    1. URL:统一资源定位符;是一个链接,可以点击,算是绝对地址
    2. URI:统一资源标识符,算是相对地址;URL一定是URI;相对于浏览器,URL=URI。

    2.1 定义RPC架构

    1. 客户端(Client):服务调用方
    2. 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方
    3. 服务端存根(Server Stub):接受客户端发送过来的消息并解包,再调用本地服务
    4. 服务端(Server):真正的服务提供者。

    2.2 具体的步骤

    1. 服务调用方(client)(客户端)以本地调用方式调用服务;
    2. client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;在我们的Java说白了就是一个序列化的过程。
    3. client stub找到服务地址,并将消息通过网络发送到服务端;
    4. server stub收到消息后进行解码,在Java里就是常说的反序列化的过程;
    5. server stub根据解码结果调用本地的服务
    6. 本地服务执行处理逻辑
    7. 本地服务将结果返回给server stub;
    8. server stub将返回结果打包成消息,Java里的序列化
    9. server stub将打包后的消息通过网络并发送至消费方
    10. client stub接收到消息,并进行解码, Java里的反序列化
    11. 服务调用方(client)得到最终结果。

    第二部和第十步隐藏起来,值要第一步和第十一步

    2.3 框架:DobboTCP长连接,序列化Hessian2

    1. 定义:高性能、轻量级的开源Java RPC框架。
    2. 心功能:面向接口的远程方法调用智能容错和负载均衡,以及服务自动注册和发现
    3. 调用原理

    1) Provider 暴露服务的服务提供方
    2) Consumer 调用远程服务的服务消费方
    3) Registry 服务注册与发现的注册中心(提供服务发现和注册功能)
    4) Monitor 统计服务的调用次数和调用时间的监控中心(提供智能容错和负载均衡功能)
    5) Container 服务运行容器

    2.3 框架:gRPC(HTTP2+protobuffer序列化)

    面向移动应用开发且基于HTTP/2协议标准。

    2.3 gRPC与Dobbo的对比

    1. 通讯协议:gRPC基于Http2.0,Dubbo基于定义TCP
    2. 序列化:gRPC使用protocol buffer,Dubbo使用hession2等基于java对象的序列化技术(它的序列化方式可以自己扩展,太多了我不列举)
    3. 服务注册与发现:gRPC是应用级别的服务注册,而Dubbo2.0及之前的版本都是基于更细力度的服务来进行注册,3.0之后转向应用级别的服务注册。
    4. 编程语言:gRPC可以使用任何语言(Http和Protocol buffer天然就是跨语言的),Dubbo只能使用在构建在JVM之上的语言。
    5. 服务治理:gRPC自身的治理能力很弱,只能基于Http连接维度进行容错,Dubbo可以基于服务维度进行治理两者各有优缺点。
    6. gRPC的优势在于跨语言、跨平台,但服务治理能力弱。Dubbo服务治理能力强,但是受编程语言限制无法跨编程语言使用

    二. 安全验证

    用户在登录账号和密码之后,为了避免在短时间内关闭网站,又需要重新登录,可以存储用户信息凭证,进行身份验证,有两种方式:Session和token。(因为HTTP是无状态的,不记录历史数据)

    1. Session
      1)定义:当用户成功登录后,在服务端会生成保存一个Session值,并且会把seesion的ID传递给客户端Coolie。之后每一次访问,客户端带上Cookie中的seesionID,服务端对seesionID进行验证,找到是否也会对应Session,并且在有效期内,如果在就不需要登录直接访问,不在的话就需要重新的登录账号和密码了。
      2)缺点:
      (1)由于Session是存储在服务端的,故不支持分布式部署,换一个服务器可能就找不到对应的Session了。
    2. Token
      1)定义:Token是令牌的意思。一般用户通过用户名密码登录后,服务端会将登录凭证做数字签名,加密之后的字符串作为Token,并在客户端后面的向服务端的请求中携带作为凭证
      2)token的存储位置:token只是会存储在客户端,不会存储在服务器端,故非常适合分布式部署。
      3)Token在客户端的存放位置
      (1) cookie:关闭浏览器不会被清除,但是需要防范CSRF攻击。
      (2)localStorage:关闭浏览器不会被清除。需要防范XSS攻击。
      (3)sessionStorage:关闭浏览器sessionStroage会被清除。需要防范XSS攻击。

    三. 跨站攻击

    1. CSRF攻击
      攻击者盗用了你的身份,以你的名义发送恶意请求。(先访问正常网站生成cookie,然后访问恶意网站,被获取cookie,攻击者利用cookie中的信息能够访问一些网站,代替我们操作。)
    1. XSS攻击
      XSS攻击全称跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。(反射型XSS大多数是用来盗取用户的Cookie信息。)
    1. 两者的重大区别:
      xss:跨站脚本攻击、诱骗用户点击恶意链接盗取用户cookie进行攻击、不需要用户进行登录、xss除了利用cookie还可以篡改网页等
      csrf:跨站请求伪造、无法获取用户的cookie而是直接冒充用户、需要用户登录后进行操作
      两者相同的解决方法:使用Token进行身份验证。

    参考文献:

    1. xss和csrf的区别
    2. https://blog.csdn.net/zmh458/article/details/80721263
    3. Http请求 RestfulApi请求工具类 RestfulHttpClient
    4. 开发远程调用接口_JAVA远程服务调用篇RESTFUL接口调用篇
      uri和url的区别与联系(一看就理解)
      我怎么理解RPC和Http以及REST风格
      https://cloud.tencent.com/developer/article/1767804
      Dubbo 一篇文章就够了:从入门到实战
      什么是 gRPC ?
      gRPC 和 dubbo 服务通信有什么区别?
  • 相关阅读:
    ubuntu中安装cheat
    基于MATLAB仿真设计无线充电系统
    元素绑定
    六、Git远程仓库操作——创建远程库、推送拉取和克隆远程库等操作
    Android DatePicker(日期选择器)、TimePicker(时间选择器)、CalendarView(日历视图)- 简单应用
    硬件基础之HEX文件格式
    【四】3D Object Model之创建Creation——read_object_model_3d()算子
    磁盘的挂载
    MAML++:HOW TO TRAIN YOUR MAML论文精读
    HC32L110 系列 M0 MCU 介绍和Win10下DAP-Link, ST-Link, J-Link方式的烧录
  • 原文地址:https://blog.csdn.net/qq_42974034/article/details/126740956