1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
6、GO学习之 通道(Channel)
7、GO学习之 多线程(goroutine)
8、GO学习之 函数(Function)
9、GO学习之 接口(Interface)
10、GO学习之 网络通信(Net/Http)
11、GO学习之 微框架(Gin)
12、GO学习之 数据库(mysql)
13、GO学习之 数据库(Redis)
14、GO学习之 搜索引擎(ElasticSearch)
15、GO学习之 消息队列(Kafka)
16、GO学习之 远程过程调用(RPC)
17、GO学习之 goroutine的调度原理
按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
RPC 在许多应用程序中有着广泛应用,尤其是分布式系统和微服务中,一些场景的应用场景包括:
在Go 标准库中包含了net/rpc
包,用于实现 RPC 远程调用,所以不用在引入第三方包了。
下面代码中,实现了一个 RPC 的服务端,用来提供 RPC 服务,通过
rpc.Register(productService)
来注册一个服务,并且通过net.Listen("tcp", ":8899")
监听。
package main
import (
"fmt"
"log"
"net"
"net/rpc"
)
// 定义一个返回体结构
type Product struct {
Id int32
Name string
Desc string
Price float32
}
// 定义了一个 RPC 服务,用于返回产品信息
type ProductService struct{}
// 定义服务的方法, 参数定义需要定义为传递对象的指针
func (ps *ProductService) FetchProduct(Id *int32, reply *Product) error {
p := Product{
Id: *Id,
Name: "钻石王老五",
Desc: "一部手机,能打电话",
Price: 5000.00,
}
// 将产品信息写入 reply 指针
*reply = p
return nil
}
func main() {
// 实例化产品服务
productService := new(ProductService)
// 注册ProductService 为 RPC 服务
rpc.Register(productService)
// 启动监听 8899
listener, err := net.Listen("tcp", ":8899")
if err != nil {
log.Fatal("RPC service start fial: ", err)
return
}
defer listener.Close()
fmt.Println("RPC service is listening on part 8899...")
for {
// 接受客户端连接
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error accepting connection: ", err)
continue
}
// 启动一个新的 goroutine 处理连接
go rpc.ServeConn(conn)
}
}
运行结果:
PS D:\workspaceGo\src\rpc> go run .\rpcServer.go
RPC service is listening on part 8899...
以下是 RPC 客户端代码,实现调用服务端代码,并且获得返回信息。代码中通过
rpc.Dial("tcp", "127.0.0.1:8899")
调用本地端口 8899,通过client.Call("ProductService.FetchProduct", 1, &result)
实现调用,第一个参数为 远程方法名,第二个是方法参数,第三个参数用于接收返回结果。
package main
import (
"fmt"
"log"
"net/rpc"
)
// 定义一个结构体用户接受数据
type Product struct {
Id int32
Name string
Desc string
Price float32
}
func main() {
// 连接到远程 RPC 服务
client, err := rpc.Dial("tcp", "127.0.0.1:8899")
if err != nil {
log.Fatal("Connect to server fail: ", err)
}
defer client.Close()
var result Product
// 调用远程函数 fetchProduct,result 用来获取返回值
err = client.Call("ProductService.FetchProduct", 1, &result)
if err != nil {
log.Fatal("Call remote function fail: ", err)
return
}
fmt.Printf("Result: %v \n", result)
}
运行结果:
PS D:\workspaceGo\src\rpc> go run .\rpcClient.go
Result: {1 钻石王老五 一部手机,能打电话 5000}
PS D:\workspaceGo\src\rpc>
优点(不限于):
缺点(不限于):
现阶段还是对 Go 语言的学习阶段,想必有一些地方考虑的不全面,本文示例全部是亲自手敲代码并且执行通过。
如有问题,还请指教。
评论去告诉我哦!!!一起学习一起进步!!!