RPC技术选型

news2025/2/27 14:02:58

前言

HTTP1.0 & HTTP1.1 & HTTP2.0 & RPC

  • HTTP1.0

  • 无法复用连接

HTTP1.0 协议时,HTTP 调用还只能是短链接调用,每次发送请求的时候,都需要进行一次TCP的连接,而TCP的连接释放过程又是比较费事的。这种无连接的特性会使得网络的利用率非常低。

  • 队头阻塞(Head-Of-Line Blocking)

下个请求必须在前一个请求返回后才能发出,request-response按序发生。显然,如果某个请求长时间没有返回,那么接下来的请求就全部阻塞了。

  • HTTP1.1

  • 优点

  • 长连接

HTTP/1.1增加了一个Connection字段,通过设置Keep-Alive可以保持HTTP连接不断开,避免了每次客户端与服务器请求都要重复建立释放建立TCP连接,提高了网络的利用率。

  • 管线化(pipeline)

HTTP 管线化是将多个 HTTP 请求整批提交的技术,而在传送过程中不需先等待服务端的回应。但 pipeling 要求返回是按序的,那么前一个请求如果很耗时(比如处理大图片),那么后面的请求即使服务器已经处理完,仍会等待前面的请求处理完才开始按序返回,所以还是有队头阻塞的问题。

  • 缓存控制

  • chunked 编码传输

  • 缺点

  • 队头阻塞

虽然HTTP1.1 引入了pipeling,但 pipeling 要求返回是按序的,那么前一个请求如果很耗时(比如处理大图片),那么后面的请求即使服务器已经处理完,仍会等待前面的请求处理完才开始按序返回。

  • 协议开销大

header里携带的内容过大,在一定程度上增加了传输的成本

:authority: render.alipay.com
:method: GET
:path: /p/alertserver/589c123e2b89c03d127000da_config/index.json
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
if-none-match: W/"12d8-AlMoGNV3gJOfKIoHdgvIIv9I95M"
origin: https://tngdigital.yuque.com
referer: https://tngdigital.yuque.com/
sec-ch-ua: "Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: cross-site
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36
  • 传输内容是明文,不够安全

  • keep-alive 给服务端带来性能压力

  • HTTP2.0

  • header压缩

HTTP1.1的头部是冗余的,HTTP2.0协议会采用合适的压缩算法压缩HTTP请求和响应的首部。这样,通信产生的数据包数量和发送的字节数就更少了。在应用层与传输层之间添加一层二进制分帧层。HTTP2.0是二进制协议,他采用二进制格式传输数据而不是1.x的文本格式。文本格式可读性好,但是对计算机解析不友好。

HTTP1.x中采用文本格式传输,每个传输会增加500~800字节的开销。每次请求都要带上向cookie、user-agent这样相同的首部。HTTP采用HPACK压缩双来压缩头部。在浏览器与服务器之间:

  1. 维护一份相同的静态字典,包含常见的头部名称,以及常见的头部值

  1. 维护一份相同的动态字典,可以动态的添加内容

  1. 通过静态Huffman编码对传输的首部字段进行编码

所以我们在传输首部字段的时候,例如要传输method:GET,我们只要传输静态字典里面的method:GET对应的索引值就可以,一个字节就搞定了。假如像user-agent、cookie这种静态字典里面只有首部名称而没有值的首部,第一次传输需要在静态字典中加入值,值会采用静态Huffman编码来减小体积。第一次传输过user-agent之后,浏览器和服务器就会把它添加到自己的动态字典 中,后续的传输就可以只传输一个索引就行了。

  • 多路复用(multiplexing)

HTTP2.0建立一个TCP连接,一个连接上面可以有任意多个流,消息分割成一个或多个帧在流里面传输。帧传输过去之后,在进行重组,形成一个完整的请求和响应。Steam是乱序的,但同一个Sream里面的帧是按序传输的,二进制帧到达后,对方将Sream ID相同的二进制帧组装成完整的请求报文 和响应报文,通过单一的TCP连接,可以无限制处理多个HTTP请求

  • 请求优先级(request priorityzation)

