2、微服务的特点 单一职责轻量级通信独立性迭代开发 3.微服务的不足 运维成本高接口成本高业务分类困难保证数据一致性 二、RPC简介 1、什么是RPC?使用一套小服务来开发单个应用的方式,每个服务运行在独立的进程里,一般采用轻量级的通讯机制互联,并且它们可以通过自动化的方式部署
二、go实现RPC是一个计算机通信协议
该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程
golang写RPC程序,必须符合4个基本条件,不然RPC用不了golang中实现RPC非常简单,官方提供了封装好的库,还有一些第三方的库。golang官方的
net/rpc
库使用encoding/gob
进行编解码,支持tcp
和http
数据传输方式,由于其他语言不支持gob编解码方式,所以golang的RPC
,只支持golang开发的服务器与客户端之间的交。官方还提供了net/rpc/jsonrpc
库实现RPC方法,jsonrpc采用JSON进行数据编解码,因而支持跨语言调用,目前jsonrpc库是基于tcp
协议实现的,暂不支持http
传输方式
结构体字段首字母要大写,可以别人调用函数名必须首字母大写函数第一参数是接收参数,第二个参数是返回给客户端的参数,必须是指针类型函数还必须有一个返回值error
服务端-代码如下(示例):
package main
import (
"fmt"
"log"
"net/http"
"net/rpc"
)
// 声明结构体
type Data struct{}
// 声明参数结构体
type DdataRequest struct {
A, B int
}
// 声明返回数据结构体
type DateResponse struct {
// 相加
Sum int
// 乘积
Pro int
}
/**
相加计算
(d *data):结构体
(req DdataRequest, res *DateResponse): 声明参数结构体,声明返回数据结构体
*/
func (d *Data) Plus(req DdataRequest, res *DateResponse) error {
res.Sum = req.A + req.B
return nil
}
func main() {
// 注册一个rect的服务
rpc.Register(new(Data))
// 将协议绑定http上
rpc.HandleHTTP()
// 监听服务
err := http.ListenAndServe(":8011", nil)
if err != nil {
log.Panicln(err)
}
fmt.Print("服务开启")
}
客户端端-代码如下(示例):
package main
import (
"fmt"
"log"
"net/rpc"
)
type DateRequest struct {
A, B int
}
// 返回给客户端的结果
type Response struct {
// 相加
Sum int
}
type Params struct {
A, B int
}
func main() {
// 链接rpc服务
conn, err := rpc.DialHTTP("tcp", ":8011")
if err != nil {
log.Fatal(err)
}
req := DateRequest{2, 2}
var res Response
err2 := conn.Call("Data.Plus", req, &res)
if err2 != nil {
log.Panicln(err2)
}
fmt.Println("数据:", res)
}
返回结果(示例):
数据: {4}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)