Go_go-micro微服务框架记录


title: go-go-micro微服务框架记录
categories: Go
tags: [go, 微服务, 框架, 记录]
date: 2019-09-25 14:55:38
comments: false

go-go-micro微服务框架记录

代码实践仓库: https://github.com/yangxuan0261/GoMicro

fork 官方 examples: https://github.com/yangxuan0261/examples


todo

  • a

前篇

  • 官方
    • GitHub - https://github.com/micro/go-micro
    • Micro 博客 - https://micro.mu/blog/
    • 视频介绍 - https://www.youtube.com/watch?v=xspaDovwk34
    • 示例 - https://github.com/micro/examples
      • service - https://github.com/micro/examples/tree/master/service
      • function - https://github.com/micro/examples/tree/master/function
  • go-micro 微服务开发中文手册 - https://www.kancloud.cn/linimbus/go-micro
    • 编写Golang服务 - https://micro.mu/docs/writing-a-go-service.html
    • service.Run() 内部实现 - https://www.kancloud.cn/linimbus/go-micro/529030
    • Micro文档 - https://micro.mu/docs/cn/
    • Micro 中国站教程系列 ( 推荐 ) - https://github.com/micro-in-cn/tutorials
  • golang微服务框架go-micro 入门笔记 - http://www.spring4all.com/common/user/9843
  • 牌类游戏使用微服务重构笔记
    • https://juejin.im/post/5c6bd4b8f265da2dc13c7876
    • micro框架简介 go-micro - http://www.liuhaihua.cn/archives/555708.html
  • 微服务架构详解 - https://zhuanlan.zhihu.com/p/34392808
  • go-micro 框架初探 - https://segmentfault.com/a/1190000017572032
  • 基于Go Micro的微服务架构本地实战 - https://www.wangtianyi.top/blog/2019/03/26/ji-yu-go-microde-wei-fu-wu-jia-gou-ben-di-shi-zhan/
  • 团队准备使用 Go 构建微服务,请问大家有好的框架推荐么? - https://golangtc.com/t/5c75fb7db17a826706f8ada3
  • 基于Go Micro的微服务架构本地实战 - https://www.wangtianyi.top/blog/2019/03/26/ji-yu-go-microde-wei-fu-wu-jia-gou-ben-di-shi-zhan/
  • 一个微服务游戏服务架构 - http://gonet2.github.io/

入门资料

  • Go Micro 入门指南 - https://erikjiang.github.io/2018/07/05/GoMicroGuide/
  • golang微服务框架go-micro 入门笔记1.搭建 go-micro环境 - http://www.spring4all.com/article/15595
  • go微服务框架go-micro深度学习-目录 - https://www.cnblogs.com/li-peng/category/1292629.html
    • https://blog.csdn.net/mi_duo/article/category/8057244

go-micro的组件

架构图:

Go_go-micro微服务框架记录_第1张图片

  • Registry组件:服务发现组件,提供服务发现机制:解析服务名字至服务地址。目前支持的注册中心有consul、etcd、 zookeeper、dns、gossip等
  • Selector组件:构建在Registry之上的客户端智能负载均衡组件,用于Client组件对Registry返回的服务进行智能选择。
  • Broker组件:发布/订阅组件,服务之间基于消息中间件的异步通信方式,默认使用http方式,线上通常使用消息中间件,如Kafka、RabbitMQ等。
  • Transport组件:服务之间同步通信方式。
  • Codec组件:服务之间消息的编码/解码。
  • Server组件:服务主体,该组件基于上面的Registry/Selector/Transport/Broker组件,对外提供一个统一的服务请求入口。
  • Client组件:提供访问微服务的客户端。类似Server组件,它也是通过Registry/Selector/Transport/Broker组件实现查找服务、负载均衡、同步通信、异步消息等功能。

常见的微服务架构图. 出处

Go_go-micro微服务框架记录_第2张图片


micro 默认值

参考: https://gitissue.com/issues/5a20634a9a954719b8dd694e - Q: micro 在 创建并运行之后 时,各个 options/plugin 的默认值是什么?

Q: micro 在 创建并运行之后 时,各个 options/plugin 的默认值是什么?

各个 option/plugin 的默认值是:

  • Service Option: 参见 micro/go-micro/options.go
  • broker: “http”
  • client: “rpcclient”
  • server: “rpcserver”
  • registry: “consul”
  • transport: “http”
  • service id: servicename-uuid.NewUUID()
  • Service Server Option: 参见
    • address: “:0”
    • name: “go-server”
    • version: “1.0.0”
    • Id: uuid.NewUUID()
    • RegisterInterval: 1分钟(微服务自动向 registry 注册的心跳时间)

安装

参考: Go_go-micro入门示例.md, 会生成一个可执行程序

go get -v -u github.com/micro/micro // micro工具包

列出所有服务

λ micro list services
user

获取 user 服务信息

λ micro get service user
service  user

version 2019.09.28.03.28

