栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Go 基础语法4(RPC、Context、包依赖、docker 部署、安装 gin 框架)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Go 基础语法4(RPC、Context、包依赖、docker 部署、安装 gin 框架)

本篇概要:
  • 12. RPC;
    • 12.1 创建 rpc 服务和调用;
    • 12.2 JSONRPC 使用、使用 PHP 调用;
    • 12.3 初步使用 Protobuf 定义自己的 RPC 服务数据;

12. RPC; 12.1 创建 rpc 服务和调用;



GO 自带的 RPC 包

// 包:net/rpc
// 基于tcp,且使用 socket,所以必须创建一个socket服务端(使用tcp的方式)
 lis,err := net.Listen("tcp",":8082") 

// 创建一个struct,基本规则如下
// 1. 方法可导出(首字母大写)
// 2. 方法有两个参数,都是可导出类型或内建类型
// 3. 方法的第二个参数是指针类型:第一个参数是接收的参数,第二个参数是返回的参数(客户端得到的值)
// 4. 函数有error返回
type UserService struct {
}

func(this *UserService) GetUser(userid int ,username *string) error  {
	 if userid == 101{
	 	*username = "vip"
	 }else{
	 	*username = "guest"
	 }
	 return nil
}
 
// 注册:
rpc.Register(new(UserService))

// 接受客户端连接
rpc.Register(new(UserService))
  • 文件 /Users/go/src/com.net/myrpcserver/main.go
package main

import (
	"net"
	"net/rpc"
)

type UserService struct {

}

func(this *UserService) GetUserName(userid int, username *string) error  {
	if userid == 101 {
		*username = "vip"
	} else {
		*username = "guest"
	}
	return nil
}

func main() {
	lis, _ := net.Listen("tcp", ":8082")
	rpc.Register(new(UserService))

	for {
		client, _ :=lis.Accept()
		rpc.ServeConn(client)
	}
}
  • 文件 /Users/go/src/com.net/myclient/main.go
package main

import (
	"fmt"
	"net/rpc"
)

func main() {
	client, _ := rpc.Dial("tcp","127.0.0.1:8082")
	username := ""
	err:=client.Call("UserService.GetUserName", 102, &username)
	if err != nil{
		fmt.Println(err)
		return
	}
	fmt.Println(username)
}
12.2 JSONRPC 使用、使用 PHP 调用;
  • 上一节,只适合 go 与 go 之间的调用(因为它数据编码使用了 go 的 gob 编码格式)
  • 要想让异构系统调用,就需要使用一些通用的编码格式,譬如 JSON

使用 PHP 写个代码连接 socket


    echo "$errstr ($errno)
n"; return; } fwrite($fp, json_encode([ 'method' =>"UserService.GetUserName", 'params' =>[102], 'id' => 0, ])."n"); echo fgets($fp); fclose($fp);
  • 文件 /Users/go/src/com.net/myrpcserver/main.go
package main

import (
	"net"
	"net/rpc"
	"net/jsonrpc"
)

type UserService struct {

}

func(this *UserService) GetUserName(userid int, username *string) error  {
	if userid == 101 {
		*username = "vip"
	} else {
		*username = "guest"
	}
	return nil
}

func main() {
	lis, _ := net.Listen("tcp", ":8082")
	rpc.Register(new(UserService))

	for {
		client, _ :=lis.Accept()
		jsonrpc.ServeConn(client)	// 使用 jsonrpc 调用
	}
}
  • 文件 /Users/go/src/com.net/myclient/main.go
package main

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

func main() {
	client, _ := jsonrpc.Dial("tcp","127.0.0.1:8082")
	username := ""
	err:=client.Call("UserService.GetUserName", 102, &username)
	if err != nil{
		fmt.Println(err)
		return
	}
	fmt.Println(username)
}
12.3 初步使用 Protobuf 定义自己的 RPC 服务数据;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/840590.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号