前言
本学习笔记写作于 2025年6月10日 (更新中),学习来源csdn、github、知乎、腾讯云等网站,安装成功后写作,希望给后来的朋友提供一些帮助,内容可能较长,因为go-micro官方经常在更新,所以教程可能有一定的时限性,希望能详细一些让大家明白,希望就算是小白也能跟着我的笔记顺利安装成功。
几乎全程配图,配代码,适合新手小白学习。
问题提示
Linux端如果出现micro指令无效,提示安装micro的、找不到micro指令,可能是缺少了install步骤,github并未提示。跳转5.4.Linux端测试。
Windows端如果出现go-micro、micro指令失效的,可能是指令错误,github官网指令并不适用Windows端,指令应该从micro new service sername 更改为go-micro.exe new service sername。详情可看5.5.Windows端测试。
简述
主要内容包含:
①对我安装时的应用、环境的版本陈列
②protobufv21.11 的安装
③protoc-gen-go 插件的安装
④grpc 安装
⑤go-micro v5 安装
⑥gin 框架安装
⑦consul 下载安装
⑧go-micro、gin、consul结合的测试用例
一.各项应用版本
在教程开始前,列出我的 各项环境版本 ,以对各位提供一个参考。
应用 | 版本 |
系统 | Linux |
操作系统 | Ubuntu 24.4.2 |
goland | 2024.4 |
go | 1.24.4 |
protobuf | v21.11-all |
protoc-gen-go | protoc-gen-go-1-3-dev |
grpc | 1.37.0 |
go-micro | v5 |
二.安装protobuf
2.1.安装依赖库
下载 protobuf 之前,需要先安装相关依赖库,包括 autoconf , automake , libtool , curl , make , g++ , unzip 。安装命令如下:
sudo apt-get install autoconf automake libtool curl make g++ unzip -y
2.2.下载protobuf
前往 github 的 protobuf 安装对应网页,下载自己想要的protobuf版本就好。我选择的是Protocol Buffers v21.11,因为看到很多教程都是这个,链接如下:
到了对应的页面之后,在对应版本下有 Assets 这个下拉列表选项,点击后选择你想要的版本。其中有针对 java 等语言的单语言版本,这里我们选择适用所有语言的 protobuf-all-21.11,单击后即可下载。
下载成功后,将下载好的文件解压。解压可以直接鼠标右键提取,或者使用 unzip filename.zip 指令来解压,我选择的解压路径是我的 MyWorkSpace/src/github.com 文件夹下。此处的路径可以自选,只提供参考,如果src等目录不存在,请自行新建。
2.3.进行安装检测并生成自动安装脚本
右键文件夹,选择在终端打开或者使用 ctrl+alt+t 快捷键唤起终端(如果使用快捷键唤起,还需要进入到对应文件夹的路径下,从根目录按照你的路径,使用 cd 命令 即可,例如 cd /home/username/WorkSpace/protobuf
1.安装检测
在终端输入以下指令,对 protobuf 的安装进行检测。
./autogen.sh
2.生成自动安装脚本
输入以下指令,生成自动安装脚本,并指定位置为 /usr/local/protobuf
./configure --prefix=/usr/local/protobuf
3.进行编译c代码
使用 make 指令,编译c代码。这一步骤时间较长
make
4.进行检查
输入 make check 指令,进行检查。这一步骤时间较长
make check
5.进行安装
输入 sudo make install 指令,进行安装。
sudo make install
(注意)使用 sudo 命令授权进行安装,输入密码不会显示,按你的密码输入后回车即可。
6.添加相关路径
(提示)考虑到很多人不习惯vim,此处推荐安装gedit。gedit是Linux系统中的一个图形化文本编辑器,类似于windows的记事本,界面简单易用。
输入 gedit ,根据提示安装 gedit ,输入 sudo apt install gedit 安装 gedit。
sudo apt install gedit
是否希望继续执行处输入y,继续安装。
添加相关路径,使用下方指令,修改对应位置的profile文件,将下方内容,复制粘贴进去。
指令:
sudo gedit /etc/profile
添加内容如下:
# (动态库搜索路径) 程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
# (静态库搜索路径) 程序编译期间查找动态链接库时指定查找共享库的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
# 执⾏程序搜索路径
export PATH=$PATH:/usr/local/protobuf/bin/
# c程序头文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
# c++程序头文件搜索路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
# pkg-config路径
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/
相关配图:
7.重新加载文件
打开终端,依次输入以下指令。
cd /etc
source profile
(补充)source 命令是Linux系统中的一个内置命令,用于在当前的bash环境中读取并执行指定文件中的命令。这个命令在Shell编程中非常有用,尤其是当需要立即应用对环境变量或配置文件所做的更改时。 |
8.验证安装
输入 protoc --version ,看到版本即为 安装成功 。
三.安装protoc-gen-go
3.1.安装protoc的go语言插件
输入下列命令安装
sudo apt install golang-goprotobuf-dev
3.2.测试用例
1.在项目下新建一个目录,命名为 pb
2.在pb目录下新建一个文件,命名为 test01.proto
内容如下
syntax = "proto3"; //指定版本信息,不指定会报错
package pb; //后期生成go文件的包名
//message为关键字,作用为定义一种消息类型
message Person{
// 名字
string name = 1;
// 年龄
int32 age = 2 ;
}
3.在终端输入 cd pb ,输入下列命令将proto文件编译为go文件。
protoc --go_out=./ *proto
#此处有2个空格,需要注意protoc(空格)--go_out=./ (空格)*proto
能正常生成对应的.go文件,则证明 安装成功 。
四、安装grpc
4.1.安装grpc
输入下列指令,进行安装
go get -u -v google.golang.org/grpc
4.2.可能遇到的问题
(警告) 如果因为网络问题,出现错误,其中包括" connect "、"refused"、"abort"等字样,优先修改GOPROXY,输入下列指令。
go env -w GOPROXY=https://goproxy.io
更改GOPROXY之后,重新执行上方安装grpc指令即可。
4.3.安装protoc-gen-go-grpc插件
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
4.4.修改系统环境变量
export PATH="$PATH:$(go env GOPATH)/bin"
4.5.测试用例
在pb目录创建一个文件,名为 grpc_test01.proto ,或者自己命名一个。内容如下
syntax = "proto3";
option go_package = "/grpc";//grpc需要的option
service SayHello {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1 ;
}
message HelloResponse {
string message = 1;
}
其中 option go_package = "/grpc"; 为略微新的grpc内容,如果没有加,可能会提示need add go_package
在终端输入以下命令
protoc --go_out=. --go-grpc_out=. *.proto
在当前路径下,出现 grpc文件夹,并且形成了相对应的.go文件,则为 成功 。
五.安装go-micro v5
(注意)很多以前的版本教学无法使用,最好是去看一下官方链接,根据它的readme文件下载安装最为合适。对官方链接不感兴趣可直接跟着我的教学 5.1.获取go-micro 进行即可。
官网链接
我个人体验过的一些教程。go get github.com/micro/micro/v2,或v3,v4等,以及一些中文文档,信息都比较旧,会安装出一些问题,仅代表个人体验发言。
按我了解,有一个说法是自从v3版本后,go-micro个人asim与公司似乎分开了,分为了asim/go-micro与micro/go-micro两种版本,asim的才是正确的。但我去了最新的asim个人页面,点击的go-micro版本路径同样为micro/go-micro,应该是不存在asim/go-micro了,所以不用纠结这两个版本。有错误请纠正。
asim (Asim Aslam)https://github.com/asim
Go-Micro官方Readme配图
5.1.获取go-micro
输入指令:
go get "go-micro.dev/v5"
5.2.测试用例
在项目根目录下新建一个.go文件,名为demo1 ,内容如下
package main
import (
"go-micro.dev/v5"
"google.org/x/net/context"
)
type Request struct {
Name string `json:"name"`
}
type Response struct {
Message string `json:"message"`
}
type Say struct{}
func (h *Say) Hello(ctx context.Context, req *Request, rsp *Response) error {
rsp.Message = "Hello " + req.Name
return nil
}
func main() {
// create the service
//service := micro.New("helloworld")
service := micro.NewService(
micro.Name("helloworld"),
micro.Address(":8080"),
)
// register handler
service.Handle(new(Say))
// run the service
service.Run()
}
右键运行该go文件,或者点击上方绿色小执行按钮,或者在goland终端输入 go run demo1.go 。
(注意)如果使用指令运行文件,应该查看当前终端所处的路径对不对,输入 ls 指令,能否看到需要的 demo1.go 文件。不对的话,使用cd命令调整,cd .. 可以返回上一层。
此时下方终端在运行,需要重新打开一个终端,输入下方内容。(一次性复制粘贴进去,并不是分次输入)
curl -XPOST \
-H 'Content-Type: application/json' \
-H 'Micro-Endpoint: Say.Hello' \
-d '{"name": "alice"}' \
http://localhost:8080
收到返回的message ,hello alice,成功 。
5.3.获取Micro工具
Micro 是一个用于Go-micro开发的工具包。它为在云端构建服务提供了基础。在go-micro框架的基础上,官方引入了一系列工具,以简化服务的提供与使用,这个工具包就是micro。
官方链接
micro/micro: A microservices toolkit
1.获取micro
输入以下指令,获取micro。
go get github.com/micro/micro/v5@latest
5.4.Linux测试Micro工具
1.安装micro!!
(警告)Linux端如果出现 micro指令无效 ,提示安装micro 的(此处提示的micro也并非go-micro,而是一款文本编辑器,不要下载),一般是遇到这个错误了,我自身卡在这里一段时间。官网并没有这一步骤,其他教程的指令也并不适用,灵机一动尝试install后发现指令成功。
Linux端放在Windows端之前也是因为Linux端的问题更不容易被发现,且并没有什么提示。
输入以下指令,即可安装micro。
go install github.com/micro/micro/v5@latest
2.测试效果
输入micro,未出现micro指令错误提示。输入micro --help,出现了相关提示,即为安装成功。
micro new service servicename这个指令在linux端已经落后了,会出现提示为:service already exists。所以应该采取下方的指令。
3.新指令格式
现在的指令应该是下面这样的。直接输入 micro new 后跟你想创建的服务名即可。此处以服务名为t66为例。
micro new servicename
5.5.Windows端测试Micro工具
windows端需要检查在你的GOPATH/BIN下面,是否因为之前的指令下载好了一个go-micro.exe文件,如果有的话,即为下载成功。
1.指令格式
windows端的指令由 go-micro new service servicename 变为了go-micro.exe new service servicename了,使用旧指令可能会提示指令无效之类的。
go-micro.exe new service sevname
5.6.官方文档
不愿意看的可以通过侧边目录直接跳转到下一环节。
选修
六、Go-Micro与gin框架、consul结合
6.1.gin框架安装
在终端输入以下命令,获取gin框架
go get github.com/gin-gonic/gin
6.2.consul下载
访问 consul 下载页面,下载对应版本的压缩包。
右键解压下载好的压缩包名 或 使用 unzip filename.zip 命令解压压缩包。(此处filename为你的压缩包的名称)
打开终端,使用命令将其复制一份到指定位置
sudo cp consul /usr/bin
输入指令consul -v ,若出现版本,则 安装成功 。
逐次输入下列命令,在 /etc 目录下创建 consul.d 目录
cd /etc
sudo mkdir consul.d
6.3.运行consul server模式测试
输入指令 ip addr ,查看自身ip地址。
输入以下命令,启动consul的server模式。
consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=n1 -bind=你的ip地址 -ui -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0
(注意)-bind=后方的ip地址,要换成你的ip地址。
相关参数:
记得先去/etc下创建consul.d目录
-server
: 定义agent运行在server模式
-bootstrap-expect
:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用
-bind
:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-node
:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-ui
: 启动web界面 :8500
-rejoin
:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-config-dir
:配置文件目录,里面所有以.json结尾的文件都会被加载
-client
:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
data-dir
:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
6.3.1.访问consul页面,查看consul
地址为:你的ip地址:8500
若成功看到consul,则为consul安装成功,并以server模式运行成功。
6.4.go-micro结合consul、gin
1.在根目录创建一个.go文件,名为demo3。内容如下
package main
import (
"github.com/gin-gonic/gin"
"go-micro.dev/v5/registry"
"go-micro.dev/v5/registry/consul"
"go-micro.dev/v5/web"
"net/http"
)
func main() {
// 添加consul地址
cr := consul.NewConsulRegistry(
registry.Addrs("127.0.0.1:8500"))
// 使用gin作为router
router := gin.Default()
router.GET("/user", func(c *gin.Context) {
c.String(http.StatusOK, "welcome to user page")
})
// 初始化go micro
server := web.NewService(
web.Name("demo3"), // 当前微服务服务名
web.Registry(cr), // 注册到consul
web.Address(":8086"), // 端口
web.Metadata(map[string]string{"protocol": "http"}), // 元信息
web.Handler(router)) // 路由
_ = server.Run()
}
(提示)其中consul.NewConsulRegistry()在v4版本为consul.NewRegistry(),不同版本可能有些许不同。如果在未来的新版本报错,可以尝试删除上方对应的imports,根据报错的提示,进行新的引入或者go mod tidy 。
2.访问 localhost:8086/user ,查看测试用例。出现welcome to user page,证明使用gin作为路由成功。
3.访问 localhost:8500 ,查看consul页面,出现 demo3 ,证明 注册微服务demo3成功 。
6.5.优雅的关闭consul
重新新打开一个终端,因为当时以server模式启动的consul还在挂着,输入 consul leave 命令优雅的关闭consul。
你如果使用ctrl c 强行杀掉进程,集群中的其他成员会检测到该节点失效,该成员的健康状态会被标记为为吸纳,但是不会从目录中移除,consul会自动尝试对这些实效的节点重新连接。所以优雅的离开是很重要的,可以避免引起潜在的可用性故障影响达成一致性协议。
总结
这次学习增加了我多尝试一下去看官方文档的能力,学习过程中找到的大部分教程已经不太适用,较为痛苦,但是也是一次不错的体验。希望能给后来的朋友提供一些帮助。如果觉得对你有帮助,请给我点个赞或者关注吧。