快速实现 RPC 微服务:使用 go-micro 从零开始

news2024/11/18 8:44:22

大家好,我是木川

本文将演示如何从 0 到 1 使用 go-micro 框架实现 RPC 微服务,包括服务端和客户端,客户端发送一个名字到服务端,服务端返回问候语。

一、创建项目

创建项目目录,使用 go mod 初始化

mkdir goexamples
go mod init goexamples

如果当前项目在 GOPATH 目录之外,记得设置

go env -w GO111MODULE=on

目录结构如下:

c3b2e0350db8c83b3347a6306770d00c.png

proto/greeter.proto: 接口定义代码 client.go: 客户端代码 server.go: 服务端代码

一、编写 Proto 文件

go-micro 框架 使用 gRPC 进行 远程过程调用,而 gRPC 使用 Google 开发的数据交换格式和接口定义语言:Protobuf (Protocol Buffers)在不同服务之间进行数据通信、序列化和反序列化。

所以需要编写 Protobuf 文件来定义 Request、Response、Interface,文件扩展名 为 .proto ,用于定义数据结构和消息格式。

编写 greeter.pb 文件,内容如下:

// Proto文件使用的协议版本,新项目建议采用proto3
syntax = "proto3"; 

// 分号前面是包路径(根据包路径自动创建目录),后面是包名
option go_package = "../proto;proto";

// 定义接口
service Greeter {
 rpc Hello(HelloRequest) returns (HelloResponse) {}
}

// 定义输入参数
message HelloRequest {
 string name = 1;
}

// 定义输出参数
message HelloResponse {
 string msg = 1;
}

这段代码是一个简单的示例,用于定义一个名为 "Greeter" 的微服务,该服务包含一个 "Hello" RPC 方法,用于问候。"Request" 和 "Response" 消息定义了方法的输入和输出。

这个Proto文件可以用来生成不同编程语言的代码,以便在客户端和服务端之间实现消息的序列化和反序列化以及RPC通信。

二、生成 Proto Go 代码

要根据 Proto 文件生成 Go 代码,你需要使用 Protobuf 编译器 protoc 以及 Go 的 Protobuf 插件。以下是生成 Go 代码的步骤:

安装 Protobuf 编译器  protoc

前往 Protocol Buffers 的 GitHub Release 页面 https://github.com/protocolbuffers/protobuf/releases,选择适合你操作系统的最新 protoc 版本并下载安装,mac 可以直接用 brew install protobuf 安装

安装完成后,你可以在终端中运行以下命令来验证 protoc 是否成功安装,如果 protoc 成功安装,它将显示安装的版本号

protoc --version

安装 protoc-go

Go 的 Protobuf 插件允许你从 Proto 文件生成 .go 代码,默认会安装到$GOPATH/go/bin目录下

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

安装 protoc-gen-micro

go-micro 框架 protoc-gen-micro 插件 允许你从 Proto 文件生成 .micro.go 代码,默认会安装到$GOPATH/go/bin目录下

go install github.com/go-micro/generator/cmd/protoc-gen-micro@latest

生成 Go 代码

使用 protoc 编译器来生成 Go 代码,假设你有一个名为 greeter.proto 的 Proto 文件,并且你希望生成 Go 代码。cd 到 proto目录,在终端中执行以下命令:

protoc --go_out=. --micro_out=. greeter.proto

--go_out 指定了生成  .go 代码的目标目录,这里使用当前目录(".")--micro_out 指定了生成 .micro.go 代码的目标目录,这里使用当前目录(".")greeter.proto 是你的 Proto 文件名

运行上述命令后,你将在当前目录下看到生成的 Go 代码文件,包括消息结构和序列化/反序列化方法。生成的文件名称将与你的 .proto 文件名称相对应,但会使用 ".pb.go" 作为扩展名。

如果你的 .proto 文件名为 greeter.proto,则生成的 Go 代码文件将是 greeter.pb.go

如果遇到下面这个错误,则需要将 $GOPATH/bin 加入到 path 环境变量

protoc-gen-micro: program not found or is not executable
Please specify a program using absolute path or make sure the program is available in your PATH system variable
vim ~/.bash_profile
export PATH=$PATH:/Users/mc/go/bin // 替换这里的GOPATH目录,比如我的是/Users/mc/go
source ~/.bash_profile

三、编写服务端代码

编写server.go,用于实现服务端:

package main

import (
 "context"
 "log"

 pb "goexamples/proto" // proto 接口定义

 "go-micro.dev/v4" // 引入 go-micro 框架
)

