2.微服务--RPC
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.微服务--RPC相关的知识,希望对你有一定的参考价值。
1.RPC简介1.远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议。
2.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。
3.如果涉及的软件采用面向对象编程,那么远程过程调用也可称为远程调用或远程方法调用。
2.流行的RPC框架的对比
3.golang中如何实现RPC
Golang中实现RPC比较简单,官方提供了封装好的库,还有第三方库。
官方库:net/rpc
1.net/rpc库使用encoding/gob进行编码
2.支持tcp和http数据传输方式
3.由于其他语言不支持gob编解码方式,所以golang的RPC只支持golang开发的服务端与客户端的交互
官方库:net/jsonrpc
1.jsonrpc采用JSON进行数据编解码,因而支持跨语言调用。
2.jsonrpc库是基于tcp协议实现的,暂不支持http传输方式。
golang的RPC必须符合四个条件才可以:
1.结构体字段首字母要大写,要跨域访问,所以大写。
2.函数名必须首字母大写。
3.函数第一个参数是接收参数,第二个参数是返回给客户端参数,必须是指针类型。
4.函数必须有一个返回值err。
3.1示例1
golang实现RPC程序,实现求矩形面积和周长
//rpcClient/server.go
package main
import (
"log"
"net/http"
"net/rpc"
)
//服务端,求举行面积和周长
//声明矩形对象
type Rect struct {
}
//声明参数结构体,字段首字母大写
type Param struct {
Width,Height int
}
//golang的RPC必须符合4个条件才可以
//? 结构体字段首字母要大写,要跨域访问,所以大写
//? 函数名必须首字母大写(可以序列号导出的)
//? 函数第一个参数是接收参数,第二个参数是返回给客户端参数,必须是指针类型
//? 函数必须有一个返回值error
//定义求矩形面积的方法
func (r Rect) Area(p Param,ret *int) error{
*ret = p.Width * p.Height
return nil
}
//定义求矩形周长的方法
func (r Rect) Perimeter(p Param,ret *int) error{
*ret = (p.Width + p.Height)*2
return nil
}
func main() {
//1.注册服务
rect := new(Rect)
rpc.Register(rect)
//2.把服务处理绑定到http协议上
rpc.HandleHTTP()
//3.监听服务,等待客户端调用请求面积和周长的方法
err := http.ListenAndServe(":8080",nil)
if err != nil{
log.Fatal(err)
}
}
//rpcServer/client.go
package main
import (
"fmt"
"log"
"net/rpc"
)
//声明参数结构体,字段首字母大写
type Params struct {
Width,Height int
}
//调用服务
func main() {
//1.链接远程RPC服务
rp,err := rpc.DialHTTP("tcp","127.0.0.1:8080")
if err != nil{
log.Fatal(err)
}
//2.调用远程方法
//定义接收服务端传回来的计算结果的变量
ret := 0
//求矩形面积
err2 := rp.Call("Rect.Area",Params{50,10},&ret)
if err2 != nil{
log.Fatal(err2)
}
fmt.Println("面积:",ret)
//求矩形周长
err3 := rp.Call("Rect.Perimeter",Params{50,10},&ret)
if err3 != nil{
log.Fatal(err3)
}
fmt.Println("周长:",ret)
}
以上是关于2.微服务--RPC的主要内容,如果未能解决你的问题,请参考以下文章