【RPC和Protobuf】之RPC入门
一,概念
RPC:Remote procedure call(远程过程调用),分布式系统中不同节点之间流行的通信方式
服务端:
注:
1、执行下面的代码之后,会相应的启动一个tcp进程
C:\Users\lWX1011939>netstat -aon|findstr 1234 1234是代码中指定的端口号
TCP 127.0.0.1:1234 0.0.0.0:0 LISTENING 10960
2、终止进程:C:\Users\lWX1011939>taskkill /F /pid 10960 /F:表示强制终止
成功: 已终止 PID 为 10960 的进程。
package main
import (
"log"
"net"
"net/rpc"
)
type HelloService struct {
//构造一个HelloService类型
}
//一个满足rpc规则的方法(方法只能有两个可序列化的参数,第二个参数是指针类型,方法返回error类型)
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "hello " + request
return nil
}
func main() {
//rpc.RegisterName会将传入的对象类型中所有满足RPC规则的方法注册为RPC函,比如这里的Hello函数
rpc.RegisterName("HelloService", new(HelloService))
//建立唯一的tcp链接
listener, listenErrInfo := net.Listen("tcp", "localhost:1234")
if listenErrInfo != nil {
log.Fatal("Listen tcp error by: ", listenErrInfo)
}
connector, acceptErrInfo := listener.Accept()
if acceptErrInfo != nil {
log.Fatal("Accept error : ", acceptErrInfo)
}
//通过rpc.ServeConn函数在该TCP链接上为对方提供RPC服务
rpc.ServeConn(connector)
}
客户端:
package main
import (
"fmt"
"log"
"net/rpc"
)
func main() {
//客户端请求HelloService服务。首先通过rpc.Dial拨号RPC服务
client, dialErrInfo := rpc.Dial("tcp", "localhost:1234")
if dialErrInfo != nil {
log.Fatal("Dial error: ", dialErrInfo)
}
var reply string
//通过client.Call调用具体的RPC方法, 第一个参数是用点号链接的RPC服务名字和方法名字,第二和第三个参数分别我们定义RPC方法的两个参数
callErrInfo := client.Call("HelloService.Hello", "hello", &reply)
if callErrInfo != nil {
log.Fatal("Call error info: ", callErrInfo)
}
fmt.Println("reply: ", reply) 这里会打印出reply: hello hello
}
【RPC和Protobuf】之RPC入门的更多相关文章
- python通过protobuf实现rpc
由于项目组现在用的rpc是基于google protobuf rpc协议实现的,所以花了点时间了解下protobuf rpc.rpc对于做分布式系统的人来说肯定不陌生,对于rpc不了解的童鞋可以自行g ...
- 基于HTTP/2和protobuf的RPC框架:GRPC
谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobu ...
- JAVA RPC(一)RPC入门
为什么要写这个RPC 市面上常见的RPC框架很多,grpc,motan,dubbo等,但是随着越来越多的元素加入,复杂的架构设计等因素似使得这些框架就想spring一样,虽然号称是轻量级,但是用起来却 ...
- Java自带RPC实现,RMI框架入门
Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种 ...
- 十七.protobuf在rpc中的使用
关于protobuf在rpc中的使用,设计到gRPC,相关内容待续....
- RPC框架实现(一) Protobuf的rpc实现
概述 RPC框架是云端服务基础框架之一,负责云端服务模块之间的项目调用,类似于本地的函数调用一样方便.常见的RPC框架配带的功能有: 编解码协议.比如protobuf.thrift等等. 服务发现.指 ...
- 应答流式RPC 请求流式RPC 向流式RPC 流式RPC的三种具体形式
https://mp.weixin.qq.com/s/pWwSfXl71GQZ3KPmAHE_dA 用Python进行gRPC接口测试(二) 大帆船 搜狗测试 2020-02-07 上期回顾:用P ...
- RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化
序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果.服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用.然我们自己动手从0开始写一个rpc功能以及实 ...
- Solon rpc 之 SocketD 协议 - RPC调用模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
- Solon rpc 之 SocketD 协议 - RPC鉴权模式
Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...
随机推荐
- 字节微服务HTTP框架Hertz使用与源码分析|拥抱开源
一.前言 Hertz[həːts] 是一个 Golang 微服务 HTTP 框架,在设计之初参考了其他开源框架 fasthttp.gin.echo 的优势, 并结合字节跳动内部的需求,使其具有高易用性 ...
- 在 C# CLR 中学习 C++ 之了解 extern
一:背景 在 CLR 源码中有很多的 extern 和 extern "C" 这样的关键词,比如下面这些代码: extern size_t gc_global_mechanisms ...
- [SDR] GNU Radio 系列教程(二) —— 绘制第一个信号分析流程图
目录 1.前言 2.启动 GNU Radio 3.新增块 4.运行 本文视频 参考链接 1.前言 本文将介绍如何在 GNU Radio 中创建和运行第一个流程图. 2.启动 GNU Radio GNU ...
- 【Shashlik.EventBus】.NET 事件总线,分布式事务最终一致性
[Shashlik.EventBus].NET 事件总线,分布式事务最终一致性 简介 github https://github.com/dotnet-shashlik/shashlik.eventb ...
- 输入法词库解析(二)搜狗拼音细胞词库.scel(.qcel)
详细代码:https://github.com/cxcn/dtool 前言 .scel 是搜狗拼音输入法所使用的细胞词库格式,可以在 https://pinyin.sogou.com/dict/ 下载 ...
- Rust-语句和表达式
语句和表达式 Rust 的函数体是由一系列语句组成,最后由一个表达式来返回值,例如: fn add_with_extra(x: i32, y: i32) -> i32 { let x = x + ...
- Kubernetes DevOps: Tekton
Tekton 是一款功能非常强大而灵活的 CI/CD 开源的云原生框架.Tekton 的前身是 Knative 项目的 build-pipeline 项目,这个项目是为了给 build 模块增加 pi ...
- Java容器化参数配置最佳实践
Java是以VM为基础的,而云原生讲究的就是Native,天然的矛盾,虽然Quarkus是为GraalVM和HotSpot量身定制的K8s Native Java框架,生态原因切换成本太高,这种矛盾体 ...
- K8S概念理解
Master 负责管理集群 负责协调集群中的所有活动,例如调度应用程序,维护应用程序的状态,扩展和更新应用程序. Worker节点是VM(虚拟机)或物理计算机,充当k8s集群中的工作计算机. 每个Wo ...
- filebeat直接给es传输日志,自定义索引名
ElasticStack从2019年1月29日的6.6.0版本的开始,引入了索引生命周期管理的功能,新版本的Filebeat则默认的配置开启了ILM,导致索引的命名规则被ILM策略控制. 加上这个配置 ...