07-03-A-RPC与通信详解

RPC漏洞_MS03-026 漏洞原理:微软修改dcerpc框架后形成自己的RPC框架来处理进程间的通信。微软的RPC框架在处理TCP/IP信息交换过程中存在的畸形消息时,未正确处理,导致缓冲区溢出漏洞;此漏洞影响使用RPC框架的DCOM接口,DCOM接口用来处理客户端机器发送给服务器的DCOM对象**请求,如UNC路径。msf使用windows/dcerpc/ms03_026_dcom模块,payload使用windows/shell/reverse_tcp。目标靶机为windows xp,端口135。执行whoami命令。 阅读详情

07-03-A-RPC与通信详解

️ 关键词:RPC · Dubbo · SPI · 序列化 · Protobuf · gRPC · HTTP vs RPC · 服务治理 · 零拷贝

📌 导读:微服务之间怎么通信?两条路:HTTP(REST)和 RPC(Dubbo/gRPC)。HTTP 通用但慢,RPC 快但重——选哪个?这篇用大白话讲透:RPC 的核心原理(动态代理+序列化+网络传输+服务发现)、Dubbo 的架构(Provider/Consumer/Registry/Monitor)与 SPI 扩展机制、序列化协议对比(JSON/Hessian/Protobuf/Kryo)、HTTP vs RPC 的选型决策、gRPC 为什么快(HTTP/2+Protobuf+零拷贝)。看完你能做到:被问"RPC 原理"能画出调用链路,被问"Dubbo SPI 和 JDK SPI 区别"能讲出按需加载,被问"HTTP 和 RPC 怎么选"能给出决策框架。

前置知识:动态代理(27-A 篇 AOP)、网络 IO(NIO/零拷贝,03-A 篇堆外内存)、Spring Cloud(28-A 篇)。



📖 术语速查表(每个词都用人话解释)

** RPC 核心类**

术语一句话白话解释
RPC(Remote Procedure Call)远程过程调用——像调本地方法一样调远程服务,底层帮你做网络通信
动态代理RPC 的客户端核心——为远程接口生成代理对象,方法调用转成网络请求
序列化把对象转成字节流(网络传输)——JSON/Hessian/Protobuf/Kryo
反序列化把字节流转回对象——接收方还原对象
服务发现从注册中心查远程服务的地址——和 Spring Cloud 注册中心同款
负载均衡多个 Provider 实例时选一个——轮询/随机/最少活跃

️ Dubbo 架构类

术语一句话白话解释
Provider服务提供者——暴露服务,注册到注册中心
Consumer服务消费者——从注册中心查 Provider,发起 RPC 调用
Registry注册中心——ZooKeeper/Nacos,服务注册与发现
Monitor监控中心——统计调用次数/耗时/成功率
Dubbo SPIDubbo 的扩展机制——按需加载扩展点,比 JDK SPI 灵活
扩展点(Extension)可替换的组件——协议/序列化/负载均衡/集群容错都可扩展

** 序列化类**

术语一句话白话解释
JSON文本格式——可读性好、跨语言,但体积大、速度慢
Hessian二进制格式——Dubbo 默认,体积小、速度快,Java 生态
ProtobufGoogle 的二进制格式——体积最小、速度最快,需 .proto 定义+代码生成
KryoJava 二进制序列化——速度极快,但跨语言差
IDL(接口定义语言)定义服务接口的语言——.proto(gRPC)/.thrift(Thrift),代码生成

** gRPC 类**

术语一句话白话解释
gRPCGoogle 的 RPC 框架——HTTP/2+Protobuf+零拷贝,跨语言高性能
HTTP/2HTTP 的新版本——多路复用(一个连接多个请求)、头部压缩、服务端推送
多路复用一个 TCP 连接上并行多个请求/响应——不用为每个请求建连接
.proto 文件Protobuf 的接口定义文件——定义消息结构和服务接口,生成代码

一、RPC 是什么:远程过程调用

1.1 RPC 的目标

// RPC 的目标:像调本地方法一样调远程服务
// 本地调用
Order order = orderService.getOrder(123L);

// RPC 调用(看起来一样,实际跨网络)
Order order = orderService.getOrder(123L);  // orderService 是远程服务的代理

1.2 RPC 调用链路

Consumer 调用接口方法
orderService.getO
rder 123L

① 动态代理拦截
代理对象把方法调用转成 RPC 请求
方法名+参数+元数据。

② 序列化 参数对象→字节流
Protobuf / Hessian / JSON