HTTP2.0不仅可以无限制的并发处理请求,还可以给请求逐个分配优先级顺序。这样重要的请求就会优先响应。

  • RPC

Remote Procedure Call,远程过程调用,RPC只是一种调用方式

  • 通信协议

可以基于TCP,也可以基于HTTP,所以通信协议上和HTTP 没有什么区别,甚至HTTP也可以看做是一种RPC,比如基于HTTP2.0的gRPC

  • 序列化协议

  • HTTP1.1

基于文本编码的xml、json序列化协议

  • HTTP2.0

基于二进制编码的protobuf

  • RPC

基于二进制编码的自定义协议:protobuf、hessian、dubbo等

HTTP1.1

HTTP2.0

RPC

OSI模型

应用层协议(7层)

传输层协议(4层)

传输内容

效率

连接方式

长连接

长连接

序列化协议

JSON/XML

Protocol Buffers

Protocol Buffers,hessian、kyro

序列化方式

文本类

二进制

二进制

小结

序列化协议我们不选择JSON/XML,而是选择标准的Protobuf,或者自定义的协议。

https://auth0.com/blog/beating-json-performance-with-protobuf/

常用的RPC框架

  • SpringCloudOpenFeign

  • Dubbo

  • gRpc

  • Thrift

SpringCloudOpenFeign

基于HTTP1.1的,简单易用,但是性能不够高,我们不考虑。

Dubbo

介绍

Dubbo是一个高性能、轻量级RPC框架,官网现在已定义为微服务框架,目的就是让消费方、生产方通过服务注册、服务发现、服务调用实现动态通信。

官方介绍除了服务注册、调用,还提供可视化监听运维、服务容错、服务降级等其它扩展功能

默认就是走dubbo协议的,单一长连接,NIO异步通信,基于hessian作为序列化协议。

适用的场景:传输数据量很小(每次请求在100kb以内),但是并发量很高的长连接。

调用流程

负载均衡

  • RandomLoadBalance 随机调用负载均衡

  • RoundRobinLoadBlance 轮询调用

  • LeastActiveLoadBlance 最少活跃数调用法

  • ConsistentHashLoadBalance 一致性Hash算法

容错机制

  • Failover

失败自动切换,当出现失败,重试其它服务器。(缺省) 通常用于读操作,但重试会带来更长延迟。可通过retries="2"来设置重试次数(不含第一次)。

<dubbo:service retries="2" />

  • 快速失败

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增记录。

<dubbo:service cluster="failfast" />

  • Failsafe

失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作。

<dubbo:service cluster="failsafe" />

  • FailbackCluster

失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

  • ForkingCluster

并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过forks="2"来设置最大并行数。

<dubbo:servicecluster=“forking" />

  • Broadcast

广播调用所有服务端,逐个调用,任意一台报错则报错,通常用于更新本地方法,比如:清除本地缓存

gRpc

介绍

gRPC 是一个高性能、通用的开源 RPC 框架,其由 Google 2015 年主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf 序列化协议开发,且支持众多开发语言。

由于是开源框架,通信的双方可以进行二次开发,所以客户端和服务器端之间的通信会更加专注于业务层面的内容,减少了对由 gRPC 框架实现的底层通信的关注。

如下图,DATA 部分即业务层面内容,下面所有的信息都由 gRPC 进行封装。

调用流程

客户端(gRPC Stub)调用 A 方法,发起 RPC 调用。

对请求信息使用 Protobuf 进行对象序列化压缩(IDL)。

服务端(gRPC Server)接收到请求后,解码请求体,进行业务逻辑处理并返回。

对响应结果使用 Protobuf 进行对象序列化压缩(IDL)。

客户端接受到服务端响应,解码请求体。回调被调用的 A 方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果。

gRpc的特点

优点

protobuf二进制消息,性能好/效率高

proto文件生成目标代码,简单易用

序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射

支持向前兼容和向后兼容

支持多种语言,底层采用Netty实现

缺点

GRPC尚未提供链接池,需要自己实现。

尚未提供服务发现、负载均衡机制

Protobuf二进制可读性差

什么是Protocol Buffers?

