Go语言中的RPC调用
首先,说一下目录结构:
一、HttpRPC
1、建立服务文件
/*Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下:
函数必须是导出的(首字母大写)
必须有两个导出类型的参数,
第一个参数是接收的参数,第二个参数是返回给客户端的参数,第二个参数必须是指针类型的
函数还要有一个返回值error
举个例子,正确的RPC函数格式如下:
func (t *T) MethodName(argType T1, replyType *T2) error
*/
package common import (
"errors"
) type Args struct {
A, B float32
}
type Result struct {
Value float32
}
type MathService struct {
} func (s *MathService) Add(args *Args, result *Result) error {
result.Value = args.A + args.B
return nil
} func (s *MathService) Divide(args *Args, result *Result) error {
if args.B == 0 {
return errors.New("除数不能为零!")
}
result.Value = args.A / args.B
return nil
}
2、服务端代码:
package main import (
"fmt"
"net/http"
"net/rpc" "../common"
) func main() {
var ms = new(common.MathService)
rpc.Register(ms)
rpc.HandleHTTP() //将Rpc绑定到HTTP协议上。
fmt.Println("启动服务...")
err := http.ListenAndServe(":1234", nil)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println("服务已停止!")
}
3、客户端调用代码:
package main import (
"fmt"
"net/rpc" "../common"
) func main() {
var args = common.Args{17, 8}
var result = common.Result{} var client, err = rpc.DialHTTP("tcp", "127.0.0.1:1234")
if err != nil {
fmt.Println("连接RPC服务失败:", err)
}
err = client.Call("MathService.Divide", args, &result)
if err != nil {
fmt.Println("调用失败:", err)
}
fmt.Println("调用结果:", result.Value)
}
4、测试:
二、HttpRPC
1、建立服务文件
/*Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下:
函数必须是导出的(首字母大写)
必须有两个导出类型的参数,
第一个参数是接收的参数,第二个参数是返回给客户端的参数,第二个参数必须是指针类型的
函数还要有一个返回值error
举个例子,正确的RPC函数格式如下:
func (t *T) MethodName(argType T1, replyType *T2) error
*/
package common import (
"errors"
) type Args struct {
A, B float32
}
type Result struct {
Value float32
}
type MathService struct {
} func (s *MathService) Add(args *Args, result *Result) error {
result.Value = args.A + args.B
return nil
} func (s *MathService) Divide(args *Args, result *Result) error {
if args.B == 0 {
return errors.New("除数不能为零!")
}
result.Value = args.A / args.B
return nil
}
2、服务端文件
package main import (
"fmt"
"net"
"net/rpc" "../common"
) func main() {
var ms = new(common.MathService) //实例化服务对像
rpc.Register(ms) //注册这个服务
fmt.Println("启动服务...")
var address, _ = net.ResolveTCPAddr("tcp", "127.0.0.1:1234") //定义TCP的服务承载地址
listener, err := net.ListenTCP("tcp", address) //监听TCP连接
if err != nil {
fmt.Println("启动失败!", err)
}
for {
conn, err := listener.Accept() //如果接受到连接
if err != nil {
continue
}
fmt.Println("接收到一个调用请求...")
rpc.ServeConn(conn) //让此rpc绑定到该Tcp连接上。
}
//fmt.Println("服务已停止!")
}
3、客户端代码:
// main.go
package main import (
"fmt"
"net/rpc" "../common"
) func main() {
var client, err = rpc.Dial("tcp", "127.0.0.1:1234")
if err != nil {
fmt.Println("连接不到服务器:", err)
}
var args = common.Args{40, 3}
var result = common.Result{}
fmt.Println("开始调用!")
err = client.Call("MathService.Add", args, &result)
if err != nil {
fmt.Println("调用失败!", err)
}
fmt.Println("调用成功!结果:", result.Value)
}
4、效果:
Go语言中的RPC调用的更多相关文章
- [原创]C/C++语言中,如何在main.c或main.cpp中调用另一个.c文件
C/C++语言中,如何在main.cpp中调用另一个.c文件主要有5种思路: 1.在VS2012 IDE中,将被引用的.c文件后缀名全部修改为.h,然后通过IDE的解决方案资源管理器中鼠标右键单击“头 ...
- C语言中,头文件和源文件的关系(转)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
- C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
- C语言中的static 详细分析
转自:http://blog.csdn.net/keyeagle/article/details/6708077/ google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大 ...
- C语言中system()函数的用法总结(转)
system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait ...
- C语言中malloc()和calloc()c函数用法
C语言中malloc()和calloc()c函数用法 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...
- (七)C语言中的void 和void 指针类型
许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...
- 转:C语言中的static变量和C++静态数据成员(static member)
转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量 a.静态局部变量在函数内定义,生存期为整个程序 ...
- C语言中,数组名作为参数传递给函数时,退化为指针
C语言中,数组名作为参数传递给函数时,退化为指针 C语言中,数组名作为参数传递给函数时,退化为指针:需要数组大小时, 需要一个参数传数组名,另一个传数组大小. 数组名做函数参数时,就相当于指针了. ...
随机推荐
- Select、Poll与Epoll比較
(1)select select最早于1983年出如今4.2BSD中,它通过一个select()系统调用来监视多个文件描写叙述符的数组.当select()返回后,该数组中就绪的文件描写叙述符便会被内核 ...
- JS --- 三目运算符
1.什么是三目运算:(布尔表达式 ? 值0:值1;) 5>3?alert('5大'):alert('3大'); 即 if(5>3){alert('5大')}else{alert('3 ...
- java高分局之jstat命令使用(转)
转自:http://blog.csdn.net/h_025/article/details/52813817 java高分局之jstat命令使用 jstat命令可以查看堆内存各部分的使用量,以及加载类 ...
- java如何直接返回excel到客户端
既然是web项目首先你得拿到响应才能向外部写出,你得拿到响应对象response,1.添加如下两行代码response.setContentType("application/vnd..ms ...
- 【转】Android开发在路上:少去踩坑,多走捷径
本文是我订阅"腾讯大讲堂"公众帐号时,他们推送的一篇文章,但在腾讯大讲堂官网上我并没有找到这篇文章,不过其它专门"爬"公众号文章的网站倒是有.我觉得写的很不错. ...
- ios成长之每日一遍(day 3)
今天要介绍一下更多的控键使用, 当然也会对上一篇说的控件做一个巩固, 所以这一篇涉及到的控键会包括 UIImage.UITextField.UIButton.UILabel.UISwitch.以及 U ...
- client缓存机制
一.简单介绍 client缓存机制不仅能够减轻server端的压力,同一时候也能让用户在网速较慢的情况下获取良好的用户体验. 所以构建一个优秀的APP,缓存是非常重要的一个环节. 二.处理方案 cli ...
- [Android Pro] AndroidStudio IDE界面插件开发(进阶篇之Editor)
转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53885981] 我们开发AndroidStudio ...
- .Net Core中文编码问题整理
1..Net Core Console控制台程序 在.Net Core中默认System.Text中不支持CodePagesEncodingProvider.Instance, System.Text ...
- js转义和反转义html htmlencode htmldecode
文章目录 JS实现HTML标签转义及反转义 用Javascript进行HTML转义 1.HTML转义 2.反转义 3.一个有意思的认识 4.完整版本的代码 其他 [转义字符]HTML 字符实体< ...