序列化

RPC简介及框架选择

你说的曾经没有我的故事 提交于 2020-03-03 07:20:36
简单介绍RPC协议及常见框架,对比传统restful api和RPC方式的优缺点。常见RPC框架,gRPC及序列化方式Protobuf等 HTTP协议 http协议是基于tcp协议的,tcp协议是流式协议,包头部分可以通过多出的\r\n来分界,包体部分如何分界呢?这是协议本身要解决的问题。目前一般有两种方式,第一种方式就是在包头中有个content-Length字段,这个字段的值的大小标识了POST数据的长度,服务器收到一个数据包后,先从包头解析出这个字段的值,再根据这个值去读取相应长度的作为http协议的包体数据。 浏览器connect 80端口 RESTful API (http+json) 理解RESTful架构 - 阮一峰 REST 架构该怎么生动地理解? - 覃超的回答 - 知乎 网站即软件,而且是一种新型的软件,这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。   它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之一。Representational State Transfer,翻译是”表现层状态转化”,通俗来讲就是:资源在网络中以某种表现形式进行状态转移。 总结一下什么是RESTful架构:   (1)每一个URI代表一种资源;  

常见RPC开源框架

穿精又带淫゛_ 提交于 2020-03-03 05:52:13
什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这样一个函数方法: localAdd(10, 20),localAdd方法的具体实现要么是用户自己定义的,要么是php库函数中自带的,也就说在localAdd方法的代码实现在本地,它是一个本地调用! 远程调用意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个远程地方。 最早在 Nelson 的论文中指出实现 RPC 的程序包括 5 个理论模型部分: User User-stub RPCRuntime Server-stub Server 这 5 个部分的关系如下图所示: 这里 User 就是 Client 端。当 User 想发起一个远程调用时,它实际是通过本地调用 User-stub。 User-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。 远端 RPCRuntime 实例收到请求后交给 Server-stub 进行解码后发起向本地端 Server 的调用,调用结果再返回给 User 端。 远程调用原理 比如 A (client) 调用 B (server) 提供的remoteAdd方法:

第十六天

杀马特。学长 韩版系。学妹 提交于 2020-03-03 01:00:10
time模块 import time 1.获取时间戳 time.time() 1970.1.1 00.00.00 到现在经过的秒数 2.获取格式化的时间对象 9个字段组成 time.gmtime() #GMT 格林尼治时间 time.struct_time(tm_year=2020, tm_mon=3, tm_mday=2, tm_hour=13, tm_min=42, tm_sec=15, tm_wday=0, tm_yday=62, tm_isdst=0) time.localtime() 当地时间 time.gmtime(1) 过一秒后的时间 3.格式化时间对象和字符串之间的互化 time.strftime() import time # print(time.gmtime()) print(time.strftime("year:%Y %m %d %H:%M:%S")) year:2020 03 02 22:04:33 print(time.strftime("year:%Y")) year:2020 4.把字符串转化为 时间对象 time_obj=time.srtptime("2010 10",'%Y %m') 把一个字符串解析成时间的格式 time_obj=time.strptime("2010 10",'%Y %m') print(time_obj) # 指定的

SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存

此生再无相见时 提交于 2020-03-02 10:59:09
系统环境: Redis 版本:5.0.7 SpringBoot 版本:2.2.2.RELEASE 参考地址: Redus 官方网址:https://redis.io/ 博文示例项目 Github 地址:https://github.com/my-dlq/blog-example/tree/master/springboot/springboot-redis-cache-example 一、缓存概念知识 1、是什么缓存 我们日常生活中,经常会接触听到缓存这个词,例如,浏览器清空缓存,处理器缓存大小,磁盘缓存等等。经过分类,可以将缓存分为: 硬件缓存: 一般指的是机器上的 CPU、硬盘等等组件的缓存区间,一般是利用的内存作为一块中转区域,都通过内存交互信息,减少系统负载,提供传输效率。 客户端缓存: 一般指的是某些应用,例如浏览器、手机App、视频缓冲等等,都是在加载一次数据后将数据临时存储到本地,当再次访问时候先检查本地缓存中是否存在,存在就不必去远程重新拉取,而是直接读取缓存数据,这样来减少远端服务器压力和加快载入速度。 服务端缓存: 一般指远端服务器上,考虑到客户端请求量多,某些数据请求量大,这些热点数据经常要到数据库中读取数据,给数据库造成压力,还有就是 IO、网络等原因有一定延迟,响应客户端较慢。所以,在一些不考虑实时性的数据中,经常将这些数据存在内存中(内存速度非常快)

字符输出流,缓冲流和序列化

