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之间挣扎,它们之间的编程理念完全不同.我写了一系列关于在项目工 ...
随机推荐
- ThreadPoolExecutor源码分析二
接上文,这里继续分析源码 private static final int COUNT_BITS = Integer.SIZE - 3; private static final int CAPA ...
- CSS世界中那些说起来很冷的知识
CSS世界中那些说起来很冷的知识 最近读了张鑫旭的新书<CSS世界>收获了不少对CSS的深度理解 也正值个人在公司内部进行部分章节的内容分享,于是顺带着直接把我即将分享的内容先给大家过过目 ...
- cookie的使用和设置
cookie就是服务端通过浏览器端的存储机制,把一些会话相关数据存储在浏览器中.优点:分担服务端的压力,提高了效率,缺点:不安全 生成和请求原理 cookie的生命周期设定以后,哪怕是关闭浏览器,那么 ...
- 开源笔记软件Joplin
Joplin is a free, open source note taking and to-do application, which can handle a large number of ...
- PHP mysqli_get_server_info() 函数
定义和用法 mysqli_get_server_info() 函数返回 MySQL 服务器版本. 语法 mysqli_get_server_info(connection); 实例 返回 MySQL ...
- CF1230 E. Kamil and Making a Stream gcd+暴力
比赛的时候TLE,第二天发现合并方向合并错了~ 改了一下顺序就切了~ 又掉分了,好难过QAQ...... Code: #include <bits/stdc++.h> #define N ...
- 【8.27-模拟赛】remove
题解: 代码: #include<iostream> #include<algorithm> #include<cstdio> #include<cstrin ...
- mac使用brew安装mysql报RROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
使用mac安装mysql安装完后运行 mysql -uroot -p 报了 ERROR 2002 (HY000): Can't connect to local MySQL server throug ...
- dcokee 安装 nginx
1,docker pull openresty/openresty 2, mkdir /opt/local/openresty 等等文件夹 3, docker run --name=" ...
- BigDecimal常用的加减乘除算法、比较大小、不展示多余的零、保存两位小数点
项目中涉及到了BigDecimal的加.减.乘.比较大小.精确度的问题.所以在此总结一下,方便以后复习. //加法 BigDecimal coins = new BigDecimal("0& ...