③ 网络传输 TCP /
HTTP 发送字节流 长连接 / 连接池。

④ Provider 反序列化 字节流→参数对象。

⑤ 反射调用真实方法
orderService.getO
rder 123L 执行业务逻辑。

⑥ 结果序列化+网络返回
Consumer 反序列化得到 Order

RPC 核心四件事:① 动态代理(方法调用转网络请求);② 序列化(对象转字节流);③ 网络传输(TCP/HTTP);④ 服务发现+负载均衡(找到 Provider 实例)。

一句话:RPC = 动态代理+序列化+网络传输+服务发现——把"跨网络调用"包装成"本地方法调用"。


二、Dubbo 架构

2.1 四大角色

① 启动时订阅服务

② 启动时注册服务

③ 推送Provider列表

④ RPC调用·负载均衡选一个

⑤ 上报调用统计

⑤ 上报调用统计

Consumer
服务消费者。

Registry
注册中心,ZK / Nacos

Provider
服务提供者。

Monitor
监控中心。

2.2 调用流程 10 步

步骤角色动作
1Provider启动,暴露服务,注册到 Registry
2Consumer启动,从 Registry 订阅服务
3Registry推送 Provider 列表给 Consumer(变更时实时推送)
4Consumer基于 Provider 列表,负载均衡选一个
5Consumer发起 RPC 调用(动态代理+序列化+网络)
6Provider接收请求,反序列化,反射调用真实方法
7Provider返回结果(序列化+网络)
8Consumer反序列化结果,返回给调用方
9Consumer/Provider异步上报调用统计到 Monitor
10Monitor统计 QPS/RT/成功率

2.3 Dubbo 的核心能力

能力说明
透明化远程调用像调本地方法一样调远程——动态代理
软负载均衡客户端负载均衡(轮询/随机/最少活跃/一致性哈希)
集群容错Failover(重试)/Failfast(快速失败)/Failsafe(安全失败)/Failback(自动恢复)
服务治理路由规则/权重调整/黑白名单/降级——运行时动态调整

三、Dubbo SPI:扩展机制

3.1 JDK SPI vs Dubbo SPI

维度JDK SPIDubbo SPI
加载方式一次性加载所有实现按需加载指定实现
配置META-INF/services/接口全名META-INF/dubbo/接口全名(key=value)
扩展不支持支持 IoC(注入依赖)+ AOP(Wrapper 包装)
性能浪费(加载不用的实现)按需加载,性能好

3.2 Dubbo SPI 示例

dubbo=org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol
http=org.apache.dubbo.rpc.protocol.http.HttpProtocol
grpc=org.apache.dubbo.rpc.protocol.grpc.GrpcProtocol
// 按需加载指定实现
Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class)
    .getExtension("dubbo");   // 只加载 DubboProtocol,不加载 http/grpc

一句话:JDK SPI 一次性加载所有实现(浪费),Dubbo SPI 按需加载指定实现(key=value 配置)+ 支持 IoC/AOP——Dubbo 的协议/序列化/负载均衡/集群容错都是 SPI 扩展点。


四、序列化协议对比

4.1 四大协议对比

维度JSONHessianProtobufKryo
格式文本二进制二进制二进制
可读性好差差差
体积大中最小小
速度慢快最快极快
跨语言好中好差(Java)
使用成本低(无需定义)低高(.proto+代码生成)低
Dubbo 默认—✅ 默认可选可选
适用REST API/调试Dubbo 默认gRPC/高性能Java 内部

4.2 选型建议

场景推荐理由
REST API/跨语言/调试JSON可读性好、跨语言、生态广
Dubbo 默认Hessian体积小、速度快、Java 生态
高性能/跨语言/gRPCProtobuf体积最小、速度最快
Java 内部极致性能Kryo速度极快(但跨语言差)

一句话:JSON 可读但慢,Protobuf 快但要用 .proto 定义,Hessian 是 Dubbo 的平衡选择——按"可读性 vs 性能 vs 跨语言"三角选型。


五、HTTP vs RPC:选型

5.1 对比

维度HTTP(REST)RPC(Dubbo/gRPC)
协议HTTP/1.1(文本)自定义 TCP/HTTP2(二进制)
序列化JSON(文本)Protobuf/Hessian(二进制)
性能慢(文本解析+头部开销)快(二进制+长连接+多路复用)
跨语言好(HTTP 通用)中(需 IDL+代码生成)
调试好(curl/Postman 直接调)差(需专用工具)
服务治理弱(靠网关/SDK)强(内置负载均衡/容错/降级)
生态广(所有语言/工具)Dubbo Java 为主,gRPC 跨语言
适用对外 API/跨团队/跨语言内部微服务/高性能

