微服务基础之RPC协议

Posted 平凡键客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务基础之RPC协议相关的知识,希望对你有一定的参考价值。

概述   

    RPC 是微服务之间互相调用的一种方式,在微服务项目中为了不同模块之间的耦合尽可能少,常常需要对业务进行清晰的划分,对各个模块进行解耦处理,比如说鉴权服务就可以从业务中抽离出来,通过提供API接口,其他服务通过RPC 协议调用鉴权服务的方式实现鉴权功能,实际上这个时候也可以通过HTTP 协议进行请求,只是某些场景下使用RPC 显得更加优雅,在需要的场合下使适当的技术是很有必要的,所以我们需要对RPC协议有一个基础的了解与认知,这样有助于我们更好的开发微服务项目。


RPC 是什么

RPC 的规则

RPC 方法需要为公有,同时有两个可序列化参数,第二个为引用类型(response 调用方接受服务方修改的值)函数返回类型为error。

Echo demo

这里使用Golang 实现了一个echo demo,代码比较简单,但是我们可以从简短的代码之中体会到采用 RPC的优雅之处。


服务端:

package main

import (
"fmt"
"net"
"net/rpc"
)

type EchoService struct {
}

func (p *EchoService) Echo(message string, reply *string) error {
fmt.Println("client say:", message)
*reply = "echo server say :" + message
return nil
}

func main() {
fmt.Println("waitting or client..")
rpc.RegisterName("EchoService", new(EchoService))
listener, err := net.Listen("tcp", ":8888")
if err != nil {
panic(err)
}
conn, err := listener.Accept()
if err != nil {
panic(err)
}
rpc.ServeConn(conn)
}

客户端

package main

import (
"fmt"
"net/rpc"
)

func main() {
client, err := rpc.Dial("tcp", "localhost:8888")
if err != nil {
panic(err)
}

var reply string
err = client.Call("EchoService.Echo", "Hello world", &reply)
if err != nil {
panic(err)
}
client.Close()
fmt.Println(reply)
}

结果:

~/.../rpc/server >>> go run ./echo.go                                          
waitting or client..
client say: Hello world

~/.../rpc/client >>> go run ./client.go
echo server say :Hello world


以上是关于微服务基础之RPC协议的主要内容,如果未能解决你的问题,请参考以下文章

RPC远程协议之原理分析

性能基础之常见RPC框架浅析

Day785.网络通信优化之通信协议:如何优化RPC网络通信 -Java 性能调优实战

网络协议-RPC协议

网络协议-RPC协议

企业级工作流解决方案--微服务消息处理模型之服务端处理