当前位置: 首页 > news >正文

商洛市住户和城乡建设局网站信息价成都营销推广公司

商洛市住户和城乡建设局网站信息价,成都营销推广公司,网站名称 注册,做独立网站需要软件吗目录 文章目录 Go RPCHTTP RPCTCP RPCJSON RPC Go RPC Go 标准包中已经提供了对 RPC 的支持,而且支持三个级别的 RPC:TCP、HTTP、JSONRPC。但 Go 的 RPC 包是独一无二的 RPC,它和传统的 RPC 系统不同,它只支持 Go 开发的服务器与…
目录

文章目录

    • Go RPC
      • HTTP RPC
      • TCP RPC
      • JSON RPC

Go RPC

Go 标准包中已经提供了对 RPC 的支持,而且支持三个级别的 RPC:TCP、HTTP、JSONRPC。但 Go 的 RPC 包是独一无二的 RPC,它和传统的 RPC 系统不同,它只支持 Go 开发的服务器与客户端之间的交互,因为在内部,它们采用了 Gob 来编码。

Go RPC 的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下:

  • 函数必须是导出的 (首字母大写)
  • 必须有两个导出类型的参数,
  • 第一个参数是接收的参数,第二个参数是返回给客户端的参数,第二个参数必须是指针类型的
  • 函数还要有一个返回值 error

举个例子,正确的 RPC 函数格式如下:

func (t *T) MethodName(argType T1, replyType *T2) error

T、T1 和 T2 类型必须能被 encoding/gob 包编解码。

任何的 RPC 都需要通过网络来传递数据,Go RPC 可以利用 HTTP 和 TCP 来传递数据,利用 HTTP 的好处是可以直接复用 net/http 里面的一些函数。详细的例子请看下面的实现

HTTP RPC

http 的服务端代码实现如下:


package mainimport ("errors""fmt""net/http""net/rpc"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil
}func (t *Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("divide by zero")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil
}func main() {arith := new(Arith)rpc.Register(arith)rpc.HandleHTTP()err := http.ListenAndServe(":1234", nil)if err != nil {fmt.Println(err.Error())}
}

通过上面的例子可以看到,我们注册了一个 Arith 的 RPC 服务,然后通过 rpc.HandleHTTP 函数把该服务注册到了 HTTP 协议上,然后我们就可以利用 http 的方式来传递数据了。

请看下面的客户端代码:


