Golang gRPC微服务02: helloworld
安装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://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的更多相关文章
- Golang gRPC微服务01: 介绍
gRPC 是什么 gRPC是goole开源的一个RPC框架和库,支持多语言之间的通信.底层通信采用的是 HTTP2 协议.gRPC在设计上使用了 ProtoBuf 这种接口描述语言.这种IDL语言可以 ...
- Grpc微服务从零入门
快速入门 安装 JDK 毫无疑问,要想玩Java,就必须得先装Java JDK,目前公司主要使用的是Oracle JDK 8,安装完成后要配置环境才能正常使用,真蠢,不过也就那么一下下,认了吧.配置方 ...
- 经济学人使用Golang构建微服务历程回顾
关键点 经济学人内容分发系统需要更大的灵活性,将内容传递给日益多样化的数字渠道.为了实现这一灵活性目标并保持高水平的性能和可靠性,平台从一个单体结构过渡到微服务体系结构. 用Go编写的服务是新系统的一 ...
- traefik+etcd构建grpc微服务demo
1.下载安装traefik https://github.com/containous/traefik/releases 2.下载安装etcd3 https://github.com/coreos/e ...
- SpringCloud微服务(02):Ribbon和Feign组件,实现服务调用的负载均衡
本文源码:GitHub·点这里 || GitEE·点这里 一.Ribbon简介 1.基本概念 Ribbon是一个客户端的负载均衡(Load Balancer,简称LB)器,它提供对大量的HTTP和TC ...
- python grpc 微服务
https://realpython.com/python-microservices-grpc/ https://www.manning.com/books/developing-microserv ...
- 基于Golang设计一套微服务架构[转]
article- @嘟嘟噜- May/26/2018 18:35:30 如何基于Golang设计一套微服务架构 微服务(Microservices),这个近几年我们经常听到.那么现在市面上的的微服 ...
- golang微服务框架go-micro 入门笔记1.搭建 go-micro环境
微服务的本质是让专业的人做专业的事情,做出更好的东西. golang具备高并发,静态编译等特性,在性能.安全等方面具备非常大的优势.go-micro是基于golang的微服务编程框架,go-micro ...
- 清晰架构(Clean Architecture)的Go微服务: 程序结构
我使用Go和gRPC创建了一个微服务,并试图找出最佳的程序结构,它可以用作我未来程序的模板. 我有Java背景,并发现自己在Java和Go之间挣扎,它们之间的编程理念完全不同.我写了一系列关于在项目工 ...
随机推荐
- texture2dArray
https://medium.com/@calebfaith/how-to-use-texture-arrays-in-unity-a830ae04c98b http://cdn.imgtec.com ...
- django session 加密cookie型
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引 ...
- Java8-Stream-No.01
import java.util.ArrayList; import java.util.List; import java.util.Optional; public class Streams1 ...
- 【Android-ListView控件】显示信息
效果图 布局文件 layout - activity_main.xml 在主布局添加一个listview控件 <?xml version="1.0" encoding=&qu ...
- Navicat创建数据库或导入数据库
双击点亮数据库 导入数据库 点击开始
- WHU 583 Palindrome ( 回文自动机 && 本质不同的回文串的个数 )
题目链接 题意 : 给你一个串.要你将其划分成两个串.使得左边的串的本质不同回文子串的个数是右边串的两倍.对于每一个这样子的划分.其对答案的贡献就是左边串的长度.现在要你找出所有这样子的划分.并将贡献 ...
- MIME协议(六) -- MIME实例分析
MIME实例分析 了解MIME协议的基本组织结构后,下面用Outlook Express撰写出一封显示效果如图4所示的电子邮件,然后分析该邮件的源文件,以便读者更加深入地了解MIME协议. 1. 启动 ...
- HDU 2177 —— (威佐夫博弈)
威佐夫博弈奇异态(必败态)的条件是a[k]=[k*(sqrt(5.0)+1.0)/2.0].暴力找出必败态即可. 代码如下: #include <stdio.h> #include < ...
- Namenode服务挂
BUG修复:HDFS-13112 这两天排查了小集群Crash的问题,这里先总结下这两天排查的结果 一.查看日志 首先查看了Namenode Crash的时候的日志 (一)以下是patch hdfs- ...
- 预处理、const、static与sizeof-使用宏定义得到一个数组所含的元素个数
1:代码如下: #define ARR_SIZE(a) (sizeof((a)) / sizeof((a[0])))