安装protobuf

在windows下,直接下载release版本
https://github.com/protocolbuffers/protobuf/releases/tag/v3.9.0
然后把bin目录加入到环境变量中
如果是在Linux下,下载对应的版本,然后编译,把编译后的文件加入env中

安装go protobuf plugin

可以参考这里: https://studygolang.com/articles/11343

go get -u github.com/golang/protobuf/protoc-gen-go

编写HelloWorld

用官方的例子: https://github.com/grpc/grpc-go/tree/master/examples/helloworld

目录结构如下:

建立一个grpc-helloworld的目录,然后运行命令: go mod init grpc-helloworld,我们用go mod来管理包。
然后按上图建立相同的文件夹

编写proto文件

编写proto,名字为helloworld/hellowporld.proto

proto的语法:

参考:https://segmentfault.com/a/1190000007917576

官方:https://developers.google.com/protocol-buffers/docs/gotutorial

syntax = "proto3";

option java_multiple_files = true;
option java_outer_classname = "HelloWorldProto"; package helloworld; service Greet {
rpc SayHello (HelloRequest) returns (HelloReply) {}
} message HelloReply {
string message = 1;
} message HelloRequest {
string name = 1;
}

编译proto文件

直接进入 helloworld.proto 所在的文件夹,运行命令

 protoc -I . --go_out=plugins=grpc:. ./helloworld.proto

然后在helloworld.proto同级目录生成了一个 helloworld.pb.go 的文件

编写服务端代码

package main

import (
"context"
pb "grpc-helloworld/helloworld"
"log"
"net" "google.golang.org/grpc"
"google.golang.org/grpc/reflection"
) const (
port = ":8080"
) type server struct{} func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
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)
} //建立 gPRC 服务器,并注册服务
s := grpc.NewServer()
pb.RegisterGreetServer(s, &server{}) log.Println("Server run ...")
//启动服务
if err := s.Serve(lis); err != nil {
log.Fatalf("fail to serve: %v", err)
}
}

编写客户端代码

package main

import (
"context"
pb "grpc-helloworld/helloworld"
"log"
"os"
"time" "google.golang.org/grpc"
) const (
address = "localhost:8080"
defaultName = "world"
) func main() {
//连接到gRPC服务端
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close() //建立客户端
c := pb.NewGreetClient(conn) name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel() // 调用方法
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("couldn not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}

测试运行

1、 打开一个shell,进入 greeter_server 目录,运行  go run main.go

$ go run main.go
2019/07/14 01:35:36 Server run ...

2、在开另外一个shell,进入greeter_client 目录,运行 go run main.go

$ go run main.go
2019/07/14 01:36:10 Greeting: Helloworld

输出了 Helloworld 说明程序运行成功了

Golang gRPC微服务02: helloworld的更多相关文章

  1. Golang gRPC微服务01: 介绍

    gRPC 是什么 gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信.底层通信采用的是 HTTP2 协议.gRPC在设计上使用了 ProtoBuf 这种接口描述语言.这种IDL语言可以 ...

  2. Grpc微服务从零入门

    快速入门 安装 JDK 毫无疑问,要想玩Java,就必须得先装Java JDK,目前公司主要使用的是Oracle JDK 8,安装完成后要配置环境才能正常使用,真蠢,不过也就那么一下下,认了吧.配置方 ...

  3. 经济学人使用Golang构建微服务历程回顾

    关键点 经济学人内容分发系统需要更大的灵活性,将内容传递给日益多样化的数字渠道.为了实现这一灵活性目标并保持高水平的性能和可靠性,平台从一个单体结构过渡到微服务体系结构. 用Go编写的服务是新系统的一 ...

  4. traefik+etcd构建grpc微服务demo

    1.下载安装traefik https://github.com/containous/traefik/releases 2.下载安装etcd3 https://github.com/coreos/e ...

  5. SpringCloud微服务(02):Ribbon和Feign组件,实现服务调用的负载均衡

    本文源码:GitHub·点这里 || GitEE·点这里 一.Ribbon简介 1.基本概念 Ribbon是一个客户端的负载均衡(Load Balancer,简称LB)器,它提供对大量的HTTP和TC ...

  6. python grpc 微服务

    https://realpython.com/python-microservices-grpc/ https://www.manning.com/books/developing-microserv ...

  7. 基于Golang设计一套微服务架构[转]

      article- @嘟嘟噜- May/26/2018 18:35:30 如何基于Golang设计一套微服务架构 微服务(Microservices),这个近几年我们经常听到.那么现在市面上的的微服 ...

  8. golang微服务框架go-micro 入门笔记1.搭建 go-micro环境

    微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...

  9. 清晰架构(Clean Architecture)的Go微服务: 程序结构

    我使用Go和gRPC创建了一个微服务,并试图找出最佳的程序结构,它可以用作我未来程序的模板. 我有Java背景,并发现自己在Java和Go之间挣扎,它们之间的编程理念完全不同.我写了一系列关于在项目工 ...

随机推荐

  1. 01—mybatis开山篇

    什么是 MyBatis ?        MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.M ...

  2. Unity 连接WebSocket(ws://)服务器

    Unity 连接ws,不用任何插件,忙活了一天终于搞定了,一直连接不上,原来是没有添加header, 代码比较简单,直接贴出来普度众生 using System; using System.Net.W ...

  3. JavaScript三元运算符

    ㈠条件运算符也叫做三元运算符 ⑴语法:条件表达式?语句1:语句2: ⑵执行的流程: ①条件运算符在执行时,首先对条件表达式进行求值 ▶如果该值为true,则执行语句1,并返回执行结果 ▶如果该值为fa ...

  4. MFC 下拉框Combo Box

    下拉框常用的事件是Change事件.属性常用:Data(英文;分隔),Sort(是否排序) // OnInitDialog()中 m_cbx.SetCurSel();//设置默认选项 //OnBnCl ...

  5. 7.19T3

    小 X 的图 题目背景及题意 小 X 有一张图,有 n 个点(从 0 开始编号),一开始图里并没有 边,他有时候会向其中添加一条双向边(x 到 y).小 X 会时不时想知 道某两个点是否联通,如果连通 ...

  6. 用python实现的简易记牌器的demo

    实现功能很简单: 初始时 1到10 以及 jkq各 4张,大小王 共两张 只要输入相应的牌号:1到10,例如 >>1     J.K.Q :例如>>j     >> ...

  7. sublime中替换成换行

    ctrl + h 打开替换窗口. replace with里输入 ctrl + shift + enter

  8. ACM之路(14)—— 线段树的日常(上)

    我的线段树简直有毒,各种错误都能忙上半天.做了kuangbin的线段树专题的一半,还有一半留到以后去做. 链接:http://acm.hust.edu.cn/vjudge/contest/view.a ...

  9. JavaScript设计模式—代理模式

    代理模式介绍 使用者无权访问目标对象,中间加代理,通过代理做授权和控制 代理(proxy)是一个对象,它可以用来控制对另外一个对象的访问: 代理对象和本体对象实现了同样的接口,并且会把任何方法调用传递 ...

  10. Raspberry Pi 4B基本设置

    目录 一.SSH登录Raspberry Pi 二.开启VNC服务 三.将SD卡分区扩展 四.修改软件源 一.SSH登录Raspberry Pi 完成系统烧录后,就需要登录Raspberry Pi,此时 ...