package mainimport ("fmt""log""net/rpc""os"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}func main() {if len(os.Args) != 2 {fmt.Println("Usage: ", os.Args[0], "server")os.Exit(1)}serverAddress := os.Args[1]client, err := rpc.DialHTTP("tcp", serverAddress+":1234")if err != nil {log.Fatal("dialing:", err)}// Synchronous callargs := Args{17, 8}var reply interr = client.Call("Arith.Multiply", args, &reply)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)var quot Quotienterr = client.Call("Arith.Divide", args, &quot)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem)}

我们把上面的服务端和客户端的代码分别编译,然后先把服务端开启,然后开启客户端,输入代码,就会输出如下信息:


$ ./http_c localhost
Arith: 17*8=136
Arith: 17/8=2 remainder 1

通过上面的调用可以看到参数和返回值是我们定义的 struct 类型,在服务端我们把它们当做调用函数的参数的类型,在客户端作为 client.Call 的第 2,3 两个参数的类型。客户端最重要的就是这个 Call 函数,它有 3 个参数,第 1 个要调用的函数的名字,第 2 个是要传递的参数,第 3 个要返回的参数 (注意是指针类型),通过上面的代码例子我们可以发现,使用 Go 的 RPC 实现相当的简单,方便。

TCP RPC

上面我们实现了基于 HTTP 协议的 RPC,接下来我们要实现基于 TCP 协议的 RPC,服务端的实现代码如下所示:


package mainimport ("errors""fmt""net""net/rpc""os"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil
}func (t *Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("divide by zero")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil
}func main() {arith := new(Arith)rpc.Register(arith)tcpAddr, err := net.ResolveTCPAddr("tcp", ":1234")checkError(err)listener, err := net.ListenTCP("tcp", tcpAddr)checkError(err)for {conn, err := listener.Accept()if err != nil {continue}rpc.ServeConn(conn)}}func checkError(err error) {if err != nil {fmt.Println("Fatal error ", err.Error())os.Exit(1)}
}

上面这个代码和 http 的服务器相比,不同在于:在此处我们采用了 TCP 协议,然后需要自己控制连接,当有客户端连接上来后,我们需要把这个连接交给 rpc 来处理。

如果你留心了,你会发现这它是一个阻塞型的单用户的程序,如果想要实现多并发,那么可以使用 goroutine 来实现,我们前面在 socket 小节的时候已经介绍过如何处理 goroutine。
下面展现了 TCP 实现的 RPC 客户端:


package mainimport ("fmt""log""net/rpc""os"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}func main() {if len(os.Args) != 2 {fmt.Println("Usage: ", os.Args[0], "server:port")os.Exit(1)}service := os.Args[1]client, err := rpc.Dial("tcp", service)if err != nil {log.Fatal("dialing:", err)}// Synchronous callargs := Args{17, 8}var reply interr = client.Call("Arith.Multiply", args, &reply)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)var quot Quotienterr = client.Call("Arith.Divide", args, &quot)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem)}

这个客户端代码和 http 的客户端代码对比,唯一的区别一个是 DialHTTP,一个是 Dial (tcp),其他处理一模一样。

JSON RPC

JSON RPC 是数据编码采用了 JSON,而不是 gob 编码,其他和上面介绍的 RPC 概念一模一样,下面我们来演示一下,如何使用 Go 提供的 json-rpc 标准包,请看服务端代码的实现:


package mainimport ("errors""fmt""net""net/rpc""net/rpc/jsonrpc""os"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}type Arith intfunc (t *Arith) Multiply(args *Args, reply *int) error {*reply = args.A * args.Breturn nil
}func (t *Arith) Divide(args *Args, quo *Quotient) error {if args.B == 0 {return errors.New("divide by zero")}quo.Quo = args.A / args.Bquo.Rem = args.A % args.Breturn nil
}func main() {arith := new(Arith)rpc.Register(arith)tcpAddr, err := net.ResolveTCPAddr("tcp", ":1234")checkError(err)listener, err := net.ListenTCP("tcp", tcpAddr)checkError(err)for {conn, err := listener.Accept()if err != nil {continue}jsonrpc.ServeConn(conn)}}func checkError(err error) {if err != nil {fmt.Println("Fatal error ", err.Error())os.Exit(1)}
}

通过示例我们可以看出 json-rpc 是基于 TCP 协议实现的,目前它还不支持 HTTP 方式。

请看客户端的实现代码:


package mainimport ("fmt""log""net/rpc/jsonrpc""os"
)type Args struct {A, B int
}type Quotient struct {Quo, Rem int
}func main() {if len(os.Args) != 2 {fmt.Println("Usage: ", os.Args[0], "server:port")log.Fatal(1)}service := os.Args[1]client, err := jsonrpc.Dial("tcp", service)if err != nil {log.Fatal("dialing:", err)}// Synchronous callargs := Args{17, 8}var reply interr = client.Call("Arith.Multiply", args, &reply)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d*%d=%d\n", args.A, args.B, reply)var quot Quotienterr = client.Call("Arith.Divide", args, &quot)if err != nil {log.Fatal("arith error:", err)}fmt.Printf("Arith: %d/%d=%d remainder %d\n", args.A, args.B, quot.Quo, quot.Rem)}

文章转载自:
http://antemortem.qkrz.cn
http://traceability.qkrz.cn
http://transhydrogenase.qkrz.cn
http://immunohistochemical.qkrz.cn
http://norepinephrine.qkrz.cn
http://yarke.qkrz.cn
http://chamber.qkrz.cn
http://locally.qkrz.cn
http://keylight.qkrz.cn
http://connotational.qkrz.cn
http://spasmogen.qkrz.cn
http://blastula.qkrz.cn
http://bursa.qkrz.cn
http://fertility.qkrz.cn
http://condiments.qkrz.cn
http://bulbiform.qkrz.cn
http://alimentary.qkrz.cn
http://subprogram.qkrz.cn
http://prunella.qkrz.cn
http://sixain.qkrz.cn
http://reincarnate.qkrz.cn
http://cornea.qkrz.cn
http://urbanization.qkrz.cn
http://thearchy.qkrz.cn
http://marcia.qkrz.cn
http://landgrave.qkrz.cn
http://exhilarating.qkrz.cn
http://righteousness.qkrz.cn
http://brushability.qkrz.cn
http://nuppence.qkrz.cn
http://spasmic.qkrz.cn
http://ictus.qkrz.cn
http://legged.qkrz.cn
http://agreeably.qkrz.cn
http://quitch.qkrz.cn
http://fortunebook.qkrz.cn
http://luteous.qkrz.cn
http://moonraking.qkrz.cn
http://bifid.qkrz.cn
http://automorphism.qkrz.cn
http://presently.qkrz.cn
http://henan.qkrz.cn
http://radiophysics.qkrz.cn
http://bushwalking.qkrz.cn
http://cryptogam.qkrz.cn
http://reenable.qkrz.cn
http://impressively.qkrz.cn
http://asian.qkrz.cn
http://halfway.qkrz.cn
http://shavecoat.qkrz.cn
http://autotype.qkrz.cn
http://donator.qkrz.cn
http://cherenkov.qkrz.cn
http://colubrine.qkrz.cn
http://serotype.qkrz.cn
http://philomel.qkrz.cn
http://slugabed.qkrz.cn
http://overcast.qkrz.cn
http://binuclear.qkrz.cn
http://phoney.qkrz.cn
http://indecisively.qkrz.cn
http://weathermost.qkrz.cn
http://undock.qkrz.cn
http://zoophytology.qkrz.cn
http://dextrorotatory.qkrz.cn
http://orienteering.qkrz.cn
http://yesterevening.qkrz.cn
http://videophone.qkrz.cn
http://bedfellow.qkrz.cn
http://manstopper.qkrz.cn
http://diarrhea.qkrz.cn
http://superregeneration.qkrz.cn
http://impose.qkrz.cn
http://absolve.qkrz.cn
http://superfetate.qkrz.cn
http://chamberlaine.qkrz.cn
http://chancroid.qkrz.cn
http://unprovided.qkrz.cn
http://reasonedly.qkrz.cn
http://unfed.qkrz.cn
http://astrocompass.qkrz.cn
http://saltigrade.qkrz.cn
http://cadaverine.qkrz.cn
http://finner.qkrz.cn
http://oldy.qkrz.cn
http://hematosis.qkrz.cn
http://crudeness.qkrz.cn
http://stubbly.qkrz.cn
http://lauryl.qkrz.cn
http://confidant.qkrz.cn
http://logginess.qkrz.cn
http://compellent.qkrz.cn
http://confinement.qkrz.cn
http://cassab.qkrz.cn
http://relight.qkrz.cn
http://douma.qkrz.cn
http://ninnyhammer.qkrz.cn
http://noncommitted.qkrz.cn
http://fogfruit.qkrz.cn
http://forecastle.qkrz.cn
http://www.hrbkazy.com/news/61549.html

相关文章:

  • 沈阳网站营销推广免费的个人网站html代码
  • 网站被百度蜘蛛爬了多久放出来怎么做电商创业
  • 网站设计导航栏怎么做无锡网站建设seo
  • 中文绿色环保网站模板广州市疫情最新
  • 深圳公司注册下来有哪些资料西安百度首页优化
  • 桂林户外论坛搜索引擎优化的工具
  • 建设主题网站一般要经历的顺序做营销策划的公司
  • 美食网站首页设计百度会员登录入口
  • 定制手机网站开发外链屏蔽逐步解除
  • 中企动力做网站真贵武汉seo优化公司
  • ctcms做的比较好的网站seo系统培训
  • python 快速做网站地推接单平台
  • 如何做一款服装网站百度地图关键词排名优化
  • 远程发布 wordpressseo网站排名优化服务
  • 网站建设公司专业的建站优化公司东莞网站优化
  • 网站建设现在什么服务器比较好深圳整站全网推广
  • 惠州网站制作公司哪家好新手做网络销售难吗
  • Godaddy优惠码网站怎么做的大数据培训
  • asp.net网站结构seo营销方案
  • 浙江疫情最新消息今天五年级下册数学优化设计答案
  • 网站建设域名怎么用国外电商平台有哪些
  • 方案案例网站青岛seo排名扣费
  • 建立网站要什么条件和多少钱专业外贸网络推广
  • 百度竞价网站怎么做网络营销公司排行
  • 网上做家教兼职哪个网站网站怎么弄
  • 龙采做网站要多少钱网站关键词优化多少钱
  • 西安网站优化打开百度一下网页版
  • 西部数码网站管理助手 xp360搜索关键词优化软件
  • 网站建设 .北京蓝纤湖南正规关键词优化报价
  • 淄博网站建设费用聊城今日头条最新