5.2 选型决策框架

对外API·跨团队·跨语言

内部微服务

高·万级QPS+

一般

Java

多语言

HTTP vs RPC 选型。

对外还是对内?

HTTP / REST
通用,易调试,生态广。

性能要求?

RPC,Dubbo / gRPC
二进制+长连接+服务治理。

团队技术栈?

Dubbo
服务治理强,阿里生态。

gRPC
跨语言,HTTP / 2+Protobuf

一句话:对外 API 用 HTTP(通用易调试),内部微服务用 RPC(高性能+服务治理)——Java 内部选 Dubbo,多语言选 gRPC。


六、gRPC:为什么快

6.1 gRPC 三大快因

gRPC 为什么快。

① HTTP / 2 多路复用
一个 TCP 连接并行多个请求
不用为每个请求建连接,省握手开销。

② Protobuf 序列化
二进制,体积最小,速度最快
比 JSON 小 3~10 倍,快 5~20 倍。

③ 头部压缩+零拷贝 HTTP /
2 头部 HPACK 压缩 二进制帧直接传输,减少拷贝。

6.2 gRPC 工作流

① 定义.proto 文件
message 请求 / 响应结构
service 接口定义。

② 代码生成 protoc 生成客户
端 / 服务端代码 多语言,Java /
Go / Python

③ 服务端实现接口 启动 gRPC
Server,注册。

④ 客户端调用 生成 Stub,
像调本地方法 HTTP / 2+Protobuf 传输。

6.3 gRPC vs Dubbo

维度gRPCDubbo
协议HTTP/2自定义 TCP(可配 HTTP)
序列化Protobuf(固定)Hessian/Protobuf/JSON(可选)
跨语言强(Google 生态)弱(Java 为主)
服务治理弱(靠 Istio/自研)强(内置负载均衡/容错/降级)
适用跨语言/云原生/K8sJava 微服务/阿里生态

七、总结

7.1 一张图回顾全文

RPC 与通信。

RPC 原理。

动态代理+序列化+网络传输+
服务发现 像调本地方法一样调远程。

Dubbo

Provider / Consumer /
Registry / Monitor
SPI 按需加载扩展 集群容错 Failover /
Failfast

序列化。

JSON 可读但慢,Protobuf 快但要定义
Hessian 是 Dubbo 默认,
Kryo Java 极致。

选型。

对外 HTTP,内部 RPC Java 选 Dubbo,
多语言选 gRPC gRPC 快:
HTTP / 2+Protobuf+零拷贝。

7.2 核心要点浓缩(十二条)

  1. RPC = 动态代理+序列化+网络传输+服务发现——把跨网络调用包装成本地方法调用。
  2. RPC 调用链路:代理拦截→序列化→网络传输→反序列化→反射调用→结果返回——六步。
  3. Dubbo 四角色:Provider(暴露服务)、Consumer(调用服务)、Registry(注册中心)、Monitor(监控)。
  4. Dubbo SPI vs JDK SPI:JDK 一次性加载所有实现(浪费),Dubbo 按需加载(key=value)+支持 IoC/AOP——协议/序列化/负载均衡都是 SPI 扩展点。
  5. 序列化四协议:JSON 可读但慢、Hessian Dubbo 默认、Protobuf 最快但要 .proto、Kryo Java 极致——按可读性/性能/跨语言三角选型。
  6. HTTP vs RPC:对外 API 用 HTTP(通用易调试),内部微服务用 RPC(高性能+服务治理)。
  7. Java 内部选 Dubbo,多语言选 gRPC——Dubbo 服务治理强,gRPC 跨语言强。
  8. gRPC 三大快因:HTTP/2 多路复用(一个连接多请求)、Protobuf(体积最小速度最快)、头部压缩+零拷贝。
  9. Dubbo 集群容错:Failover(重试,默认)、Failfast(快速失败)、Failsafe(安全失败)、Failback(自动恢复)。
  10. gRPC 工作流:.proto 定义→代码生成→服务端实现→客户端 Stub 调用——IDL 驱动,跨语言。
  11. HTTP/2 多路复用:一个 TCP 连接并行多个请求/响应——不用为每个请求建连接,省握手开销。
  12. 选型口诀:对外 HTTP、内部 RPC、Java Dubbo、多语言 gRPC、极致性能 Protobuf——没有最好,只有最匹配场景。