你可以理解ProtoBuf是一种更加灵活、高效的数据格式,与XML、JSON类似,在一些高性能且对响应速度有要求的数据传输场景非常适用。ProtoBuf在gRPC的框架中主要有三个作用:

  • 定义数据结构

  • 定义服务接口

  • 通过序列化和反序列化,提升传输效率

为什么ProtoBuf会提高传输效率呢?

我们知道使用XML、JSON进行数据编译时,数据文本格式更容易阅读,但进行数据交换时,设备就需要耗费大量的CPU在I/O动作上,自然会影响整个传输速率。Protocol Buffers不像前者,它会将字符串进行序列化后再进行传输,即二进制数据。

可以看到其实两者内容相差不大,并且内容非常直观,但是Protocol Buffers编码的内容只是提供给操作者阅读的,实际上传输的并不会以这种文本形式,而是序列化后的二进制数据。字节数会比JSON、XML的字节数少很多,速率更快。

如何支撑跨平台,多语言呢?

Protocol Buffers自带一个编译器也是一个优势点。前面提到的proto文件就是通过编译器进行编译的,proto文件需要编译生成一个类似库文件,基于库文件才能真正开发数据应用。具体用什么编程语言编译生成这个库文件呢?由于现网中负责网络设备和服务器设备的运维人员往往不是同一组人,运维人员可能会习惯使用不同的编程语言进行运维开发,那么Protocol Buffers其中一个优势就能发挥出来——跨语言。

从上面的介绍,我们得出在编码方面Protocol Buffers对比JSON、XML的优点:

  • 简单,体积小,数据描述文件大小只有1/10至1/3;

  • 传输和解析的速率快,相比XML等,解析速度提升20倍甚至更高;

  • 可编译性强。

基于HTTP 2.0标准设计

除了 Protocol Buffers 之外,从交互图中和分层框架可以看到, gRPC 还有另外一个优势——它是基于 HTTP 2.0 协议的。

由于 gRPC 基于 HTTP 2.0 标准设计,带来了更多强大功能,如多路复用、二进制帧、头部压缩、推送机制。

这些功能给设备带来重大益处,如节省带宽、降低 TCP 连接次数、节省 CPU 使用等,gRPC 既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现两端的通信和简化通信系统的构建。

HTTP 1.X 定义了四种与服务器交互的方式,分别为 GET、POST、PUT、DELETE,这些在 HTTP 2.0 中均保留,我们看看 HTTP 2.0 的新特性:双向流、多路复用、二进制帧、头部压缩。

Thrift

介绍

thrift是一种可伸缩的跨语言服务的RPC软件框架。它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,高效、无缝地在多种语言间结合使用。2007年由facebook贡献到apache基金,是apache下的顶级项目,具备如下特点:

  • 支持多语言:C、C++ 、C# 、D 、Delphi 、Erlang 、Go 、Haxe 、Haskell 、Java 、JavaScript、node.js 、OCaml 、Perl 、PHP 、Python 、Ruby 、SmallTalk

  • 消息定义文件支持注释,数据结构与传输表现的分离,支持多种消息格式

  • 包含完整的客户端/服务端堆栈,可快速实现RPC,支持同步和异步通信

Thrift框架结构

Thrift是一套包含序列化功能和支持服务通信的RPC(远程服务调用)框架,也是一种微服务框架。其主要特点是可以跨语言使用,这也是这个框架最吸引人的地方。

图中code是用户实现的业务逻辑,接下来的 Service.Client和 write()/read()是thrift根据IDL生成的客户端和服务端的代码,对应于RPC中Client stub和Server stub。TProtocol 用来对数据进行序列化与反序列化,具体方法包括二进制,JSON 或者 Apache Thrift 定义的格式。TTransport 提供数据传输功能,使用 Apache Thrift 可以方便地定义一个服务并选择不同的传输协议。

Thrift网络栈结构

thirft使用socket进行数据传输,数据以特定的格式发送,接收方进行解析。我们定义好thrift的IDL文件后,就可以使用thrift的编译器来生成双方语言的接口、model,在生成的model以及接口代码中会有解码编码的代码。thrift网络栈结构如下:

Transport层

