grpc(3):使用 golang 开发 grpc 服务端和客户端

简介: 1,关于grpc-gogolang 可以可以做grpc的服务端和客户端。 官网的文档: http://www.grpc.io/docs/quickstart/go.html https://github.com/grpc/grpc-go 和之前写的java的grpc客户端调用相同。也需要使用protobuf的配置文件。 但是golang下面的类库非常的简单,而且g

1,关于grpc-go


golang 可以可以做grpc的服务端和客户端。
官网的文档:
http://www.grpc.io/docs/quickstart/go.html
https://github.com/grpc/grpc-go
和之前写的java的grpc客户端调用相同。也需要使用protobuf的配置文件。
但是golang下面的类库非常的简单,而且golang的性能也很强悍呢。
有些简单的业务逻辑真的可以使用golang进行开发。
性能强悍而且,消耗的资源也很小。java感觉上已经非常的臃肿了。
项目已经上传到github上面了。
https://github.com/freewebsys/grpc-go-demo

2,生成代码


定义proto文件:

syntax = "proto3";
package helloworld;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

3,生成代码,服务端,客户端调用

cd src/helloworld
protoc -I ./ helloworld.proto –go_out=plugins=grpc:.
会生成一个go的helloworld.pb.go 文件。里面包括了grpc的远程调用和protobuf的序列化。

server.go

package main

import (
    "log"
    "net"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
    pb "github.com/freewebsys/grpc-go-demo/src/helloworld"
    "google.golang.org/grpc/reflection"
    "fmt"
)

const (
    port = ":50051"
)

// server is used to implement helloworld.GreeterServer.
type server struct{}

// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    fmt.Println("######### get client request name :"+in.Name)
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}

func main() {
    lis, err := net.Listen("tcp", port)
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    // Register reflection service on gRPC server.
    reflection.Register(s)
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

client.go

package main

import (
    "log"
    "os"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
    pb "github.com/freewebsys/grpc-go-demo/src/helloworld"
)

const (
    address     = "localhost:50051"
    defaultName = "world"
)

func main() {
    // Set up a connection to the server.
    conn, err := grpc.Dial(address, grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)

    // Contact the server and print out its response.
    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }
    r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("####### get server Greeting response: %s", r.Message)
}

4,运行服务端&客户端代码


go run server/main.go

go run clinet/main.go

同时,可以使用java的客户端和服务端 <<===>> go的服务端客户端
相互调用。

5,总结


本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/59483427 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys

grpc 服务的远程调用还是非常的简单的。
但是这个只是一个helloworld ,真正要在企业内部使用的时候还需要一个注册中心。
管理所有的服务。初步计划使用 consul 存储数据。
因为consul 上面集成了非常多的好东西。还有个简单的可视化的界面。
比etcd功能多些。但是性能上面差一点。不过也非常强悍了。
企业内部使用的注册中心,已经足够了。

目录
相关文章
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
112 3
Golang语言之gRPC程序设计示例
|
4月前
|
缓存 弹性计算 API
用 Go 快速开发一个 RESTful API 服务
用 Go 快速开发一个 RESTful API 服务
|
18天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
1月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
39 3
|
1月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
32 3
|
3月前
|
Go API
Golang语言开发注意事项
这篇文章总结了Go语言开发中的注意事项,包括语法细节、注释使用、代码风格、API文档的利用以及如何使用godoc工具来生成文档。
44 2
|
4月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
119 0
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
4月前
|
监控 测试技术 API
|
4月前
|
JSON 编解码 中间件
go-zero代码生成器助你高效开发
go-zero代码生成器助你高效开发
|
4月前
|
Java Go API
我用go-zero开发了第一个线上项目
我用go-zero开发了第一个线上项目