亡梦爱人 提交于 2020-03-02 08:01:51
字符输出流 字符流的应用限制比较多,没有字节流的应用广。 主要有以下几点: 字符流不使用close方法的话,文件则不会输出任何内容。 字符流主要是用于处理中文,很方便快捷,但是其他的就不行了,例如音频、图片、视频等。但是,字符流拷贝文本文件时非常的快! 缓冲流 缓冲流主要是为了提高整体的读取、写入效率,降低了CPU通过内存访问硬盘的次数。提高效率,降低磁盘损耗。 字节输入缓冲 BufferedInputStream 字节输出缓冲 BufferedOutputStream 字符输入缓冲 BufferedReader 字符输出缓冲 BufferedWrite 【重点】 所有的缓冲流都没有任何的读取,写入文件能力,这里都需要对应的输入流和输出流来提供对应的能力。 在创建缓冲流流对象时,需要传入对应的输入流对象和输出流对象。 底层就是提供了一个默认大小的缓冲数组,用于提高效率 其中,字节缓冲流的底层中有一个默认容量为8KB的byte类型缓冲数组。字符缓冲流的底层中有一个默认容量为16KB的byte类型缓冲数组。而(字符、字节)输入缓冲流中fill方法是一个操作核心 从硬盘中读取数据,读取的数据容量和缓冲数组容量一致。 所有的read方法,都是从缓冲数组中读取数据 每一次读取数据之前,都会检查缓冲区内是否有数据,如果没有,fill方法执行,填充数据。利用缓冲,fill方法

[原题复现+审计][0CTF 2016] WEB piapiapia(反序列化、数组绕过)[改变序列化长度,导致反序列化漏洞]

别来无恙 提交于 2020-03-02 07:34:11
简介 原题复现: 考察知识点: 反序列化、数组绕过 线上平台: https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 漏洞学习 数组绕过 1.1 url传递数组 当我们要向服务器传递数组时,我们可以通过 http://127.0.0.1/index.php?a[]=hello&a[]=world 来传递,这样,在后端, $a = $_GET['a']; 就可以接收到 $a[0]=“hello”, $a[1]=“world”。 md5(Array()) = null sha1(Array()) = null ereg(pattern,Array()) = null preg_match(pattern,Array()) = false strcmp(Array(), "abc") = null strpos(Array(),"abc") = null strlen(Array()) = null https://www.jianshu.com/p/8e3b9d056da6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation 一个简单的例子 从这个例子我们可以看出序列化后的字符串以"作为分隔符

qhfl-3 Course模块

不想你离开。 提交于 2020-03-02 05:01:55
课程模块,包括免费课程以及专题课程两个,主要是课程的展示,点击课程进入课程详细页面 根据功能设计表结构 为了方便,每张表在数据库中添加了中文名 from django.db import models from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.models import ContentType # from shopping.models import OrderDetail,Coupon # 注册admin 的时候 方便引入 __all__ = ["Category", "Course", "CourseDetail", "Teacher", "DegreeCourse", "CourseChapter", "CourseSection", "PricePolicy", "OftenAskedQuestion", "Comment", "Account", "CourseOutline"] class Category(models.Model): """课程分类表""" title = models.CharField(max_length=32, unique=True, verbose

Java中创建对象的几种方式

北城余情 提交于 2020-03-02 03:40:18
Java中创建对象的五种方式:   作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字、使用Class类的newInstance方法、使用Constructor类的newInstance方法、使用Clone方法、使用反序列化。 使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的)。比如:Student student = new Student(); 使用Class类的newInstance方法:我们也可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance(); 使用Constructor类的newInstance方法:次方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象

RPC序列化

Deadly 提交于 2020-03-02 02:20:21
序列化:将 对象 状态 转换 为可保持或传输的二进制。 反序列化:将二进制数据转换为对象的过程。 常见的序列化方式: 后续代码示例会加上。 1.JDK原生序列化: 安全性较差。 2.JSON: JSON 是典型的 Key-Value 方式,没有数据类型,是一种文本型序列化框架 JSON 进行序列化的额外空间开销比较大,对于大数据量服务这意味着需要巨大的内存和磁盘开销;JSON 没有类型,但像 Java 这种强类型语言,需要通过反射统一解决,所以性能不会太好。所以如果 RPC 框架选用 JSON 序列化,服务提供者与服务调用者之间传输的数据量要相对较小,否则将严重影响性能。 3.XML: 文本类序列化方式 序列化的额外空间开销比较大 4.Hessian: Hessian 是动态类型、二进制、紧凑的,并且可跨语言移植的一种序列化框架。Hessian 协议要比 JDK、JSON 更加紧凑,性能上要比 JDK、JSON 序列化高效很多,而且生成的字节数也更小。 相对于 JDK、JSON,由于 Hessian 更加高效,生成的字节数更小,有非常好的兼容性和稳定性,所以 Hessian 更加适合作为 RPC 框架远程通信的序列化协议。 5.Protobuf: Protobuf 是 Google 公司内部的混合语言数据标准,是一种轻便、高效的结构化数据存储格式,可以用于结构化数据序列化,支持

剑指offer:面试题37. 序列化二叉树

主宰稳场 提交于 2020-03-02 00:45:59
题目:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。 示例: 你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1,2,3,null,null,4,5]" 解题: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Codec { private: // 1,2,#,#,3,-4,#,#,5,#,#, void encode(TreeNode* root, string& res) { if (!root) { res += "#,"; return; } res += to_string(root->val) + ","; encode(root->left, res); encode(root->right, res); } TreeNode* decode(int& p, const string& data) { if (data[p] == '#') { p += 2; return NULL; } bool isN = false;