代表Thrift的数据传输方式,Thrift定义了如下几种常用数据传输方式:

TSocket: 阻塞式socket;

TFramedTransport: 以frame为单位进行传输,非阻塞式服务中使用;

TFileTransport: 以文件形式进行传输。

TProtocol层

代表thrift客户端和服务端之间传输数据的协议,通俗来讲就是客户端和服务端之间传输数据的格式(例如json等),thrift定义了如下几种常见的格式:

TBinaryProtocol: 二进制格式;

TCompactProtocol: 压缩格式;

TJSONProtocol: JSON格式;

TSimpleJSONProtocol: 提供只写的JSON协议。

Server模型

  • TSimpleServer: 简单的单线程服务模型,常用于测试;

  • TThreadPoolServer: 多线程服务模型,使用标准的阻塞式IO;

  • TNonBlockingServer: 多线程服务模型,使用非阻塞式IO(需要使用TFramedTransport数据传输方式);

  • THsHaServer: THsHa引入了线程池去处理,其模型读写任务放到线程池去处理,Half-sync/Half-async处理模式,Half-async是在处理IO事件上(accept/read/write io),Half-sync用于handler对rpc的同步处理;

对比

SpringCloudOpenFeign

Dubbo

gRpc

Thrift

Conpany

Spring

Alibaba

Google

Facebook

Apache

跨语言

Java

Java

跨语言

跨语言

通讯协议