📌 最后一句话:RPC 的本质是"把网络通信的复杂性藏起来"——动态代理藏调用、序列化藏格式、服务发现藏地址、负载均衡藏实例。HTTP 和 RPC 不是"谁更好",是"谁更匹配场景"——对外要通用选 HTTP,内部要性能选 RPC,跨语言选 gRPC,Java 生态选 Dubbo。


📌 配套阅读:

上一篇:《07-02-A-SpringCloud全家桶详解.md》

 B 篇:《07-03-B-RPC与通信面试与生产事故实战.md》

下一篇:《07-04-A-分布式理论与实践详解.md》

如果这篇文章对你有帮助,欢迎点赞、收藏、关注!

鸿蒙HarmonyOS实战:IPC与RPC设备内进程通信 Client要和某个具体的SA通信,必须先从SAMgr中获取该SA的代理,然后使用代理和SA通信。下文直接使用Proxy表示服务请求方,Stub表示服务提供方。 阅读详情

相关推荐

HTTP和RPC接口的区别?

大家在面试的过程中,经常会被问到一个问题,那就是HTTP和RPC接口的区别,接下来,就跟随小k的步伐,一起来探究一下这两个接口的区别吧!HTTP和RPC接口是两种常见的接口通信协议,本文将介绍他们的定义,区别和相似之处,应用场景。

m0_74204640的博客 2513

Simple RPC - 03 借助Netty实现异步网络通信

首先定义了对外提供服务的接口。这样,服务的使用者只需要依赖这个接口,而不需要关心其具体实现。这种设计的好处在于,它有效地解耦了接口的使用者和实现者,使我们能够安全地替换接口的实现。通过将接口定义得尽量通用,接口就可以独立于具体的使用场景,从而实现高度的复用性。例如,RPC框架中的网络传输和序列化代码,不仅能在这个框架中使用,甚至可以直接应用到其他系统中,而无需进行修改。在协议设计方面,我们为每个命令设计了一个固定的头部信息。

小工匠 5810

使用Google ProtoBuff完成RPC服务的通信

需求: 使用netty完成一个RPC服务器的编写和调用,在通信的过程中使用protobuff来传递数据前提: protobuff官网:https://developers.google.com/protocol-buffers/(需要翻墙)困惑: RPC和RMI的区别? 原理都是类似的,只是RMI是使用Java编写的不能跨语言,RPC是支持跨语言的 RPC和...

heima201907的博客 700

Netty从0到1系列之RPC通信

RPC通信介绍

编程技术圈 1504

【校招】SHL 的 General Ability (GA, 通用能力测试)

SHL 的 General Ability (GA, 通用能力测试) 文章目录SHL 的 General Ability (GA, 通用能力测试)1、归纳推理题1.1 圈圈线条推理1.2 图形颜色位置推理1.3 箭头指向推理2. 数字推理题攻略3. 语言推理题 1、归纳推理题   归纳推理题我把它总结为三种类型:圈圈线条推理;图形颜色位置推理;箭头指向推理。 1.1 圈圈线条推理   你别看这个题目看起来很复杂,其实很简单,而且这个题型的题目背后原理都一样!我把我的 tips 偷偷分享给你们嘿嘿~先从 A

Sunnyside_ 2万+

华东师范大学2020机试题解

1.统计卡牌的值 #include<iostream> #include<string> #include<vector> //#include<algorithm> using namespace std; int main() { int n; cin>>n; int answer=0; for(int i=0;i<n;++i) { string str; ci

qq_42254342的博客 1901

分布式架构网络通信(RPC,RMI) 03

网络IO,主要有bio、nio、 aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。

程序员进阶之路 1477

TYPE-C PD协议实战:如何用LDR6028芯片实现边充电边OTG(附完整电路设计)

本文详细解析了如何利用LDR6028芯片实现TYPE-C接口在PD协议下的边充电边OTG功能。通过剖析PD协议双角色协商的核心挑战,提供了完整的硬件电路设计要点,包括Type-C接口配置、电源路径管理及系统框架,并附有调试实战指南,助力开发者构建稳定可靠的一线多用解决方案。

c6d7e8f9g的博客 1125

多语言通信基础 03 go和python的rpc通信

