0
点赞
收藏
分享

微信扫一扫

ihome(Golang项目 Go-micro+Consul+Gin)

b91bff6ffdb5 2022-03-30 阅读 80

0. 前言

本项目参考B站Go语言零基础微服务项目

https://www.bilibili.com/video/BV1po4y1X7hH?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.clickicon-default.png?t=M276https://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

  1. 下载 consul: Consul Versions | HashiCorp Releases 从中选择版本下载。得到 zip 压缩包。

  2. 解压缩 : 命令:unzip。

  3. 将解压缩的文件 拷贝至 /usr/local/bin/ —— 可执行文件。

  4. 终端使用 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博客 

举报

相关推荐

0 条评论