gRPC框架使用

gRPC使用protobuf格式数据传输;至于什么是protuf,怎样使用,参见:http://idoubi.cc/2017/12/02/protobuf%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%E6%8C%87%E5%8D%97/

使用protobuf最好在goland上安装protobuf插件,便于检查protobuf的语法错误。


gRPC特点:

  • 基于HTTP/2 
    HTTP/2 提供了连接多路复用、双向流、服务器推送、请求优先级、首部压缩等机制。可以节省带宽、降低TCP链接次数、节省CPU,帮助移动设备延长电池寿命等。gRPC 的协议设计上使用了HTTP2 现有的语义,请求和响应的数据使用HTTP Body 发送,其他的控制信息则用Header 表示。
  • IDL使用ProtoBuf 
    gRPC使用ProtoBuf来定义服务,ProtoBuf是由Google开发的一种数据序列化协议(类似于XML、JSON、hessian)。ProtoBuf能够将数据进行序列化,并广泛应用在数据存储、通信协议等方面。压缩和传输效率高,语法简单,表达力强。
  • 多语言支持(C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java) 
  • gRPC支持多种语言,并能够基于语言自动生成客户端和服务端功能库。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它语言的版本正在积极开发中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等语言,grpc-java已经支持Android开发。

插播me:

工具VS框架:框架就是库,工具可以直接用,不在此基础上开发,框架就是二次开发的工具,哈哈

问:为什么我使用nginx-(nginx是c语言开发的)的时候,不需要学习c语言和使用c语言开发,而我使用grpc的时候,如果选定是用哪个语言的版本

答:nginx是一种工具,也可以说一个库,如果不在nginx上进行二次开发,就不需要使用c,只需要按照配置使用nginx即可。

而使用grpc,需要选好是go语言使用,还是c,那是因为要在grpc上进行开发,在这里grpc就是一个类库,调用需要使用语言去调用。

所有的语言,即所谓的开发语言,都是运行在os上,而os是对硬件及其使用方法的抽象,os提供了很多接口,也就是方法,这些方法可以操作计算机的硬件,我们利用各种语言开发程序,就是为了让计算机硬件给我们干活,开发出来的软件,本身是没有生命的,被编译器编译成二进制文件,在需要系统调用的地方做上标记,当运行的时候,系统调用的时候,就会陷入os内核调用,去调用os的接口。所谓的库-含框架,以及工具,都是我们可以拿来即可用的代码,使用库需要语言调用,使用工具一般只需要配置即可,或者按照工具的使用说明使用即可,如果不对工具进行二次开发,是不需要研究工具是用那种语言开发的。


如何使用gRPC

1.安装好protobuf,客户端和服务端皆需要

扫描二维码关注公众号,回复: 6393637 查看本文章

2.安装好protobuf对go的支持包,客户端和服务端皆需要

3.安装gRPC,客户端和服务端皆需要

4.使用

4.1 server端

package main

import (
	"context"
	"fmt"
	pt "gRPC/client/pbclient"
	"google.golang.org/grpc"
	"net"
)

const(
	post = "127.0.0.1:18881"
)
//实现pb包内,的接口
type Server struct{}

func(this *Server)SayHello(ctx context.Context,in *pt.HelloRequest)(*pt.HelloResponse,error){
	return &pt.HelloResponse{Message:"hello"+in.Name},nil
}

func main(){
	ln,err := net.Listen("tcp",post)
	if err != nil{
		panic(err)
	}

	//1:创造一个rpc服务器
	srv := grpc.NewServer()
	//2:在rpc服务器上注册pb的数据-需要提前想好要提供的rpc调用的方法,写好.proto文件,把proto文件转化成pb.go文件,实现pb.go文件接口
	pt.RegisterHelloServerServer(srv,&Server{})
	//rpc服务器的载体-绑定一个连接
	err = srv.Serve(ln)
	if err != nil {
		fmt.Println(err)
	}
}

syntax = "proto3";
package my_grpc_proto;

service HelloServer{
    //rpc 代理的方法
    rpc SayHello(HelloRequest)returns(HelloResponse){}
}

message HelloRequest{
    string name = 1;
}
message HelloResponse{
    string message = 1;
}
===========client端也需要这个.proto文件,以及需要如下的运行方式=========
在.proto文件所在的目录下,执行以下代码
 protoc --go_out=plugins=grpc:./ *.proto 

4.2client端

package main

import (
	"fmt"
	pt "gRPC/client/pbclient"
	"golang.org/x/net/context"
	"google.golang.org/grpc"
)

const(
	post = "127.0.0.1:18881"
)
func main(){
	//1:发起rpc连接
	conn,err := grpc.Dial(post,grpc.WithInsecure())
	if err!=nil {
		panic(err)
	}
	defer conn.Close()
	//2:生成rpc 连接的客户端
	c := pt.NewHelloServerClient(conn)
	//3:调用pb.go的代理的方法
	resp,err := c.SayHello(context.Background(),&pt.HelloRequest{Name:"yz"})
	if err !=nil {
		fmt.Println(err)
	}

	fmt.Println(resp)
}

猜你喜欢

转载自blog.csdn.net/u013755520/article/details/91372296
今日推荐