python有rpc开发的相关协议,同样go也有rpc的序列化协议Gob。 标准库的RPC默认采用Go语言特有的gob编码,因此从其它语言调用Go语言实现的RPC服务将比较困难。在互联网的微服务时代,每个RPC以及服务的使用者都可能采用不同的编程语言,因此跨语言是互联网时代RPC的一个首要条件。得益于RPC的框架设计,Go语言的RPC其实也是很容易实现跨语言支持的。 go语言的json序列化RPC Go语言的RPC框架有两个比较有特色的设计:一个是RPC数据打包时可以通过插件实现自定义的编码和解码;另

一越王超的博客 3263

Docker网络冲突?手把手教你解决Dify社区版无法访问172.18.0.0网段的问题

本文详细解析了在部署Dify社区版时,因Docker默认网段与局域网冲突导致无法访问172.18.0.0网段的问题。通过剖析Docker网络原理,提供了修改Docker守护进程默认地址池的根治方案,并介绍了在Compose文件中指定自定义网络等备选方法,帮助用户彻底解决网络冲突,保障服务稳定运行。

p8q9r0的博客 484

GB28181安防平台未授权访问漏洞:原理、复现与修复指南

未授权访问漏洞是Web安全中常见的访问控制缺陷,其本质在于应用在提供对敏感功能或数据的访问前,未能对请求者的身份和权限进行充分验证。从技术原理上看,这类漏洞常源于拦截器配置错误、安全注解遗漏或自定义校验逻辑缺陷,导致本应受保护的API接口被意外暴露。在工程实践中,此类漏洞危害巨大,攻击者无需登录即可直接访问系统核心接口,可能引发敏感信息泄露、权限提升甚至系统接管。尤其在安防监控、物联网管理平台等场景中,一旦涉及用户管理接口(如`/api/user/**`),风险会急剧放大。本文以GB28181视频监控管理平

weixin_30271335的博客 436

07-03-B-RPC与通信面试与生产事故实战

本文聚焦RPC面试高频题与生产事故实战,以连贯问答链解析核心原理:从RPC调用链路、Dubbo架构与SPI机制,到序列化选型(JSON/Hessian/Protobuf/Kryo)、HTTP vs RPC对比,及gRPC高性能原因。深度剖析超时重试、序列化不兼容、连接池耗尽等典型故障场景,提出“场景→根因→预防→解决→教训”五段式复盘方法,强调幂等性、限流降级与版本兼容的重要性,助力高效应对高并发微服务挑战。

hhkrye的博客 129

实战指南:从零搭建ROS2 + Cartographer 2D激光SLAM系统

本文详细介绍了如何从零开始搭建ROS2与Cartographer结合的2D激光SLAM系统,涵盖环境准备、激光雷达驱动配置、Cartographer安装与参数调优等关键步骤。通过实战案例和常见问题解决方案,帮助开发者快速掌握激光雷达建图技术,提升机器人自主导航能力。

weixin_29062255的博客 402

[02][07][03] 基于 Netty 实现 RPC 框架

文章目录1. RPC 概述2. 手写 RPC 实现3.1 rpc api 模块3.2 rpc protocol 模块3.3 rpc provider 模块3.4 rpc registry 模块3.5 rpc consumer 模块 1. RPC 概述 Dubbo 官网中的一张图描述了项目架构的演进过程 描述了每一种架构需要的具体配置和组织形态 ORM: 当网站流量很小时, 只需一个应用, 将所有功能都部署在一起, 以减少部署节点和成本, 我们通常会采用单一应用架构. ORM 框架, 主要用于简化增删改查

安全新司机 264

微信小程序后台定位与实时位置更新的实战指南

本文提供了微信小程序实现后台定位与实时位置更新的完整实战指南。针对小程序退到后台后位置更新中断的痛点,详细解析了基于`startLocationUpdateBackground`API的后台定位解决方案。内容涵盖从隐私协议配置、项目权限声明,到授权、启动、监听、停止的核心代码流程,并分享了真机调试、性能优化及权限引导等关键避坑经验,帮助开发者构建稳定可靠的后台位置服务。

weixin_29008055的博客 466

1、符号回归:原理、应用与实践

本文全面介绍了符号回归(Symbolic Regression)的原理、发展历程、核心算法及其在科学与工程领域的广泛应用。文章从基本概念出发,详细阐述了基于遗传编程的符号回归机制,并探讨了其在游艇水动力学、化学过程、锂离子电池、生物医学等多个领域的实际应用。同时,博文还涵盖了高级技术如知识集成、系数优化、预测区间计算及微分方程发现等内容,对比了开源与商业软件工具,并展望了未来发展趋势,旨在为研究人员和从业者提供一本实用的符号回归指南。