// 定义 Greeting 服务
type GreetingService struct{}

// 实现 proto 接口定义 的 Greeting 服务
func (s *GreetingService) Hello(ctx context.Context, req *pb.HelloRequest, rsp *pb.HelloResponse) error {
 rsp.Msg = "Hello, " + req.Name
 return nil
}

func main() {
 // 创建微服务实例
 service := micro.NewService(
  micro.Name("greeter"),
 )
 // 接收命令行参数  如--server_address
 service.Init()

 // 注册 Greeting 服务
 pb.RegisterGreeterHandler(service.Server(), new(GreetingService))

 // 运行微服务
 if err := service.Run(); err != nil {
  log.Fatal(err)
 }
}

四、编写客户端代码

编写client.go,用于实现客户端:

package main

import (
 "context"
 "fmt"

 pb "goexamples/proto"

 "go-micro.dev/v4"
)

func main() {
 // 创建微服务实例
 service := micro.NewService()

 // 接收命令行参数  如--server_address
 service.Init()

 // 创建 Greeting 客户端存根
 cl := pb.NewGreeterService("greeter", service.Client())

 // 发送请求
 rsp, err := cl.Hello(context.Background(), &pb.HelloRequest{
  Name: "muchuang",
 })
 if err != nil {
  fmt.Println(err)
  return
 }

 fmt.Println(rsp.Msg)
}

五、编译和运行

现在,你可以使用以下命令编译和运行服务端和客户端:

# 下载代码库依赖
go get go-micro.dev/v4
go mod tidy

# 编译服务端
go build -o server server.go

# 编译客户端
go build -o client client.go

# 运行服务端
./server

# 在另一个终端中运行客户端
./client

客户端将发送一个名字到服务端,服务端将返回一个问候语,客户端会打印出这个问候语。这是一个简单的Go-Micro微服务示例,演示了微服务之间的通信。请确保根据你的项目需要和Proto文件定义进行适当的修改。

六、参考

micro 代码生成器:https://github.com/go-micro/generator

go-micro 框架:https://github.com/go-micro/examples/tree/main/greeter

最后给自己的原创 Go 面试小册打个广告,如果你从事 Go 相关开发,欢迎扫码购买,目前 10 元买断,加下面的微信发送支付截图额外赠送一份自己录制的 Go 面试题讲解视频

6cb47944e9eb2b06d6ccad388fdfea76.jpeg

d0fb4011262591b5d215f438265e2915.png

如果对你有帮助,帮我点一下在看或转发,欢迎关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端课后作业

2023.10.20 1、用列表实现如下效果 2、用表格实现如下效果 3、用表单实现如下效果 (学到16集完成)

阿里云10M带宽服务器价格、下载和上传速度限制说明

阿里云服务器10M带宽价格表年付85折,10M带宽一年优惠价5355元,10M带宽下载速度1280KB/秒,即1.25M/秒,阿腾云atengyun.com分享腾讯云服务器10M公网带宽优惠价格、流量价格、上传速度和下载速度限制: 目录 云服务器10M…

【小笔记】为什么语义相似度要用余弦相似度而不用欧式距离?

【学而不思则罔,思而不学则殆】 2023.10.20 语义相似度 相似文本,可以是语义上相似,可以是字符串相似,因此文本相似度包含了语义相似度。 传统的基于统计的文本相似度计算方法,如词频,词出现与否来表示文…

C51--简易报警器设计

硬件清单: C52单片机 震动传感器模块 433M无线发射接受模块 继电器模块 高功率喇叭 杜邦线 振动传感器控制灯: 如何知道是否发生震动?震动后的信号表示又是什么? 振动传感器模块产生震动,输出低电平,绿色指…

苹果cms模板MXone V10.6魔改版短视大气海报样式

苹果cms模板MXone V10.6魔改版短视大气海报样式 安装模板教程说明: 1、将模板压缩包上传到苹果cms程序/template下解压 2、网站板选择mxone 模板目录填写html 3、网站模板选择好之后一定要先访问前台,然后再进入后台设置 4、主题后台地址&#xff1…

1024,毕业后工作的五个月

入职 一晃一下又到了1024,彼时已经成为打工人在写分享了,自己已经搬砖5个月了,总感觉4月份拍毕业照、去川渝毕业旅行看plmm还是在昨天,但五月下旬入职到现在已经5个月了。给大家简单的share一下工作和生活。 在5月初光速毁约ks入…

1024节日快乐!

