一. 微服务的框架
1. 1 种类
- SpringCloud:受编程语言限制JAVA;功能丰富,生态好。
- Dobbo:服务治理能力强,但是受编程语言限制JAVA;TCP长连接,序列化Hessian2;
- CSE:打包微服务注册,发现,通信和治理等基础功能,支持REST和RPC协议。多语言
- gRPC:跨语言、跨平台,但服务治理能力弱;使用HTTP2+protobuffer序列化
- 提问:为什么要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风格
- 基于REST构建的API就是Restful风格,需要遵守所有的特征
- spring cloud :基于springboot,而springboot是基于HTTP协议REST风格的RPC。
- REST是指一组特定体系结构样式的属性。
- HTTP是定义良好的协议,它恰好表现出了RESTful系统的许多功能。
1.3 使用
- 使用对象:Http请求 RestfulApi请求工具类 RestfulHttpClient
- 原因:http请求都是使用 restful 风格,系统之间的交流也是使用 restful 风格的http请求,所以就写了一个工具类来简化这些工作。
- 这个工具类是基于 HttpURLConnection (还有HttpClient实现和Spring的RestTemplate实现)
- 使用代码:get请求;put请求和异步请求
try {
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 {
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 {
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协议的区别:
- Http协议是应用层协议,定义了传输数据内容的规范,通用性更强,具有RESTFul风格
- TCP是传输层的协议和连接方式的规范,作为底层协议更加高效
- 选用:对外使用通用性更高的HTTP协议;对微服务之间和系统内部之间使用RPC的tcp协议。
URL与URI的区别
- URL:统一资源定位符;是一个链接,可以点击,算是绝对地址
- URI:统一资源标识符,算是相对地址;URL一定是URI;相对于浏览器,URL=URI。
2.1 定义RPC架构
- 客户端(Client):服务调用方
- 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数打包成网络消息,再通过网络发送给服务方
- 服务端存根(Server Stub):接受客户端发送过来的消息并解包,再调用本地服务
- 服务端(Server):真正的服务提供者。
2.2 具体的步骤
- 服务调用方(client)(客户端)以本地调用方式调用服务;
- client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;在我们的Java说白了就是一个序列化的过程。
- client stub找到服务地址,并将消息通过网络发送到服务端;
- server stub收到消息后进行解码,在Java里就是常说的反序列化的过程;
- server stub根据解码结果调用本地的服务;
- 本地服务执行处理逻辑;
- 本地服务将结果返回给server stub;
- server stub将返回结果打包成消息,Java里的序列化;
- server stub将打包后的消息通过网络并发送至消费方
- client stub接收到消息,并进行解码, Java里的反序列化;
- 服务调用方(client)得到最终结果。
第二部和第十步隐藏起来,值要第一步和第十一步
2.3 框架:DobboTCP长连接,序列化Hessian2
- 定义:高性能、轻量级的开源Java RPC框架。
- 核心功能:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
- 调用原理
1) Provider 暴露服务的服务提供方 2) Consumer 调用远程服务的服务消费方 3) Registry 服务注册与发现的注册中心(提供服务发现和注册功能) 4) Monitor 统计服务的调用次数和调用时间的监控中心(提供智能容错和负载均衡功能) 5) Container 服务运行容器
2.3 框架:gRPC(HTTP2+protobuffer序列化)
面向移动应用开发且基于HTTP/2协议标准。
2.3 gRPC与Dobbo的对比
- 通讯协议:gRPC基于Http2.0,Dubbo基于定义TCP
- 序列化:gRPC使用protocol buffer,Dubbo使用hession2等基于java对象的序列化技术(它的序列化方式可以自己扩展,太多了我不列举)
- 服务注册与发现:gRPC是应用级别的服务注册,而Dubbo2.0及之前的版本都是基于更细力度的服务来进行注册,3.0之后转向应用级别的服务注册。
- 编程语言:gRPC可以使用任何语言(Http和Protocol buffer天然就是跨语言的),Dubbo只能使用在构建在JVM之上的语言。
- 服务治理:gRPC自身的治理能力很弱,只能基于Http连接维度进行容错,Dubbo可以基于服务维度进行治理两者各有优缺点。
- gRPC的优势在于跨语言、跨平台,但服务治理能力弱。Dubbo服务治理能力强,但是受编程语言限制无法跨编程语言使用
二. 安全验证
用户在登录账号和密码之后,为了避免在短时间内关闭网站,又需要重新登录,可以存储用户信息凭证,进行身份验证,有两种方式:Session和token。(因为HTTP是无状态的,不记录历史数据)
- Session
1)定义:当用户成功登录后,在服务端会生成保存一个Session值,并且会把seesion的ID传递给客户端Coolie。之后每一次访问,客户端带上Cookie中的seesionID,服务端对seesionID进行验证,找到是否也会对应Session,并且在有效期内,如果在就不需要登录直接访问,不在的话就需要重新的登录账号和密码了。 2)缺点: (1)由于Session是存储在服务端的,故不支持分布式部署,换一个服务器可能就找不到对应的Session了。 - Token
1)定义:Token是令牌的意思。一般用户通过用户名密码登录后,服务端会将登录凭证做数字签名,加密之后的字符串作为Token,并在客户端后面的向服务端的请求中携带,作为凭证。 2)token的存储位置:token只是会存储在客户端,不会存储在服务器端,故非常适合分布式部署。 3)Token在客户端的存放位置 (1) cookie:关闭浏览器不会被清除,但是需要防范CSRF攻击。 (2)localStorage:关闭浏览器不会被清除。需要防范XSS攻击。 (3)sessionStorage:关闭浏览器sessionStroage会被清除。需要防范XSS攻击。
三. 跨站攻击
-
CSRF攻击: 攻击者盗用了你的身份,以你的名义发送恶意请求。(先访问正常网站生成cookie,然后访问恶意网站,被获取cookie,攻击者利用cookie中的信息能够访问一些网站,代替我们操作。) -
XSS攻击: XSS攻击全称跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。(反射型XSS大多数是用来盗取用户的Cookie信息。) -
两者的重大区别: xss:跨站脚本攻击、诱骗用户点击恶意链接盗取用户cookie进行攻击、不需要用户进行登录、xss除了利用cookie还可以篡改网页等 csrf:跨站请求伪造、无法获取用户的cookie而是直接冒充用户、需要用户登录后进行操作 两者相同的解决方法:使用Token进行身份验证。
参考文献:
- xss和csrf的区别
- https://blog.csdn.net/zmh458/article/details/80721263
- Http请求 RestfulApi请求工具类 RestfulHttpClient
- 开发远程调用接口_JAVA远程服务调用篇RESTFUL接口调用篇
uri和url的区别与联系(一看就理解) 我怎么理解RPC和Http以及REST风格 https://cloud.tencent.com/developer/article/1767804 Dubbo 一篇文章就够了:从入门到实战 什么是 gRPC ? gRPC 和 dubbo 服务通信有什么区别?
|