ipfs8storage的博客 248

聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂

rpc 是远程方法调用,其实质就分布式进程间通信(ip/port),底层是TCP/IP(socket)通信 1.rpc客户端通过代理静态方法a,获取到接口实现类的代理对象,通过代理对象调用方法获取数据; 2.rpc客户端通过代理静态方法a,底层将接口类、方法名、参数类型、参数序列化后传输到Server端; 3.Server端收到数据后,通过(从服务注册表找到具体的类)反射获取到接口的具体实现类,调用实现类对应的方法 将数据传输回Client端 主要技术点:动态代理、序列化、反序列化、反射、获取数据、序列化.

认知 行动 坚持 2223

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Simple RPC - 07 从零开始设计一个服务端(下)_RPC服务的实现

这种通过“请求中的类型”,把请求分发到对应的处理类或者处理方法的设计,在服务端处理请求的场景中,这是一个很常用的方法。我们这里使用的也是同样的设计,不同的是,我们使用了一个命令注册机制,让这个路由分发的过程省略了大量的 if-else 或者是 switch 代码。把服务的实现类注册到 RPC 框架中,这个逻辑的实现很简单,我们只要使用一个合适的数据结构,记录下所有注册的实例就可以了,后面在处理客户端请求的时候,会用到这个数据结构来查找服务实例。类,根据服务名分发到具体的服务实现类。这个类的唯一的一个实例。

小工匠 5539

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

微服务系列-03服务与服务之间如何通信?

前言 在上一篇博客中我们知道了客户端通过API网关访问服务,那么这些服务之间是如何通信的呢? 写博客的原因是想把自己的知识点分享给大家,为了方便理解,用词可能会不太官方,希望大家多多包涵,如果大家发现博客中有错误,欢迎大家指正留言。 服务指什么,如何通信 想要知道服务与服务之间是如何通信的,我们首先就要知道这里的服务都包括什么? 服务 是指什么? 部署WEB网页的是服务,每天手机上的APP是服务...

weixin_41756573的博客 4055

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

RPC(一):RPC详解

sfas

mingyuli的博客 1303

RPC 实战与核心原理 高效解决分布式系统的通信难题

RPC 实战与核心原理 高效解决分布式系统的通信难题

软希网分享源码的博客 565

RPC介绍与代码实现

RPC介绍与代码实现RPC的英文资料网站:https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html什么是RPCRPC: Remote Procedure Call Protocol——远程过程调用协议 是一种通过网络从远程计算机程序上请求服务的协议。 它可以使我们通过参数传递的方式就像调用本地的方法一样调用远程服务器上的函数或方法。

noaman_wgs的博客 1392

第03章 传输层:stdio、HTTP/SSE与JSON-RPC

上一章讲清了 MCP 暴露什么,本章讨论它怎么传送。Resources、Tools、Prompts 三类能力的调用请求与响应,究竟以什么样的报文格式在 Client 与 Server 之间流动?MCP 在协议层选用 JSON-RPC 2.0 作消息骨架,在传输层提供 stdio 与 HTTP/SSE 两种通道。这一分层是 MCP 灵活性的根源,同一份 Server 实现,既可以作为本机子进程运行,也可以作为远程网络服务部署,业务代码完全不动。

亢少军的博客 403

REST跟RPC

REST跟RPC

John_ToStr的博客 1万+

RPC 框架通信原理

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据; 比如说,一个方法可能是这样定义的:Employee getEmployeeByName(String fullName)那么: 首先,要解决通讯的问题,主要是通过在客户端和服务器...

diannao1008的博客 199

c# socket接收字符串_两种网络通信架构:socket与RPC

客户端与服务器的沟通是网络游戏的根基。一个网络游戏,大部分业务需求都会涉及网络通信,而事实上在开发团队中,却只有少部分开发者真正处理过网络通信逻辑。因为网络通信逻辑总是被封装在框架的底层,处理业务的程序猿只需调用网络工程狮提供的接口即可达成所有的需求。而程序猿与工程狮的隔阂也由此拉开。这篇文章将从实现Unity客户端网络通信功能出发,介绍网络通信的两种架构一一Socket与RPC。这里观...

weixin_39844284的博客 395
上一篇: 07-02-B-SpringCloud全家桶面试与生产事故实战
下一篇: 07-03-B-RPC与通信面试与生产事故实战
滴滴润田心
博客等级 码龄9年 0粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值