PHP中高级工程师面试重点讲解视频课程
Go快速入门浅显易懂视频教程-基础篇
Go快速入门浅显易懂视频教程-中级篇
go实现http的rpc服务
阅读:1377 分享次数:0

 //http的rpc服务
package main

import (
    "log"
    "net/http"
    "net/rpc"
)

//go对RPC的支持,支持三个级别:TCP、HTTP、JSONRPC
//go的RPC只支持GO开发的服务器与客户端之间的交互,因为采用了gob编码

type Params struct {
    Width, Height int
}

type Rect struct {
}

//求面积
func (r *Rect) Area(p Params, ret *int) error {
    *ret = p.Width * p.Height
    return nil
}

//求长度
func (r *Rect) Perimeter(p Params, ret *int) error {
    *ret = (p.Width + p.Height) * 2
    return nil
}

func main() {
    rect := new(Rect)
    //注册一个rect服务
    rpc.Register(rect)
    //把服务处理绑定到http协议上
    rpc.HandleHTTP()
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal(err)
    }
}

//客户端实现
package main

import (
    "fmt"
    "log"
    "net/rpc"
)

type Params struct {
    Width, Height int
}

func main() {
    //连接远程rpc服务
    rpc, err := rpc.DialHTTP("tcp", "127.0.0.1:8080")
    if err != nil {
        log.Fatal(err)
    }
    ret := 0
    //调用远程方法,注意第三个三叔是指针类型
    err = rpc.Call("Rect.Area", Params{30, 40}, &ret)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(ret)

    err = rpc.Call("Rect.Perimeter", Params{30, 50}, &ret)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(ret)

}

感觉本站内容不错,读后有收获?