rpc & grpc

标题rpc

1 远程过程调用,是分布式系统中不同节点间流行的通信方式
		--简单来说成熟的rpc库相对http容器,更多的是封装了“服务发现”,"负载均衡",“熔断降级”一类面向服务的高级特性。可以这么理解,rpc框架是面向服务的更高级的封装。如果把一个http servlet容器上封装一层服务发现和函数代理调用,那它就已经可以做一个rpc框架了。
	所以为什么要用rpc调用?
	因为良好的rpc调用是面向服务的封装,针对服务的可用性和效率等都做了优化。单纯使用http调用则缺少了这些特性。

既然有 HTTP 请求,为什么还要用 RPC 调用?

	--包含传输协议([gRPC](grpc / grpc.io) 使用的 http2 协议)和序列化协议(的xml json,也有二进制编码的 protobuf hessian等。)。
	--**必要性:内部子系统较多、接口非常多的情况下,
		1 长链接,不必每次通信都要像http 一样去3次握手什么的,减少了网络开销;
		2 有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统 一化的操作。
		3 安全性。最后就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑**
	--rpc是一种概念,http也是rpc实现的一种方式。
	--方法只能有两个可序列化的参数,返回一个 error 类型
	`type HelloService struct {}
		func (p *HelloService) Hello(request string, reply *string) error {
		    *reply = "hello:" + request
		    return nil
		}
	**注册rpc服务**
		func main() {
		    rpc.RegisterName("HelloService", new(HelloService))
		
		    listener, err := net.Listen("tcp", ":1234")
		    if err != nil {
		        log.Fatal("ListenTCP error:", err)
		    }
		
		    conn, err := listener.Accept()
		    if err != nil {
		        log.Fatal("Accept error:", err)
		    }
		
		    rpc.ServeConn(conn)
		}
		```
		HelloService rpc服务空间,并建立一个唯一的 TCP 连接,
		rpc.ServeConn 函数在该 TCP 连接上为对方提供 RPC 服务。
		**
		

	```go
	func main() {
	    client, err := rpc.Dial("tcp", "localhost:1234")
	    if err != nil {
	        log.Fatal("dialing:", err)
	    }
	
	    var reply string
	    err = client.Call("HelloService.Hello", "hello", &reply)
	    if err != nil {
	        log.Fatal(err)
	    }
	
	    fmt.Println(reply)
	}
	
	```
	clinet	
```go
	func flipSale() {
		err = client.Call(&ss, "contract_nftApprove", "0xEA9f61B3201012b89F41F13e10fdF1F63f8d70E2", 1)
		if err != nil {
			panic(err)
		}
		fmt.Printf("contract_nftApprove %s", reply)
	
		//
		(tokenId *big.Int, onSale bool, price float64, currencyAddress string, nftAddr string)
		var client, err = rpc.Dial("http://154.83.17.166:8080")
		err = client.Call(&ss, "contract_flipSale", 1,
			true, float64(12.1), "0x5DEa0651beC7D1Fbec9Ec1905784F3b814F9338D", "0xEA9f61B3201012b89F41F13e10fdF1F63f8d70E2")
		if err != nil {
			panic(err)
		}
		fmt.Printf("contract_flipSale %s", reply)
	}
	```

gRPC 是 Google 公司基于 Protobuf 开发的跨语言的开源 RPC 框架。

回答: RPC(Remote Procedure Call)和 gRPC 是两种不同的远程过程调用协议。RPC是一种通过网络从远程计算机程序上请求服务的协议,它可以实现不同节点之间的通信。而gRPC是一种基于RPC协议的框架,它使用了Google开发的Protocol Buffers作为序列化和协议编解码器,以及HTTP/2作为网络传输协议。\[1\]\[2\]\[3\] 区别在于,gRPC相比传统的RPC框架具有以下特点: 1. 序列化和协议编解码器:gRPC使用Protocol Buffers作为默认的序列化和协议编解码器,它可以高效地序列化和传输数据。 2. 网络传输协议:gRPC使用HTTP/2作为网络传输协议,可以提供更高的性能和更低的延迟。 3. 多语言支持:gRPC支持多种编程语言,包括C++、Java、Python等,可以方便地在不同的语言之间进行通信。 4. 异步支持:gRPC支持异步调用,可以提高系统的并发性能。 5. 服务定义:gRPC使用Protocol Buffers定义服务接口和消息类型,可以自动生成客户端和服务端的代码,简化开发过程。 总之,gRPC是一种基于RPC协议的框架,通过使用Protocol Buffers和HTTP/2等技术,提供了更高效、更灵活的远程过程调用方式。 #### 引用[.reference_title] - *1* *2* *3* [RpcgRpc 简介汇总](https://blog.csdn.net/Jailman/article/details/126056469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值