• golang实现rpc方法一net/rpc库


    rpc服务端实现

    使用golang官方的net/rpc库实现RPC方法,使用http作为RPC的载体,通过net/http包监听客户端连接请求。

    1. package main
    2. import (
    3. "errors"
    4. "fmt"
    5. "log"
    6. "net"
    7. "net/http"
    8. "net/rpc"
    9. "os"
    10. )
    11. // 算数运算结构体
    12. type Arith struct {
    13. }
    14. // 算数运算请求结构体
    15. type ArithRequest struct {
    16. A int
    17. B int
    18. }
    19. // 算数运算响应结构体
    20. type ArithResponse struct {
    21. Pro int // 乘积
    22. Quo int // 商
    23. Rem int // 余数
    24. }
    25. // 乘法运算方法
    26. func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {
    27. res.Pro = req.A * req.B
    28. return nil
    29. }
    30. // 除法运算方法
    31. func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {
    32. if req.B == 0 {
    33. return errors.New("divide by zero")
    34. }
    35. res.Quo = req.A / req.B
    36. res.Rem = req.A % req.B
    37. return nil
    38. }
    39. func main() {
    40. rpc.Register(new(Arith)) // 注册rpc服务
    41. rpc.HandleHTTP() // 采用http协议作为rpc载体
    42. lis, err := net.Listen("tcp", "127.0.0.1:8090")
    43. if err != nil {
    44. log.Fatalln("fatal error: ", err)
    45. }
    46. fmt.Fprintf(os.Stdout, "%s", "start connection")
    47. http.Serve(lis, nil)
    48. }

    rpc客户端

    上述服务端程序运行后,将会监听本地的8090端口,我们可以实现一个客户端程序,连接服务端并实现RPC方法调用。

    1. package main
    2. import (
    3. "fmt"
    4. "log"
    5. "net/rpc"
    6. )
    7. // 算数运算请求结构体
    8. type ArithRequest struct {
    9. A int
    10. B int
    11. }
    12. // 算数运算响应结构体
    13. type ArithResponse struct {
    14. Pro int // 乘积
    15. Quo int // 商
    16. Rem int // 余数
    17. }
    18. func main() {
    19. conn, err := rpc.DialHTTP("tcp", "127.0.0.1:8090")
    20. if err != nil {
    21. log.Fatalln("dailing error: ", err)
    22. }
    23. req := ArithRequest{9, 2}
    24. var res ArithResponse
    25. err = conn.Call("Arith.Multiply", req, &res) // 乘法运算
    26. if err != nil {
    27. log.Fatalln("arith error: ", err)
    28. }
    29. fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)
    30. err = conn.Call("Arith.Divide", req, &res)
    31. if err != nil {
    32. log.Fatalln("arith error: ", err)
    33. }
    34. fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Quo, res.Rem)
    35. }

    输出结果:

    server:

    1. [Running] go run "grpc\grpc_server\grpc_server.go"
    2. start connection

    client:

    1. [Running] go run "grpc\grpc_client\grpc_client.go"
    2. 9 * 2 = 18
    3. 9 / 2, quo is 4, rem is 1
    4. [Done] exited with code=0 in 2.093 seconds

  • 相关阅读:
    Stable Diffusion 提示词入门指南
    JMeter—逻辑控制器
    docker-compose 中 depends_on 的作用
    HTML 之 块级元素、行内元素和行内块元素之间的嵌套规则
    ElasticSearch讲解(开源的、高拓展的分布式全文检索引擎)
    如何深度清除Mac电脑缓存?高手们也都用最后这种方法
    docker数据卷和数据卷容器
    Flink中jobmanager、taskmanager、slot、task、subtask、Parallelism的概念
    django项目: ModuleNotFoundError: No module named ‘import_export‘
    线上培训 第19期 | Zemax ZPL 线上培训 招生啦
  • 原文地址:https://blog.csdn.net/zhpCSDN921011/article/details/126900591