ID      Address Metadata
user-bf42f3a1-d870-45a6-9c9e-18ba99279dd5       192.168.1.190:59462     registry=mdns,server=mucp,transport=http,broker=http,protocol=mucp

version 2019.09.28.02.04

ID      Address Metadata
user-d9a8a8db-28c6-424f-ab2a-843f80049cea       192.168.1.190:53802     broker=http,protocol=mucp,registry=mdns,server=mucp,transport=http

Endpoint: User.Hello
Metadata: stream=false

Request: {
        name string
}

Response: {
        msg string
}

web 界面

F:\a_link_workspace\go\GoWinEnv_Test01 (master -> origin)
λ micro web // 指令
2019/09/28 15:23:02 HTTP API Listening on [::]:8082 // 默认端口
2019/09/28 15:23:02 Transport [http] Listening on [::]:60676
2019/09/28 15:23:02 Broker [http] Connected to [::]:60677
2019/09/28 15:23:02 Registry [mdns] Registering node: go.micro.web-4832fb75-d027-4b66-a420-09abae8e6ecb

然后打开 http://localhost:8082/registry 就能访问已有的服务

Go_go-micro微服务框架记录_第3张图片

点击 user 查看服务的具体信息

Go_go-micro微服务框架记录_第4张图片


容错

  • https://www.kancloud.cn/linimbus/go-micro/529028

Selector

  • 使用Micro构建有弹性的、高容错的应用 - http://btfak.com/%E5%BE%AE%E6%9C%8D%E5%8A%A1/2016/05/15/resiliency/
  • Go Micro Selector 源码分析 - https://segmentfault.com/a/1190000019802132
  • go-micro 防坑指南 - https://magodo.github.io/go-micro-tips/

用于 负载均衡, 选择节点

参考 github.com/micro/examples/client/dc_selector/dc_selector.go 中的代码


Wrapper

请求拦截, 鉴权等, 合法才调用对应的请求

参考: src/github.com/micro/examples/wrapper


Transport

  • go-micro源码值Transport - http://www.mckee.cn/golang/go-micro/transport

内置支持的几种传输方式在 github.com/micro/go-micro/transport 目录下

默认使用的是 http 作为传输层, 直接 run 一个空服务就可以看出来

f:\a_link_workspace\go\GoWinEnv_Test01\src\GoMicro\test001\srv (master -> origin)
$ go run service.go
2019/10/08 19:46:32 Transport [http] Listening on [::]:58351 // 这里可以看出来
2019/10/08 19:46:32 Broker [http] Connected to [::]:58352
2019/10/08 19:46:32 Registry [mdns] Registering node: user-0f5e2541-bfb2-47a4-a645-e2199a33a2c0

使用 grpc

  • 参考: test_transport_grpc

要求 client - server 必须同时 grpc 方式传输, 否则调用不到

使用非常简单

import (
	"github.com/micro/go-micro/transport/grpc" // 引入 grpc
)

func main() {
	service := micro.NewService(
        ...
		micro.Transport(grpc.NewTransport()), // Transport 指定为 grpc
	)
}
  • 启动是就可以看到 transport 使用的 grpc

    $ go run service.go
    2019/10/08 19:53:58 Transport [grpc] Listening on [::]:58927 // grpc
    2019/10/08 19:53:58 Broker [http] Connected to [::]:58928
    2019/10/08 19:53:58 Registry [mdns] Registering node: user-0c12feb1-56b4-4496-a743-f22cc4ebd8ac
    --- req, name:World ^_^
    

Broker

  • Pub/Sub with Go-Micro - http://adityar.com/go-micro-pub-sub

使用 grpc

参考: test_broker_grpc

import (
    "github.com/micro/go-plugins/broker/grpc"
)

var grpcBroker broker.Broker
func main() {
	cmd.Init()

	grpcBroker = grpc.NewBroker()

	if err := grpcBroker.Init(); err != nil {
		log.Fatalf("Broker Init error: %v", err)
	}
	if err := grpcBroker.Connect(); err != nil {
		log.Fatalf("Broker Connect error: %v", err)
	}

	go sub()

	service := micro.NewService(
		micro.Name("test_broker_grpc_consumer"),
		micro.Broker(grpcBroker),
	)
	...
}


踩坑

  • build 或 run 报错: go: xxx requires

    需要在 GOPATH 目录下使用命令 build 或 run

    E:\ws_go\GoWinEnv (master -> origin)
    $ go build -o mainWithEtcdv3.exe ./src\github.com\micro\micro/main.go ./src\github.com\micro\micro/plugins.go
    
  • verifying ‘protobuf’ malformed record data

    错误: verifying github.com/gogo/[email protected]/go.mod: github.com/gogo/[email protected]/go.mod: malformed record data

    可能引用的版本不对. 参考: https://github.com/golang/go/issues/34394

    go.mod 文件中, 替换合法的版本

    replace github.com/gogo/protobuf v0.0.0-20190410021324-65acae22fc9 => github.com/gogo/protobuf v0.0.0-20190723190241-65acae22fc9d
    

你可能感兴趣的:(Go)