文档章节

Grpc初体验安装测试

晓阳
 晓阳
发布于 2015/04/19 20:19
字数 1015
阅读 627
收藏 2
点赞 0
评论 1

grpc初体验安装测试

安装

Protobuf-3.0.0

下载链接:http://pan.baidu.com/s/1jGILD4q

安装参考:http://www.tuicool.com/articles/nYZrmi

Git

安装参考:http://www.oschina.net/code/snippet_4873_1376

Maven

安装参考:http://my.oschina.net/pengqiang/blog/275306?p={{currentPage+1}}

编译源码

grpc-java

下载链接:https://github.com/grpc/grpc-java

编译步骤请阅读README.md(因为都是英文的所以请仔细阅读)

grpc-go

下载链接:https://github.com/grpc/grpc-go

Go语言只要下载好放到go环境path下即可

编写proto文件

syntax = "proto3";

 

package proto;

 

option java_package = "io.grpc.ac.proto";

 

service AccountService {

  rpc QueryAll (QueryRequest) returns (QueryResponse) {}

  rpc QueryByPhone (QueryRequestPhone) returns (QueryResponseInt) {}

  rpc QueryByEmail (QueryRequestEmail) returns (QueryResponseInt) {}

  rpc Insert (Account) returns (InsertResponseInt) {}

}

 

message QueryRequestPhone {

  string phone = 1;

}

 

message QueryRequestEmail {

  string email = 1;

}

 

message QueryResponseInt {

  int32 c = 1;

}

 

message InsertResponseInt {

  int32 c = 1;

}

 

message QueryRequest {

  string userName = 1;

}

 

message Account {

  int32 id = 1;

  string userName = 2;

  string password = 3;

  int32 pwdStrong = 4;

  string phone = 5;

  string email = 6;

  string areaCode = 7;

  int32 type = 8;

  int32 enable = 9;

  int32 createTime = 10;

}

 

message QueryResponse {

  repeated Account accounts = 1;

}

编译proto文件-GO

编译链接:https://github.com/grpc/grpc-common/blob/master/go/README.md

编译proto文件-JAVA

编译链接:https://github.com/grpc/grpc-common/blob/master/java/javatutorial.md

 

Mysql

DROP TABLE IF EXISTS `account`;