1024程序员节:向英勇的程序员们致敬! 嘿,大家好!听说今天是个特殊的日子,是程序员的节日!咱们可得好好庆祝一下! 我想先跟大家说声谢谢。是你们的辛勤工作,才让我们的APP、网站、电…

论坛介绍 | COSCon'23 开源治理(G)

众多开源爱好者翘首期盼的开源盛会:第八届中国开源年会(COSCon23)将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是:“开源:川流不息、山海相映”!各位新老朋友们,欢迎到成都&a…

从鸟瞰世界:倾斜摄影技术的地理信息之美

在当今数字时代,地理信息和地图数据的需求与应用已经成为我们生活的一部分。这些数据不仅在导航、地图应用中发挥着关键作用,还在城市规划、环境保护、农业、建筑和许多其他领域中至关重要。而倾斜摄影技术与可视化技术的结合,正为地理信息的…

如何学习深度学习

文章目录 🌟 如何学习深度学习🍊 基础数学知识🍊 编程基础知识🍊 深度学习基础知识🍊 学习资源🍊 总结 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO…

深入理解JNI

文章目录 1.JNI1.1 JNI实现步骤1.2 NDK1.3 CMakeList.txt1.4 HelloWorld 2. native-lib.cpp2.1 调用java静态方法2.2 调用java实例方法2.3 创建引用 3.CMake4.JNI使用全解4.1 JNI 类型签名介绍4.2 abi4.3 so文件 1.JNI 1.1 JNI实现步骤 JNI:全名 Java Native Inte…

软件测试(四)黑盒,白盒,灰盒测试

黑盒测试 测试人员不关注代码内部实现,通过一些科学的手段,向测试系统发起测试数据,关注执行结果是否和预期结果一直 白盒测试 测试人员关注代码内部实现,它一般用来分析程序的内部结构,针对程序的逻辑结构来设计测…

Zookeeper 和 Kafka 工作原理及如何搭建 Zookeeper集群 + Kafka集群

目录 1 Zookeeper 1.1 Zookeeper 定义 1.2 Zookeeper 工作机制 1.3 Zookeeper 特点 1.4 Zookeeper 数据结构 1.5 Zookeeper 应用场景 1.6 Zookeeper 选举机制 2 部署 Zookeeper 集群 2.1 安装前准备 2.2 安装 Zookeeper 3 Kafka 3.1 为什么需要消息队列(…

Linux-git

文章目录 git简介git常用命令配置初始化仓库将文件添加到暂存区将暂存区文件加入版本库对比工作区某文件和暂存区中的区别将暂存区的文件移除但git仍管理将文件移除暂存区并且git不再管理查看版本库切换到之前的版本恢复文件持久化 云端将本地的项目推送到远程仓库将远程仓库的…

使用RestSharp和C#编写程序

以下是一个使用RestSharp和C#编写的爬虫程序,用于爬取www.zhihu.com上的视频。此程序使用了https://www.duoip.cn/get_proxy来获取代理IP。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks…

关于利用webase-front节点控制台一键导出的java项目解析

搭建区块链系统和管理平台分别用的的fisco、webase。 关于我们在利用java开发DApp(去中心化引用),与区块链系统交互,可以用: 1.webase前置服务给开发者提供的api:我们在搭建好fisco链之后,在搭一个webase-front服务,我…

Ceph存储

数据存储类型 块存储 存储设备与客户端主机是 一对一 的关系,块存储设备只能被一个主机挂载使用,数据以块为单位进行存储的,典型代表:硬盘 文件存储 一对多,能被多个主机同时挂载/传输使用,数据以文件的…

新年学新语言Go之四

一、前言 任何编程语言都有类型系统,类型系统解决了数据的存取问题,它决定了使用这个类型需要开辟内存空间大小以及数据是如何存放的,也解决如何读出数据,因为在内存中相同二进制值不同类型的含义是不一样的,关于Go基…

单链表的相关操作(初阶)

链表的概念 链表是线性表的一种,它是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻 辑顺序是通过链表中的指针链接次序实现的 。其实链表就相当于一列火车: 链表的结构跟⽕⻋⻋厢相似,淡季⻋厢会相应减少&#xff0c…

再添合作 | 大势智慧与长沙市规划信息服务中心签订战略合作协议

10月18日,武汉大势智慧科技有限公司(以下简称:大势智慧)与长沙市规划信息服务中心(以下简称)战略合作签约仪式在长沙举行。大势智慧CTO张帆与长沙市规划信息服务中心生产经营总监杨凤京代表双方签署战略合作…