Golang微服务之rpc和protoBuf

下载 protobuf   https://objects.githubusercontent.com/github-production-release-asset-2e65be/23357588/21b0b800-984f-11eb-9c7f-c44dbb88b1b1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220908%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220908T154549Z&X-Amz-Expires=300&X-Amz-Signature=0e8689bf462568d9a2e8a5e7b7e536e8cb39076fddd682107ff3b84fa8a5c2b9&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=23357588&response-content-disposition=attachment%3B%20filename%3Dprotoc-3.15.8-win64.zip&response-content-type=application%2Foctet-streamicon-default.png?t=M85Bhttps://objects.githubusercontent.com/github-production-release-asset-2e65be/23357588/21b0b800-984f-11eb-9c7f-c44dbb88b1b1?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220908%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220908T154549Z&X-Amz-Expires=300&X-Amz-Signature=0e8689bf462568d9a2e8a5e7b7e536e8cb39076fddd682107ff3b84fa8a5c2b9&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=23357588&response-content-disposition=attachment%3B%20filename%3Dprotoc-3.15.8-win64.zip&response-content-type=application%2Foctet-stream

解压后放到一个固定的位置

配置系统环境变量 

 

如下配置完成 

 

 

Protobuf核心的工具集是C++语言开发的,在官方的protoc编译器中并不支持Go语言。要想基于.proto文件生成相应的Go代码,需要安装相应的插件

安装 go install google.golang.org/protobuf/cmd/protoc-gen-go@latest 

syntax = "proto3";   //版本号

package go.micro.service.product;  //包名

service Product {   //定义的服务
     rpc AddProduct(ProducInfo) returns (ResponseProduct){}
}

message  ProductInfo {   //消息格式
  int64 id = 1;
  string profuct_name = 2;
}

message ResponseProduct {
  int64 product_id =1;
}

这是一个proto文件的基本格式

二、rpc原理

RPC 让远程调用就像本地调用一样,其调用过程可拆解为以下步骤。

① 服务调用方(client)以本地调用方式调用服务;

② client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

③ client stub找到服务地址,并将消息发送到服务端;

④ server 端接收到消息;

⑤ server stub收到消息后进行解码;

⑥ server stub根据解码结果调用本地的服务;

⑦ 本地服务执行并将结果返回给server stub;

⑧ server stub将返回结果打包成能够进行网络传输的消息体;

⑨ 按地址将消息发送至调用方;

⑩ client 端接收到消息;

⑪ client stub收到消息并进行解码;

⑫ 调用方得到最终结果。

使用RPC框架的目标是只需要关心第1步和最后1步,中间的其他步骤统统封装起来,让使用者无需关心。例如社区中各式RPC框架(grpc、thrift等)就是为了让RPC调用更方便。

案例

client端代码

package main

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

func main() {
	client, err := rpc.Dial("tcp", ":1234")
	if err != nil {
		log.Fatal("dialing:", err)

	}
	var replay string
	err = client.Call("HelloService.Hello", "cx", &replay)

	if err != nil {
		log.Fatal(err)

	}
	//打印调用响应
	fmt.Println(replay)

}

server端代码

package main

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

type HelloService struct {
}

//request 请求
//response 相应
//request --> name
//response < --
func (s *HelloService) Hello(request string, response *string) error {
	*response = fmt.Sprintf("hello,%s", request)
	return nil
}

//main里编写server
func main() {
	//把rpc对外暴露的对象注册到rpc框架内部
	rpc.RegisterName("HelloService", &HelloService{})
	//准备socket
	//建立一个唯一的TCP链接
	listener, err := net.Listen("tcp", "localhost:1234")
	if err != nil {
		log.Fatal("ListenTCP error:", err)
	}

	//获取链接
	for {
		coon, err := listener.Accept()
		if err != nil {
			panic(err)
		}
		//每个客户端单独建立一个routine来处理
		go rpc.ServeConn(coon)
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值