CREATE TABLE `account` (

  `id` bigint(20) unsigned NOT NULL,

  `username` varchar(20) NOT NULL,

  `password` varchar(32) NOT NULL,

  `pwd_strong` tinyint(3) unsigned NOT NULL,

  `phone` varchar(25) DEFAULT NULL,

  `email` varchar(40) DEFAULT NULL,

  `area_code` varchar(6) DEFAULT NULL,

  `type` tinyint(3) unsigned NOT NULL,

  `enable` tinyint(1) DEFAULT NULL,

  `createtime` bigint(20) unsigned NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `idx_username` (`username`),

  UNIQUE KEY `idx_phone_maill` (`phone`,`email`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

JAVA版服务端、客户端代码

package io.grpc.ac.proto;

 

import io.grpc.ServerImpl;

import io.grpc.ac.proto.Ac.Account;

import io.grpc.ac.proto.Ac.InsertResponseInt;

import io.grpc.ac.proto.Ac.QueryRequest;

import io.grpc.ac.proto.Ac.QueryRequestEmail;

import io.grpc.ac.proto.Ac.QueryRequestPhone;

import io.grpc.ac.proto.Ac.QueryResponse;

import io.grpc.ac.proto.Ac.QueryResponseInt;

import io.grpc.ac.proto.AccountServiceGrpc.AccountService;

import io.grpc.stub.StreamObserver;

import io.grpc.transport.netty.NettyServerBuilder;

 

import java.util.logging.Logger;

 

public class AcServer {

         private static final Logger logger = Logger.getLogger(AcServer.class

                            .getName());

         private int port = 9090;

         private ServerImpl server;

 

         private void start() throws Exception {

                   server = NettyServerBuilder

                                     .forPort(port)

                                     .addService(

                                                        AccountServiceGrpc

                                                                           .bindService(new AccountServiceImpl())).build()

                                     .start();

                   logger.info("Server started, listening on " + port);

                   Runtime.getRuntime().addShutdownHook(new Thread() {

                            @Override

                            public void run() {

                                     System.err

                                                        .println("*** shutting down gRPC server since JVM is shutting down");

                                     AcServer.this.stop();

                                     System.err.println("*** server shut down");

                            }

                   });

         }

 

         private void stop() {

                   if (server != null) {

                            server.shutdown();

                   }

         }

 

         public static void main(String[] args) throws Exception {

                   final AcServer server = new AcServer();

                   server.start();

         }

 

         private class AccountServiceImpl implements AccountService {

 

                   @Override

                   public void queryAll(QueryRequest request,

                                     StreamObserver<QueryResponse> responseObserver) {

                            logger.info(">>> request username = " + request.getUserName());

                            io.grpc.ac.proto.Ac.QueryResponse.Builder builder = QueryResponse

                                               .newBuilder();

                            for (int i = 1; i <= 10; i++) {

                                     Account account = Account.newBuilder().setId(i)

                                                        .setUserName(i + "").setPassword(i + "")

                                                        .setPwdStrong(i).setPhone(i + "").setEmail(i + "")

                                                        .setAreaCode(i + "").setType(i).setEnable(i)

                                                        .setCreateTime(i).build();

                                     builder.addAccounts(account);

                            }

                            QueryResponse queryResponse = builder.build();

                            responseObserver.onValue(queryResponse);

                            responseObserver.onCompleted();

                   }

 

                   @Override

                   public void queryByPhone(QueryRequestPhone request,

                                     StreamObserver<QueryResponseInt> responseObserver) {

                   }

 

                   @Override

                   public void queryByEmail(QueryRequestEmail request,

                                     StreamObserver<QueryResponseInt> responseObserver) {

                   }

 

                   @Override

                   public void insert(Account request,

                                     StreamObserver<InsertResponseInt> responseObserver) {

                   }

 

         }

 

}

 

package io.grpc.ac.proto;

 

import io.grpc.ChannelImpl;

import io.grpc.ac.proto.Ac.Account;

import io.grpc.ac.proto.Ac.QueryRequest;

import io.grpc.ac.proto.Ac.QueryResponse;

import io.grpc.transport.netty.NegotiationType;

import io.grpc.transport.netty.NettyChannelBuilder;

 

import java.util.concurrent.TimeUnit;

import java.util.logging.Level;

import java.util.logging.Logger;

 

public class AcClient {

         private static final Logger logger = Logger.getLogger(AcClient.class

                            .getName());

 

         private final ChannelImpl channel;

         private final AccountServiceGrpc.AccountServiceBlockingStub blockingStub;

 

         public AcClient(String host, int port) {

                   channel = NettyChannelBuilder.forAddress(host, port)

                                     .negotiationType(NegotiationType.PLAINTEXT).build();

                   blockingStub = AccountServiceGrpc.newBlockingStub(channel);

         }

 

         public void shutdown() throws InterruptedException {

                   channel.shutdown().awaitTerminated(5, TimeUnit.SECONDS);

         }

 

         public void queryAll() {

                   try {

                            logger.info(">>> execute query all");

                            QueryRequest queryRequest = QueryRequest.newBuilder()

                                               .setUserName("---test---").build();

                            QueryResponse queryResponse = blockingStub.queryAll(queryRequest);

                            logger.info(">>> query result count = "

                                               + queryResponse.getAccountsCount());

                            for (Account account : queryResponse.getAccountsList()) {

                                     printAccount(account);

                            }

                   } catch (RuntimeException e) {

                            logger.log(Level.WARNING, e.getMessage());

                            return;

                   }

         }

 

         private void printAccount(Account account) {

                   logger.info(String

                                     .format(">>> id[%s] username[%s] password[%s] pwd_strong[%s] phone[%s] email[%s] area_code[%s] type[%s] enable[%s] createtime[%s]",

                                                        account.getId(), account.getUserName(),

                                                        account.getPassword(), account.getPwdStrong(),

                                                        account.getPhone(), account.getEmail(),

                                                        account.getAreaCode(), account.getType(),

                                                        account.getEnable(), account.getCreateTime()));

         }

 

         public static void main(String[] args) throws Exception {

                   AcClient client = new AcClient("127.0.0.1", 9090);

                   try {

                            client.queryAll();

                   } finally {

                            client.shutdown();

                   }

         }

 

}

 

GO版服务端、客户端代码

package service

 

import (

    "ac/dao"

    pb "ac/proto"

    "fmt"

    "golang.org/x/net/context"

)

 

type acService struct{}

 

func (acs *acService) Insert(ctx context.Context, a *pb.Account) (*pb.InsertResponseInt, error) {

    fmt.Println("context = [", ctx, "]")

    fmt.Println("account = [", a, "]")

    return &pb.InsertResponseInt{C: 1}, nil

}

 

func (acs *acService) QueryAll(ctx context.Context, qr *pb.QueryRequest) (*pb.QueryResponse, error) {

    fmt.Println("context = [", ctx, "]")

    fmt.Println("query username = [", qr.UserName, "]")

    var accounts = make([]*pb.Account, dao.Size)

    count := dao.QueryAll(accounts)

    fmt.Println("query count = [", count, "]")

    if count >= len(accounts) {

        return &pb.QueryResponse{Accounts: accounts}, nil

    } else {

        return &pb.QueryResponse{Accounts: accounts[:count]}, nil

    }

}

 

func (acs *acService) QueryByPhone(ctx context.Context, qrp *pb.QueryRequestPhone) (*pb.QueryResponseInt, error) {

    fmt.Println("context = [", ctx, "]")

    fmt.Println("query phone = [", qrp.Phone, "]")

    return &pb.QueryResponseInt{C: 0}, nil

}

 

func (acs *acService) QueryByEmail(ctx context.Context, qre *pb.QueryRequestEmail) (*pb.QueryResponseInt, error) {

    fmt.Println("context = [", ctx, "]")

    fmt.Println("query email = [", qre.Email, "]")

    return &pb.QueryResponseInt{C: 1}, nil

}

 

func NewAcService() *acService {

    s := new(acService)

    return s

}

 

package main

 

import (

    pb "ac-client/proto"

    "fmt"

    "golang.org/x/net/context"

    "google.golang.org/grpc"

    "strconv"

)

 

var (

    ip   = "127.0.0.1"

    port = 9090

)

 

func main() {

    conn, err := grpc.Dial(ip + ":" + strconv.Itoa(port))

    panicErr(err)

    fmt.Println("connect to [", ip, port, "] success")

    defer conn.Close()

    c := pb.NewAccountServiceClient(conn)

 

    //    ci, err := c.Insert(context.Background(), &pb.Account{111, "ysh", "123456", 1, "xxxxx", "ysh3940@sina.com", "314200", 1, 1, 1})

    //    panicErr(err)

    //    fmt.Println("insert return count = ", ci.C)

 

    userName := "test"

    r, err := c.QueryAll(context.Background(), &pb.QueryRequest{UserName: userName})

    panicErr(err)

 

    //    cp, err := c.QueryByPhone(context.Background(), &pb.QueryRequestPhone{Phone: "xxxxx"})

    //    panicErr(err)

    //    fmt.Println("query by phone and c = ", cp.C)

 

    //    ce, err := c.QueryByEmail(context.Background(), &pb.QueryRequestEmail{Email: "ysh3940@sina.com"})

    //    panicErr(err)

    //    fmt.Println("query by email and c = ", ce.C)

 

    accounts := r.Accounts

    if len(accounts) == 0 {

        fmt.Println("query data is nil")

        return

    }

    for i := 0; i < len(accounts); i++ {

        account := accounts[i]

        fmt.Println(i, " : ", account)

    }

}

 

func panicErr(err error) {

    if err != nil {

        panic(err)

    }

}

 

完整测试代码

下载链接:

http://pan.baidu.com/s/1jGBud62

http://pan.baidu.com/s/1dDrl0Gh

http://pan.baidu.com/s/1i3CIabF


© 著作权归作者所有

共有 人打赏支持
晓阳
粉丝 9
博文 69
码字总数 52360
作品 0
徐汇
程序员
加载中

评论(1)

晓阳
晓阳
http://www.molotang.com/articles/51.html
通过阿里云容器服务K8S Ingress Controller实现gRPC服务访问

gRPC简介 gRPC是Google开源的一个高性能RPC通信框架,通过Protocol Buffers作为其IDL,可以在不同语言开发的平台上使用,同时基于HTTP/2协议实现,继而提供了连接多路复用、头部压缩、流控等...

chenqz
06/01
0
0
grpc加密TLS初体验(go、java版本)

grpc加密TLS初体验(go、java版本) grpc-go、java的安装编译helloworld可以参考如下文章 http://my.oschina.net/ysh3940/blog/403591 openssl的安装、生成秘钥证书可以参考如下文章 http:/...

晓阳
2015/06/10
0
9
mac下grpc(golang server + php client)实践

目前微服务这么流行,RPC框架也是百花齐放,本文讲述一下mac下grpc的开发环境搭建,其中server端使用golang,客户端使用php。 服务端 golang grpc安装 这里列出了一个参考,由于grpc在githu...

陈晓风
07/01
0
0
gRPC Windows编译应用

gRPC Windows编译 从github上clone出来后进行cmake的编译,参考上面的文档,需要注意的点: 必须安装所有的依赖,包括Perl,Go,YASM,Git,CMake 不要使用--recursive来递归clone,因为墙的...

水海云
06/20
0
0
grpc实战——构建一个简单的名称解析服务

环境说明: 语言主要用java实现,ide使用的是idea,使用maven作为软件项目管理工具。 说明:本项目源码已发布,点击grpc名称服务可以看到本项目的源码。欢迎大家fork实践体验。 本篇主要是对...

程序员Sunny
05/27
0
0
Spring Boot 使用 gRPC 轻松调用远程方法

gRPC 简介 gRPC 是一个现代开源的高性能 RPC 框架,可以在任何环境下运行。它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡、跟踪、健康检查和认证。它也适用于分布式计...

Anoyi
04/23
0
0
grpc| python 实战 grpc

date: 2018-5-15 22:12:32 title: grpc| python 实战 grpc description: 只要代码可以跑起来, 很多难题都会迎刃而解. so, keep coding and stay hungry. 之前用 swoole 写 server 时就接触过...

daydaygo
05/16
0
0
远程通信协议:从 CORBA 到 gRPC

自从产业界发明机器联网的那一天就已经开始探索最优的远程通信机制。操作系统如 UNIX、Windows 和 Linux 等都有实现远程通信的内部协议,挑战在于如何向开发人员开放一个通信框架。 一、远程...

RiboseYim
2017/10/31
0
0
springboot整合gprc 传输对象

一,grpc简介: GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x +。GRPC与thrift、avro-rpc等其实在总体原理上并没有太大的区别,简而言之...

xiaomin0322
04/26
0
0
Nginx 宣布从 1.13.10 开始正式支持 gRPC

最近,NGINX在其博客宣布,Nginx 宣布从 1.13.10 开始正式支持 gRPC 如下是正文翻译: 今天,我们很高兴在NGINX 1.13.10上分享gRPC流量的第一个本地支持。下一个NGINX Plus版本R15将包含对g...

xiaomin0322
05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java基础——异常

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 异常处理: 可以挖很多个陷阱,但是不要都是一样...

凯哥学堂
22分钟前
0
0
180723-Quick-Task 动态脚本支持框架之结构设计篇

文章链接:https://liuyueyi.github.io/hexblog/2018/07/23/180723-Quick-Task-动态脚本支持框架之结构设计篇/ Quick-Task 动态脚本支持框架之结构设计篇 相关博文: 180702-QuickTask动态脚本...

小灰灰Blog
26分钟前
0
0
SBT 常用开发技巧

SBT 一直以来都是 Scala 开发者不可言说的痛,最主要的原因就是官方文档维护质量较差,没有经过系统的、循序渐进式的整理,导致初学者入门门槛较高。虽然也有其它构建工具可以选择(例如 Mill...

joymufeng
30分钟前
0
0
HBase in Practice - 性能、监控及问题解决

李钰(社区ID:Yu Li),阿里巴巴计算平台事业部高级技术专家,HBase开源社区PMC&committer。开源技术爱好者,主要关注分布式系统设计、大数据基础平台建设等领域。连续4年基于HBase/HDFS设计和...

中国HBase技术社区
31分钟前
1
0
ES18-JAVA API 批量操作

1.批量查询 Multi Get API public static void multiGet() {// 批量查询MultiGetResponse response = getClient().prepareMultiGet().add("my_person", "my_index", "1")// 查......

贾峰uk
35分钟前
0
0
SpringBoot2.0使用health

1,引入actuator <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> 2,application.properties ......

暗中观察
42分钟前
0
0
阿里巴巴Java开发规约

###编程规约 命名风格 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。...

简心
47分钟前
0
0
如何用TypeScript来创建一个简单的Web应用

转载地址 如何用TypeScript来创建一个简单的Web应用 安装TypeScript 获取TypeScript工具的方式: 通过npm(Node.js包管理器) npm install -g typescript 构建你的第一个TypeScript文件 创建...

durban
52分钟前
0
0
分享好友,朋友圈自定义分享链接无效

这个问题是微信6.5.6版本以后,修改了分享规则:分享的连接必须在公众号后台设定的js安全域名内

LM_Mike
今天
0
0
2018年7月23日课程

一、LVS-DR介绍 director分配请求到不同的real server。real server 处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了...

人在艹木中
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部