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

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功能多些。但是性能上面差一点。不过也非常强悍了。
企业内部使用的注册中心,已经足够了。

时间: 2024-09-30 05:48:59

grpc(3):使用 golang 开发 grpc 服务端和客户端的相关文章

c++-C++如何开发游戏服务端?

问题描述 C++如何开发游戏服务端? 对于动作类.格斗类游戏,有一个很大的问题,就是需要做碰撞检查和寻路. 如果是单机游戏,客户端有非常非常多的引擎,例如unity3d等. 但如果是网游对战游戏,如果都是客户端判断的话,容易不同步,也容易作弊. 我想请问,服务端做碰撞检查的话,有没有类似的引擎? 如果没有,一般该如何处理? 解决方案 你没有了解过游戏开发.根本不需要将这种表现同步. 动作类游戏,每个目标在服务端就是一个点,二点之间有攻击距离,在攻击距离内就可以攻击,否则不能,客户端发起攻击请求然

.net web api开发app服务端接口,如何处理app版本迭代问题?

问题描述 .net web api开发app服务端接口,如何处理app版本迭代问题? 有人的作法是每发一个新版本,就把前一个版本的接口代码复制一遍然后进行修改,也就是一个大版本对应一套接口代码 解决方案 用webapi的话,可以使用web路由,客户端包含一个参数,映射到服务器上,比如 api.abc.com/v1/userservice/adduser api.abc.com/v2/userservice/adduser 服务器根据版本号走不同的逻辑. 解决方案二: 需要设计好 模块化 这样可以

golang实现简单的udp协议服务端与客户端示例_Golang

本文实例讲述了golang实现简单的udp协议服务端与客户端.分享给大家供大家参考,具体如下: 其实udp没有什么服务端和客户端的概念了,只是一个发一个收而已,只是这样较方便能识别和理解. 服务端: 复制代码 代码如下: package main import (     "fmt"     "net" ) func main() {     // 创建监听     socket, err := net.ListenUDP("udp4", &am

基于OpenLDAP服务端和客户端的SSL/TLS的配置方法

OpenLDAP 是最常用的目录服务之一,它是一个由开源社区及志愿者开发和管理的一个开源项目,提供了目录服务的所有功能,包括目录搜索.身份认证.安全通道.过滤器等等.大多数的 Linux 发行版里面都带有 OpenLDAP 的安装包.OpenLDAP 服务默认使用非加密的 TCP/IP 协议来接收服务的请求,并将查询结果传回到客户端.由于大多数目录服务都是用于系统的安全认证部分比如:用户登录和身份验证,所以它也支持使用基于 SSL/TLS 的加密协议来保证数据传送的保密性和完整性.OpenLDA

Git服务端和客户端安装过程

Git是一个开源的分布式的版本控制系统,由于git分布式体系结构,用户完全可以脱离git服务端在本地查看,编写和提交代码,而且Git的速度也非常快,适合大型,分布式的项目管理.下面是Git服务端和客户端安装的详细步骤. 1.物理环境 Git-server    Centos 5.8   git-1.8.3.tar.gz Git-client    Windows 7    SourceTreesetup.exe 2.Git服务端安装 2.1在http://pan.baidu.com/share/

自己编的SQL服务端加客户端

自己编的SQL服务端加客户端,具有语法解析和简单的数据库操作功能(没有使用MFC的数据库API).界面使用了CJ60Lib类库,语法显示使用了CrystalEdit类 . 登陆帐户:Aministrator: admin admin,可以添加帐户和更改帐户类型. Super User: superuser superuser,可以执行所有的操作. User: user user,只能执行查询功能. 简单功能介绍: 一.资料定义DDL (Data Definition Language) 1.建表

bad file descriptor-使用线程的TCP回射服务端和客户端运行时错误

问题描述 使用线程的TCP回射服务端和客户端运行时错误 服务端serv.c: #include "unp.h" #include <pthread.h> void str_echo(int sockfd) { char buf[MAXLINE]; int n; while(( n = read(sockfd,buf,sizeof(buf)))>=0) { if (n ==0) { printf("client EOF,its use shutdown soc

netty-Netty服务端和客户端的连接保持只有一个

问题描述 Netty服务端和客户端的连接保持只有一个 在实现了服务端和客户端的连接后,客户端每次重启后都和服务端进行重连,导致了一堆的channle的出现.但是只有一个最后一次的channel是有用的,其他都在timeout的时候回收.但是本身建立这么多channel是很费资源的,我如何保证一个客户端只和服务端建立一个长连接,其他都无法建立起来呢.我现在实现的框架是netty,请高手指点 解决方案 http://www.open-open.com/lib/view/open14288901877

聊天室-关于java的聊天程序,分服务端和客户端,请java大神帮我调试一下,我检查没编写错误

问题描述 关于java的聊天程序,分服务端和客户端,请java大神帮我调试一下,我检查没编写错误 //服务端 package chatApp; import java.net.*; import java.io.*; import java.util.*; public class chatserverthree implements Runnable { public static final int PORT=1234; protected ServerSocket listen; stat