0. 前言
本项目参考B站Go语言零基础微服务项目
https://www.bilibili.com/video/BV1po4y1X7hH?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.clickhttps://www.bilibili.com/video/BV1po4y1X7hH?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click
由于Go框架等有更新,因此视频内部分内容已经失效,本文主要基于以下版本
github.com/asim/go-micro/v3 v3.7.1
github.com/gin-gonic/gin v1.7.7
github.com/micro/micro/v3 v3.10.0
google.golang.org/protobuf v1.28.0
1. 前期准备工作
安装gin
go get -u github.com/gin-gonic/gin
安装go-micro v3
// 安装依赖
// 注意 go: module github.com/golang/protobuf is deprecated: Use the "google.golang.org/protobuf" module instead. 即之前的github.com/golang/protobuf路径在go module中被弃用了,现在推荐下面两个路径
go get -u google.golang.org/protobuf/proto
go get -u google.golang.org/protobuf/cmd/protoc-gen-go
//安装go-micro
go get github.com/asim/go-micro/cmd/protoc-gen-micro/v3
go get github.com/micro/micro/v3
go get github.com/asim/go-micro/v3
安装micro
sudo apt install docker.io
sudo docker pull micro/micro
安装consul
-
下载 consul: Consul Versions | HashiCorp Releases 从中选择版本下载。得到 zip 压缩包。
-
解压缩 : 命令:unzip。
-
将解压缩的文件 拷贝至 /usr/local/bin/ —— 可执行文件。
-
终端使用 consul -h 验证 安装是否成功。
ihome文件夹下创建项目文件夹
mkdir ihome
cd ihome
mkdir conf utils bin test view service controller model
其中
-
model:模型。 处理数据库相关的文件。
-
veiw:视图。处理显示相关的文件。 网站:html
-
controller:控制器。处理具体业务! 联动 m 和 v
-
conf 配置文件
-
utils 工具文件
-
test 测试文件
-
service 微服务文件
准备前端文件
将项目view中所有前端文件拷贝到本项目view中
建立errmsg.go 文件,根据给定文档建立错误信息文件,放在utils文件夹下
2. 开始项目
2.1 主页面显示
修改main.go
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.Static("/home", "view")
router.Run(":8080")
}
运行 go run main.go 可以进入主页
配置session
在controller文件夹下建立usr.go文件
func GetSession(ctx *gin.Context) {
//构造未登录
resp := make(map[string]interface{})
resp["errno"] = utils.RECODE_SESSIONERR
resp["errmsg"] = utils.RecodeText(utils.RECODE_SESSIONERR)
ctx.JSON(http.StatusOK, resp)
}
main.go 添加
router.GET("/api/v1.0/session", controller.GetSession)
2.2 微服务之图片验证码
cd service
micro new getCpatcha // 用于创建图片验证码
cd getCaptcha
make init
修改getCaptcha.proto文件 (删掉无用的文件),删改完后如下所示
syntax = "proto3";
package getCaptcha;
option go_package = "./proto;getCaptcha";
service GetCaptcha {
rpc Call(Request) returns (Response) {}
}
message Request {
// 删减为空
}
message Response {
bytes img = 1; // 修改为bytes img用于图片的传输
}
之后
make proto // 这里可能会报错,找不到protoc,可以运行 sudo apt install protobuf-compiler
生成两个文件 getCaptcha.pb.micro.go和getCaptcha.pb.go
修改生成的文件 getCaptcha.pb.micro.go,主要是由于micro改为asim个人项目了(这里很坑)
api "github.com/micro/go-micro/api"
client "github.com/micro/go-micro/client"
server "github.com/micro/go-micro/server"
改为
api "github.com/asim/go-micro/v3/api"
client "github.com/asim/go-micro/v3/client"
server "github.com/asim/go-micro/v3/server"
注意要添加v3,不然汇报路径错误,如下所示
github.com/asim/go-micro/server: github.com/asim/go-micro@v1.18.0: parsing go.mod:
module declares its path as: github.com/micro/go-micro
but was required as: github.com/asim/go-micro
修改service/getCaptcha/main.go
package main
import (
"ihome/service/getCaptcha/handler"
pb "ihome/service/getCaptcha/proto"
"github.com/asim/go-micro/plugins/registry/consul/v3"
service "github.com/asim/go-micro/v3" // "github.com/micro/micro/v3/service"
"github.com/asim/go-micro/v3/logger" // "github.com/micro/micro/v3/service/logger"
"github.com/asim/go-micro/v3/registry"
)
func main() {
// 使用consul作为注册中心注册服务
consulReg := consul.NewRegistry(
registry.Addrs(":8500"),
)
//这里注意v3版本改为service.NewService,其他版本是micro.NewService
srv := service.NewService(
service.Name("getcaptcha"),
service.Registry(consulReg), // 添加
service.Version("latest"),
service.Address("127.0.0.1:12341"), // 添加地址,主要是因为不添加地址,地址会随机变化,可能会导致后面报错
)
// // Register handler
// pb.RegisterGetCaptchaHandler(srv.Server(), new(handler.GetCaptcha))
// Register handler
_ = pb.RegisterGetCaptchaHandler(srv.Server(), new(handler.GetCaptcha))
// Run service
if err := srv.Run(); err != nil {
logger.Fatal(err)
}
}
将getCaptcha/proto复制到ihome文件夹下
usr.go 添加
func GetImageCd(ctx *gin.Context) {
uuid := ctx.Param("name")
consulReg := consul.NewRegistry()
consulService := service.NewService(
service.Registry(consulReg),
)
newClient := getCaptcha.NewGetCaptchaService("getcaptcha", consulService.Client())
resp, err := newClient.Call(context.TODO(), &getCaptcha.Request{})
if err != nil {
fmt.Println("newClient.Call err: ", err)
return
}
var img captcha.Image
json.Unmarshal(resp.Img, &img)
png.Encode(ctx.Writer, img)
fmt.Println("uuid = ", uuid)
}
修改main.go,添加
router.GET("/api/v1.0/imagecode/:uuid", controller.GetImageCd)
运行
打开终端 运行consul : consul agent -dev
vscode 打开终端到service/getCaptcha下运行go run main.go
vsoce 新建终端在ihome下运行 go run main.go
打开浏览器,输入127.0.0.1:8080/home,打开网页检查,如图所示:
到此,微服务之图片验证码完成
未完待续
参考
【1】 go 微服务之go-micro v3+gin_June_King的博客-CSDN博客