IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 远程调用(REST和RPC) -> 正文阅读

[网络协议]远程调用(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) { }

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中的信息能够访问一些网站,代替我们操作。)
    在这里插入图片描述

  2. XSS攻击
    XSS攻击全称跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。(反射型XSS大多数是用来盗取用户的Cookie信息。)
    在这里插入图片描述

  3. 两者的重大区别:
    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 服务通信有什么区别?
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:52:32  更:2022-09-13 11:53:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 4:39:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码