咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 404|回复: 0

[Golang] Go语言net包RPC远程调用三种方式http与json-rpc及tcp

[复制链接]
  • TA的每日心情
    无聊
    2019-4-21 13:02
  • 签到天数: 3 天

    [LV.2]圆转纯熟

    发表于 2022-1-1 10:44:03 | 显示全部楼层 |阅读模式
    目录

      一、服务端二、http客户端三、TCP客户端四、json客户端五、运行结果

    rpc有多种调用方式,http、json-rpc、tcp

    一、服务端

    在代码中,启动了三个服务
    1. package main
    2. import (
    3.         "log"
    4.         "net"
    5.         "net/http"
    6.         "net/rpc"
    7.         "net/rpc/jsonrpc"
    8.         "sync"
    9. )
    10. //go对RPC的支持,支持三个级别:TCP、HTTP、JSONRPC
    11. //go的RPC只支持GO开发的服务器与客户端之间的交互,因为采用了gob编码
    12. //注意字段必须是导出
    13. type Params struct {
    14.         Width, Height int
    15. }
    16. type Rect struct{}
    17. //函数必须是导出的
    18. //必须有两个导出类型参数
    19. //第一个参数是接收参数
    20. //第二个参数是返回给客户端参数,必须是指针类型
    21. //函数还要有一个返回值error
    22. func (r *Rect) Area(p Params, ret *int) error {
    23.         *ret = p.Width * p.Height
    24.         return nil
    25. }
    26. func (r *Rect) Perimeter(p Params, ret *int) error {
    27.         *ret = (p.Width + p.Height) * 2
    28.         return nil
    29. }
    30. func main() {
    31.         rect := new(Rect)
    32.         //注册一个rect服务
    33.         rpc.Register(rect)
    34.         var wg sync.WaitGroup
    35.         wg.Add(3)
    36.         go func() {
    37.                 //把服务处理绑定到http协议上
    38.                 rpc.HandleHTTP()
    39.                 err := http.ListenAndServe(":8080", nil)
    40.                 wg.Wait()
    41.                 if err != nil {
    42.                         log.Fatal(err)
    43.                         defer wg.Done()
    44.                 }
    45.         }()
    46.         log.Println("http rpc service start success addr:8080")
    47.         go func() {
    48.                 tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8081")
    49.                 tcplisten, err := net.ListenTCP("tcp", tcpaddr)
    50.                 if err != nil {
    51.                         log.Fatal(err)
    52.                         defer wg.Done()
    53.                 }
    54.                 for {
    55.                         conn, err3 := tcplisten.Accept()
    56.                         if err3 != nil {
    57.                                 continue
    58.                         }
    59.                         go rpc.ServeConn(conn)  
    60.                 }
    61.         }()
    62.         log.Println("tcp rpc service start success addr:8081")
    63.         go func() {
    64.                 tcpaddr, _ := net.ResolveTCPAddr("tcp", "127.0.0.1:8082")
    65.                 tcplisten, err := net.ListenTCP("tcp", tcpaddr)
    66.                 if err != nil {
    67.                         log.Fatal(err)
    68.                         defer wg.Done()
    69.                 }
    70.                 for {
    71.                         conn, err3 := tcplisten.Accept()
    72.                         if err3 != nil {
    73.                                 continue
    74.                         }
    75.                         go jsonrpc.ServeConn(conn)
    76.                 }
    77.         }()
    78.         log.Println("tcp json-rpc service start success addr:8082")
    79.         wg.Wait()
    80. }
    复制代码
    二、http客户端
    1. package main
    2. import (
    3.         "net/rpc"
    4.         "log"
    5.         "fmt"
    6. )
    7. type Params struct {
    8.         Width, Height int
    9. }
    10. func main() {
    11.         //连接远程rpc服务
    12.         rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080")
    13.         if err != nil {
    14.                 log.Fatal(err)
    15.         }
    16.         ret := 0;
    17.         //调用远程方法
    18.         //注意第三个参数是指针类型
    19.         err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret)
    20.         if err2 != nil {
    21.                 log.Fatal(err2)
    22.         }
    23.         fmt.Println(ret)
    24.         err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret)
    25.         if err3 != nil {
    26.                 log.Fatal(err3)
    27.         }
    28.         fmt.Println(ret)
    29. }
    复制代码
    三、TCP客户端
    1. package main
    2. import (
    3.         "net/rpc"
    4.         "fmt"
    5.         "log"
    6. )
    7. type Params struct {
    8.         Width, Height int
    9. }
    10. func main() {
    11.         //连接远程rpc服务
    12.         //这里使用Dial,http方式使用DialHTTP,其他代码都一样
    13.         rpc, err := rpc.Dial("tcp", "127.0.0.1:8081")
    14.         if err != nil {
    15.                 log.Fatal(err)
    16.         }
    17.         ret := 0
    18.         //调用远程方法
    19.         //注意第三个参数是指针类型
    20.         err2 := rpc.Call("Rect.Area", Params{50, 100}, &ret)
    21.         if err2 != nil {
    22.                 log.Fatal(err2)
    23.         }
    24.         fmt.Println(ret)
    25.         err3 := rpc.Call("Rect.Perimeter", Params{50, 100}, &ret)
    26.         if err3 != nil {
    27.                 log.Fatal(err3)
    28.         }
    29.         fmt.Println(ret)
    30. }
    复制代码
    四、json客户端
    1. package main
    2. import (
    3.         "fmt"
    4.         "log"
    5.         "net/rpc/jsonrpc"
    6. )
    7. type Params struct {
    8.         Width, Height int
    9. }
    10. func main() {
    11.         //连接远程rpc服务
    12.         rpc, err := jsonrpc.Dial("tcp", "127.0.0.1:8082")
    13.         if err != nil {
    14.                 log.Fatal(err)
    15.         }
    16.         ret := 0
    17.         //调用远程方法
    18.         //注意第三个参数是指针类型
    19.         err2 := rpc.Call("Rect.Area", Params{150, 100}, &ret)
    20.         if err2 != nil {
    21.                 log.Fatal(err2)
    22.         }
    23.         fmt.Println(ret)
    24.         err3 := rpc.Call("Rect.Perimeter", Params{150, 100}, &ret)
    25.         if err3 != nil {
    26.                 log.Fatal(err3)
    27.         }
    28.         fmt.Println(ret)
    29. }
    复制代码
    五、运行结果

    Go语言net包RPC远程调用三种方式http与json-rpc及tcp-1.png

    Go语言net包RPC远程调用三种方式http与json-rpc及tcp-2.png

    Go语言net包RPC远程调用三种方式http与json-rpc及tcp-3.png

    Go语言net包RPC远程调用三种方式http与json-rpc及tcp-4.png

    以上就是Go语言net包RPC远程调用三种方式http与json-rpc及tcp的详细内容,更多关于Go语言net包RPC远程调用方式的资料请关注咔叽论坛其它相关文章!

    原文地址:https://www.jb51.net/article/229347.htm

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2024-3-29 14:22

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表