Dubbo协议(走Hessian序列化,单一长连接,NIO异步通信,传输数据量很小,但是并发量很高的长连接

Rmi协议(走java二进制序列化,多个短连接,适合消费者和提供者数量差不多,适用于文件的传输,一般较少用

Hessian协议(走Hessian序列化,多个短连接,适用于提供者数量比消费者数量还多,适用于文件的传输,一般较少用

HTTP协议(走json序列化,一般较少用

Dubbo Thrift协议

Redis协议...

HTTP2.0协议

TSocket(使用堵塞式I/O进行传输,也是最常见的模式)

TFramedTransport(使用非阻塞方式,以frame为单位进行传输,类似于Java中的NIO)

TFileTransport(以文件形式进行传输,虽然这种方式不提供Java的实现,但是实现起来非常简单)

TMemoryTransport(使用内存I/O,如Java中的ByteArrayOutputStream实现)

TZlibTransport(使用执行zlib压缩,与其他传输方式联合使用,不提供Java的实现)

TNonblockingTransport(使用非阻塞方式,用于构建异步客户端)

序列化

Hessian

Json

ProtoBuf

TBinaryProtocol(二进制编码格式进行数据传输)

TCompactProtocol(高效密集型的二进制序列化协议,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩)

TJSONProtocol(使用JSON的数据编码协议进行数据传输)

TSimpleJSONProtocol(只提供JSON只写的协议,适用于通过脚本语言解析)

负载均衡

Random

RoundRobin

ConsistenHash

LeastActive

容错机制

Failover

Failfast

Failsafe

Failback

Forking

Broadcast

Failover

服务注册与服务发现

Zookeeper

Redis

Multicas

Simple

性能

★★

★★★

★★★★

性能测试

吞吐率

rpcx > thrift > gRpc > Motan > Dubbo

平均响应时间

rpcx > thrift > gRpc > Motan > Dubbo

但是这个是平均响应时间,可能掩盖一些真相,尤其是当响应时间的分布不是那么平均,所以我们还可以关注另外一个指标,就是中位数(所谓中位数的意就是把将一组数据按大小顺序排列,处在最中间位置的一个数叫做这组数据的中位数

,这意味着至少有50%的数据低于或高于这个中位数)。

这里的中位数指小于这个数值的测试数和大于这个数值的测试数相等。

中位数

gRpc > thrift > rpcx > Motan > Dubbo

极端情况

rpcx > Motan > thrift > gRpc > Dubbo

gRpc & thrift

https://github.com/chrislee87/rpc_benchmark

个人总结

  • RPC最主要的就是性能

  • SpringCloudOpenFeign是基于HTTP1.1协议文本类Json序列化格式的,性能低,排除。

  • Dubbo现在已经成为了服务治理的微服务框架,负载均衡与容错机制很完善,但是性能低于gRpc和Thrift。而且我们使用K8S容器来做服务注册与发现,K8S也已经包含了负载均衡的功能,所以我们排除Dubbo。

  • thrift 是Software framework for scalable cross-language services development,性能也很强劲,也可以与非常多的语言无缝结合,很适用于跨语言的服务开发,技术出来的很早,现在社区不够活跃,文档非常的少。

  • gRpc is a modern open source high performance RPC framework that can run in any environment. 在github的社区上更加活跃,Protocol buffer (Protobuff) serializes very quickly on the server and client. Protobuff serialization results in small message payloads,而且Protobuff协议已经成为了业界的标准,所以我们选择 gRpc。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/347331.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

金三银四跳槽季,JAVA面试撸题就来【笑小枫】微信小程序吧~

JAVA面试撸题就来【笑小枫】微信小程序啦~ 疫情已过&#xff0c;金三银四即将到来&#xff0c;小伙伴们是否有跳槽的打算呢&#xff1f;不管有没有&#xff0c;技术不能丢&#xff0c;让我们一起来撸题吧。 博主最近整理了一批面试题&#xff0c;包括JAVA基础、多线程与锁、Red…

媒体邀约电视台对商业活动选题有什么要求?如何邀请电视台报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好随着互联网&#xff0c;移动互联网的快速发展&#xff0c;大众在电视上消磨的时间就越来越短了&#xff0c;但是随着新媒体的出现&#xff0c;传统媒体不断的跟进发展&#xff0c;不断打造自己的媒体矩阵&#xff0c;虽然离…

界面控件DevExpress WinForm——轻松构建类Visual Studio UI(一)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

图穷了,来搞一搞(内附源码)

本章继续我们的爬虫教程&#xff0c;爬什么呢 &#xff0c;还是斗图&#xff0c;娱乐性的东西&#xff0c;为什么要爬&#xff1f; 因为我图库空了&#xff0c;发现这个网址的图库还是很丰富的。 「注意&#xff1a;如下文&#xff0c;是封装后拆分的&#xff0c;所以详情参照…

Word处理控件Aspose.Words功能演示:使用 C# 在电子邮件正文中发送 Word 文档

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c;API支持所有流行的Word处理文件…

《精通Spring4.x 企业应用开发实战》第12章 Spring 的事务管理难点剖析

目录标题前言一、DAO 和事务管理的牵绊二、应用分层的迷惑三、事务方法嵌套调用的迷茫(事务传播行为)1.Spring 事务传播机制回顾2.相互嵌套的服务方法四、多线程的困惑1. Spring 通过单实例化 Bean 简化多线程问题2.启动独立线程调用事务方法五、联合军种作战的混乱1.Spring 事…

用了 ChatGPT 后,我迫不及待的问了它这 10 个问题

前言20230208 日&#xff0c;ChatGPT 已经联手微软登录必应搜索引擎&#xff0c;谷歌、百度等巨头更是紧随其后着急麻慌的推出自己的 AI 聊天产品&#xff0c;有理由相信&#xff0c;传统搜索引擎时代已经结束&#xff0c;不远的未来&#xff0c;每个人家里都会有一个可以陪你聊…

数字芯片是怎样设计出来的?

芯片在我们的生活和工作中无处不在。例如&#xff0c;交通智能卡就嵌入了一颗带有微处理器、储存单元、芯片操作系统的芯片&#xff1b;而手机的主板则集成了数百颗芯片&#xff0c;有的负责无线电收发、有的负责功率放大、还有的负责存储照片和文件、处理音频&#xff0c;完成…

如何查找专用 IP 地址?

专用 IP 地址&#xff1a;这些地址在网络内部使用&#xff0c;例如&#xff0c;平板电脑、Wi-Fi 相机、无线打印机和台式电脑使用的家庭网络。这些类型的 IP 地址为设备提供了一种与路由器和专用家庭网络上的其他设备进行通信的方法。私有IP地址可以手动设置&#xff0c;也可以…

Mr. Cappuccino的第40杯咖啡——Kubernetes之Pod生命周期

Kubernetes之Pod生命周期Pod生命周期官方文档Pod的状态初始化容器案例钩子函数Exec命令TCPSocketHTTPGet案例容器探测Exec命令TCPSocketHTTPGet探测时间重启策略Pod生命周期官方文档 Pod生命周期官方文档 Pod的状态 pending&#xff1a;挂起&#xff0c;apiserver创建了pod资…

2月第2周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年2月6日-2月12日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站…

python基于django+vue微信小程序的校园跑腿平台

随着计算机技术的高速发展,现代计算机系统已经从以计算为中心向以信息化处理为中心的方向发展。而校园跑腿服务系统,不仅需要在硬件上为现代社会的学生们提供一个学习知识,获取知识的环境,更要在软件上为愿意上课的人提供必要的便利。于是校园跑腿服务系统系统便应运而生。 目前…

企业与第三方供应商合作时,会存在哪些安全风险?

随着现代社会的发展&#xff0c;企业供应链、产业供应链已日渐成熟。其中&#xff0c;供应商与企业的关系也由最初的纯粹买卖关系发展成了合作伙伴关系。在整个供应链体系中&#xff0c;供应商与其受众承担着供应链中环环相扣的责任&#xff0c;可以说&#xff0c;企业安全的薄…

站在行业C位,谷医堂打开健康管理服务新思路

对于农村及贫困地区老百姓来说&#xff0c;由于交通因素和家庭经济条件制约&#xff0c;看病难致身体调理情况一直不太乐观&#xff0c;这也导致心理压力很大。然而&#xff0c;随着近年中医药产业崛起与快速发展&#xff0c;这种局面很快就会得到改观&#xff0c;以湖南谷医堂…

MySQL InnoDB表的碎片量化和整理(data free能否用来衡量碎片?)

网络上有很多MySQL表碎片整理的问题&#xff0c;大多数是通过demo一个表然后参考data free来进行碎片整理&#xff0c;这种方式对myisam引擎或者其他引擎可能有效&#xff08;本人没有做详细的测试&#xff09;.对Innodb引擎是不是准确的&#xff0c;或者data free是不是可以参…

让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”

目录 代码混淆究竟是什么&#xff1f; 如何做代码混淆&#xff1f; 代码混淆不等于加密 App 加固非一时之功 “我想离开浪浪山。” 在数次尝试破解某个App 时&#xff0c;某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推&#xff0c;还原成一段段…

【MySQL】数据库操作

文章目录1、创建和管理数据库1.1 创建数据库1.2 查看数据库1.3 修改数据库1.4 删除数据库2、 创建表2.1 创建表CREATE2.2 创建表AS3、修改表3.1 添加列 ALTERT TABLE ADD3.2 修改列 ALTER TABLE MODIFY3.3 重命名列 ALTER TABLE CHANGE3.4 删除列 ALTER TABLE DROP4、重命名表 …

一文讲透丨如何破解安全应用容器架构的17大挑战!

众所皆知&#xff0c;云计算/云原生技术因能极大地提高云上资源利用率以及应用交付效率而被广泛采用。然而&#xff0c;云计算/云原生技术的发展也让用户遭受了更多高级威胁与攻击。如何构建有效的云原生安全管理体系应对层出不穷的安全威胁这一问题也一直受到千行百业用户的关…

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏

Keras深度学习实战——使用深度Q学习进行SpaceInvaders游戏 0. 前言1. 问题与模型分析2. 使用深度 Q 学习进行 SpaceInvaders 游戏相关链接0. 前言 在《深度Q学习算法详解》一节中,我们使用了深度 Q 学习来进行 Cart-Pole 游戏。在本节中,我们将利用深度Q学习来玩“太空侵略…

CHAPTER 2 Zabbix界面操作

Zabbix界面操作2.1 Zabbix界面操作1.zabbix的web界面安装2.添加监控信息3.查看监控内容4.查看图像2.2 自定义监控与监控报警1.自定义监控1.1 说明1.2 预备知识2.实现自定义监控2.1 自定义语法2.2 agent注册2.3 在server端注册(web操作)2.4 查看监控图形2.3 监控报警1.第三方报警…