基于知名微服务框架go-micro开发gRPC应用程序
connygpt 2024-09-29 11:03 9 浏览
go-micro是golang的一个微服务框架。
go-micro各个版本之间的兼容性问题一直被诟病,前几年go-micro更是分化出了两个分支:
一个延续了go-micro,只不过转到了其公司CEO的个人Github仓库中,访问地址:
asim/go-micro: A Go microservices framework (github.com)
一个转向了云原生方向,名字叫Micro,访问地址:
micro/micro: API first cloud platform (github.com)
不过都还是开源的,当前的许可证都是Apache 2.0,不是某些人说的不能商用了,当然无法保证以后不会改许可证。
回到正文,这篇文章将介绍使用go-micro最新版本v4开发gRPC服务的方式。
1、安装protoc
这个工具也称为proto编译器,可以用来生成各种开发语言使用proto协议的代码。
下载地址:https://github.com/protocolbuffers/protobuf/releases
一般下载最新版本就行,注意要符合自己当前的操作系统。
解压后里边有个 protoc.exe ,拷贝到 GOPATH 的 bin 目录下,我这里就是 C:/Users/PC-001/go/bin ,PC-001 是登录当前操作系统的用户名,需要换成你自己的。GOPATH 可以通过执行 go env 查看到。
一般都是把 GOPATH 的 bin 目录添加到环境变量的 PATH 变量中,如果没有,请自行添加上。
2、安装protoc的go-micro插件
需要安装两个插件,它们用来生成 Golang 版本的 proto 协议代码和 go-micro 的 gRPC 代理代码。
执行如下命令,会在 GOPATH 的 bin 目录下生成两个可执行文件:protoc-gen-go.exe 和 protoc-gen-micro.exe。
go install google.golang.org/protobuf/cmd/protoc-gen-go
go install go-micro.dev/v4/cmd/protoc-gen-micro@v4
3、编写proto文件
proto文件是符合Protocol Buffers语言规范的数据交换协议文件,就像以前WebService定义服务时使用的XML文件。现在一般都是用proto3了,这里创建一个名为 hello.proto 的文件,放到项目的proto目录下:
syntax = "proto3";
option go_package="/proto";
package Business;
service Hello {
rpc Say (SayRequest) returns (SayResponse);
}
message SayResponse {
string Message = 1;
}
message SayRequest {
string Name = 1;
}
这个协议很简单,有个名字为Hello的服务,提供一个名字为Say的rpc方法,这个方法有输入输出,输入信息中有一个名为Name的参数,输出信息中有一个名为Message的返回值。
4、生成gRPC代理代码
在项目根目录中执行如下命令,会在proto目录下生成两个文件:hello.pb.go 和 hello.pb.micro.go。
protoc --go_out=. --go_opt=paths=source_relative --micro_out=. --micro_opt=paths=source_relative proto/hello.proto
hello.pb.go 中是输入输出数据类型的Golang定义,hello.pb.micro.go 中是go-micro客户端和服务端的gRPC代理程序。
也可以将文件生成到别的目录中,比如修改 proto 文件中 go_package 的配置为:
option go_package="/business";
然后执行下面的命令,会生成到项目下的business目录中:
protoc --go_out=. --micro_out=. proto/hello.proto
具体这个命令还有哪些参数,可以执行 protoc -help 去探索下,这里就不罗嗦了。
5、编写gRPC服务端程序
这里先上代码:
package main
import (
"context"
"fmt"
"grpchello/proto"
"log"
"time"
"github.com/asim/go-micro/plugins/server/grpc/v4"
"go-micro.dev/v4"
"go-micro.dev/v4/server"
)
type Hello struct{}
func (s *Hello) Say(ctx context.Context, req *proto.SayRequest, rsp *proto.SayResponse) error {
fmt.Println("request:", req.Name)
rsp.Message = "Hello " + req.Name
return nil
}
func main() {
grpcServer := grpc.NewServer()
service := micro.NewService(
micro.Server(grpcServer),
micro.Name("grpchello.service"),
micro.Address("0.0.0.0:8001"),
micro.RegisterTTL(time.Second*30),
micro.RegisterInterval(time.Second*10),
)
// optionally setup command line usage
service.Init()
// Register Handlers
proto.RegisterHelloHandler(service.Server(), &Hello{})
// Run server
if err := service.Run(); err != nil {
log.Fatal(err)
}
}
整个过程如下:
先定义一个名为 Hello 的类型,它去实现hello.pb.micro.go中生成的HelloHandler接口,也就是编写具体的业务实现。
然后通过grpc.NewServer创建一个gRPC服务器,这里决定go-micro底层通信使用gPRC;
然后通过micro.NewService创建一个micro服务,这里需要传入上面创建的grpc server,还要设置服务的名称、监听端口,以及保持服务健康用的TTL和上报周期。go-mico当前默认的服务发现机制是mdns,不用额外部署服务发现工具,不过一般只建议在开发环境使用,生产环境建议使用etcd;
通过上面的步骤对服务进行一些初始化之后,再将Hello类型的实例注册到grpc server;
最后启动服务,就可以开始接客了。
如果直接粘贴这段代码的话,会有很多包没有引用进来,可以通过 go get 获取这些包,也可以执行命令:go mod tidy 来引入需要的包。
这里边还import了一个 grpchello/proto ,这个是我这边项目的mod是 grpchello,gRPC代理程序的package是proto,如果你的不一样,需要修改下。
6、编写gRPC客户端程序
访问gRPC服务也是通过 hello.pb.micro.go 中生成的方法,直接上代码:
package main
import (
"bufio"
"context"
"fmt"
"grpchello/proto"
"os"
"github.com/asim/go-micro/plugins/client/grpc/v4"
"go-micro.dev/v4"
)
func main() {
service := micro.NewService(
micro.Client(grpc.NewClient()),
)
service.Init()
client := proto.NewHelloService("grpchello.service", service.Client())
rsp, err := client.Say(context.TODO(), &proto.SayRequest{Name: "BOSSMA"})
if err != nil {
fmt.Println(err)
}
fmt.Println(rsp)
fmt.Println("按回车键退出程序...")
in := bufio.NewReader(os.Stdin)
_, _, _ = in.ReadLine()
}
上面的程序使用了 grpc.NewClient , 这决定了底层通信采用gRPC;然后再使用生成的代码 proto.NewHelloService 创建客户端代理,这里指定的服务名字必须是服务端注册的名字;最后使用这个客户端代理调用相应的方法。
7、运行程序
可以使用 go run xxx.go 来编译并运行程序。这里为了方便测试,先使用 go build 将它们编译为exe,然后再双击运行。实际运行效果如下:
以上就是本文的主要内容了,完整代码示例已经上传到 Github:https://github.com/bosima/go-demo/tree/main/go-micro-grpc-hello
相关推荐
- 3分钟让你的项目支持AI问答模块,完全开源!
-
hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...
- 干货|程序员的副业挂,12个平台分享
-
1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...
- Github标星超200K,这10个可视化面板你知道几个
-
在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...
- 开箱即用的炫酷中后台前端开源框架第二篇
-
#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...
- 搭建React+AntDeign的开发环境和框架
-
搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...
- 基于.NET 5实现的开源通用权限管理平台
-
??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...
- StreamPark - 大数据流计算引擎
-
使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...
- 教你使用UmiJS框架开发React
-
1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...
- 简单在线流程图工具在用例设计中的运用
-
敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...
- 【开源分享】神奇的大数据实时平台框架,让Flink&Spark开发更简单
-
这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...
- 聊聊规则引擎的调研及实现全过程
-
摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...
- 【开源推荐】Diboot 2.0.5 发布,自动化开发助理
-
一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...
- 微软推出Copilot Actions,使用人工智能自动执行重复性任务
-
IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...
- Electron 使用Selenium和WebDriver
-
本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...
- Quick 'n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具
-
一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...
- 一周热门
- 最近发表
- 标签列表
-
- kubectlsetimage (56)
- mysqlinsertoverwrite (53)
- addcolumn (54)
- helmpackage (54)
- varchar最长多少 (61)
- 类型断言 (53)
- protoc安装 (56)
- jdk20安装教程 (60)
- rpm2cpio (52)
- 控制台打印 (63)
- 401unauthorized (51)
- vuexstore (68)
- druiddatasource (60)
- 企业微信开发文档 (51)
- rendertexture (51)
- speedphp (52)
- gitcommit-am (68)
- bashecho (64)
- str_to_date函数 (58)
- yum下载包及依赖到本地 (72)
- jstree中文api文档 (59)
- mvnw文件 (58)
- rancher安装 (63)
- nginx开机自启 (53)
- .netcore教程 (53)