精华内容
下载资源
问答
  • go-micro

    2020-12-27 12:57:59
    由于go语言和go-micro框架迭代迅速,我在学习go-micro框架查询资料时,经常因为过时的资料遇到莫名其妙的错误。因此我决心根据自己的实践与摸索,编写一个适合go-micro V2版本切实可用的go-micro开发指南,重点记录...

    前言

    由于go语言和go-micro框架迭代迅速,我在学习go-micro框架查询资料时,经常因为过时的资料遇到莫名其妙的错误。因此我决心根据自己的实践与摸索,编写一个适合go-micro V2版本切实可用的go-micro开发指南,重点记录开发的流程各类问题的解决方案。希望这份笔记能够帮助以后的自己,和所有看到它的朋友实现以下目标:

    1. 顺利搭建一个当前版本下被反复验证可行的go-micro系统
    2. 通过一系列插件引入对go-micro框架全貌有大致理解
    3. 在笔记中快速检索到go-micro框架的各种搭建问题解决方案

    注意:本章主要是使用micro工具自动生成第一个微服务,并用客户端调用它,不会详细讲解其中的代码,具体代码逻辑以及如何手写项目,请看第二章。


    一、Go-Micro是什么?

    以下内容摘抄自:http://www.topgoer.com

    1.go-micro简介

    Go Micro是一个插件化的基础框架,基于此可以构建微服务,Micro的设计哲学是可插拔的插件化架构
    在架构之外,它默认实现了consul作为服务发现(2019年源码修改了默认使用mdns),通过http进行通信,通过protobuf和json进行编解码

    2.go-micro的主要功能

    服务发现: 自动服务注册和名称解析。服务发现是微服务开发的核心。当服务A需要与服务B通话时,它需要该服务的位置。默认发现机制是多播DNS(mdns),一种零配置系统。您可以选择使用SWIM协议为p2p网络设置八卦,或者为弹性云原生设置设置consul
    负载均衡: 基于服务发现构建的客户端负载均衡。一旦我们获得了服务的任意数量实例的地址,我们现在需要一种方法来决定要路由到哪个节点。我们使用随机散列负载均衡来提供跨服务的均匀分布,并在出现问题时重试不同的节点
    消息编码: 基于内容类型的动态消息编码。客户端和服务器将使用编解码器和内容类型为您无缝编码和解码Go类型。可以编码任何种类的消息并从不同的客户端发送。客户端和服务器默认处理此问题。这包括默认的protobuf和json
    请求/响应: 基于RPC的请求/响应,支持双向流。我们提供了同步通信的抽象。对服务的请求将自动解决,负载平衡,拨号和流式传输。启用tls时,默认传输为http / 1.1或http2 Async
    Messaging: PubSub是异步通信和事件驱动架构的一流公民。事件通知是微服务开发的核心模式。启用tls时,默认消息传递是点对点http / 1.1或http2
    可插拔接口: Go Micro为每个分布式系统抽象使用Go接口,因此,这些接口是可插拔的,并允许Go Micro与运行时无关,可以插入任何基础技术 插件地址:https://github.com/micro/go-plugins

    3.go-micro通信流程

    Server监听客户端的调用,和Brocker推送过来的信息进行处理。并且Server端需要向Register注册自己的存在或消亡,这样Client才能知道自己的状态
    Register服务的注册的发现,Client端从Register中得到Server的信息,然后每次调用都根据算法选择一个的Server进行通信,当然通信是要经过编码/解码,选择传输协议等一系列过程的
    如果有需要通知所有的Server端可以使用Brocker进行信息的推送,Brocker 信息队列进行信息的接收和发布


    二、第一个微服务 hello-service

    开始第一个项目前,请先使用go version命令查看您的语言版本,因为截至发文时(2020.12.26) go-micro 依赖的部分包尚未适配go1.15版本,因此本教程建议在go1.14+版本中运行。

    我原本安装的go 版本是go 1.15.3 编译的micro.exe 不运行总是报错,重新安装了go 1.14.3 就可以了

    同时考虑到国内的网络环境,请确保go env中 GO111MODULE=on且配置了正确的依赖代理服务(推荐GOPROXY=https://goproxy.io)。


    1.安装micro

    这里需要说明一下,我们微服务使用的框架叫go-micro,他将被集成到我们的项目中。

    同时,官方还为我们提供了另一个叫micro的项目,他是一个官方工具包,主要是通过编译后的可执行文件为我们开发提供各种帮助,这里我们安装的就是micro工具包:

    go get github.com/micro/micro/v2
    
    • 1

    安装完成后可以执行micro help看到如下信息表示已经安装成功:

    NAME:
       micro - A microservice runtime
       Use `micro [command] --help` to see command specific help.
    USAGE:
       micro [global options] command [command options] [arguments...]
    VERSION:
       latest
    COMMANDS:
       server      Run the micro server
       以下省略...
    
    

    2.自动生成代码

    实际上,通过阅读帮助文档不难发现,micro本身也是一个微服务,后续我们会讲到他的更多作用,这里我们重点讲如何使用micro自动生成我们自己的微服务代码。

    执行如下命令:

    # 首先进入到项目目录,这里我以我自己的go项目目录为例
    cd go-workspace
    
    # 调用micro生成代码
    # 默认情况下Micro生成的代码会放到GOPATH/src中,通过配置--gopath=false可以选择在当前目录下
    micro new --gopath=false hello
    

    3.项目结构

    代码生成后,micro会输出大量项目信息,我们观察这段信息。

    首先是项目结构,可以看到micro为我们创建了一个hello文件夹,并在里面写入了一个完整的go mod项目:

    Creating service go.micro.service.hello in hello
    
    .
    ├── main.go						#程序入口
    ├── generate.go
    ├── plugin.go
    ├── handler						#服务的主要处理逻辑,(仅仅是)类似java spring项目的service
    │   └── hello.go
    ├── subscriber					#消息处理逻辑
    │   └── hello.go
    ├── proto						#存放proto文件,并生成相关业务代码
    │   └── hello
    │       └── hello.proto
    ├── Dockerfile					#docker镜像配置文件
    ├── Makefile					#若干make命令帮助我们自动化管理项目
    ├── README.md
    ├── .gitignore
    └── go.mod
    

    这里补充说明一下,为了照顾大多数读者,本教程尽量不会使用make命令,但还是建议 win环境的朋友自行搜索MinGW的安装和配置,因为这东西用过你就知道真香。
    如果你安装完mingw-get-setup在执行install的时候发现总是下载超时,请用USB将手机4G网共享给电脑,有奇效,当然梯子效果更佳。


    4.protobuf

    Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。在go-micro中,官方虽然也支持json格式数据传输,但默认是protobuf。

    这种格式相对json有两个弊端:

    • 首先,protobuf有一定学习成本,好在日常使用只需要参考自动代码中hello.proto的格式学会定义接口和参数即可(熟练后强烈建议进一步深入学习)
    • 其次,需要安装不少的工具,go-micro官方也是考虑到这一点,因此在代码生成文档的最后详细列出了工具安装步骤(考虑到不同版本问题,请务必使用你的控制台中看到的命令,一下内容仅供参考)

    如果你不听话,直接执行了,会发现程序顺利执行,只是有一条警告信息:

    # 首先要下下载protoc协议的编解码器,下载安装后放在任意`path`路径下一边被命令行调用
    # 我一般会把他放在 GOPATH/bin 目录下
    download protoc zip packages (protoc-$VERSION-$PLATFORM.zip) and install:
    
    visit https://github.com/protocolbuffers/protobuf/releases
    
    # 接下来是下载三个go语言的proto包,用于生成对应go语言的micro代码
    download protobuf for micro:
    
    go get -u github.com/golang/protobuf/proto
    go get -u github.com/golang/protobuf/protoc-gen-go
    go get github.com/micro/micro/v2/cmd/protoc-gen-micro
    
    # 最后是进入到你新建的项目中,通过proto文件生成micro代码
    compile the proto file hello.proto:
    
    cd hello
    # 没有make的win环境朋友可以直接复制执行makefile文件里面的命令,效果是一样的:
    # protoc --proto_path=. --micro_out=Mproto/imports/api.proto=github.com/micro/go-micro/v2/api/proto:. --go_out=Mproto/imports/api.proto=github.com/micro/go-micro/v2/api/proto:. proto/hello/hello.proto
    #这一步先不要着急执行,往下看(重要的话说三遍)
    #这一步先不要着急执行,往下看(重要的话说三遍)
    #这一步先不要着急执行,往下看(重要的话说三遍)
    make proto	
    

    这里,我们需要预处理一下hello.proto文件,在最上面加入一行信息:
    插入go_package
    这行信息用于指定生成代码所属的包路径,因为我们将代码生成在hello.proto同目录下,因此包路径使用proto/hello,如果你的项目想把生成的go文件放在其他路径,则根据实际情况填写。

    完成修改后,执行make proto或者完整的生成命令:

    > protoc --proto_path=. --micro_out=Mproto/imports/api.proto=github.com/micro/go-m
    icro/v2/api/proto:. --go_out=Mproto/imports/api.proto=github.com/micro/go-micro/
    v2/api/proto:. proto/hello/hello.proto
    
    • 1
    • 2
    • 3

    这里官方写法比较冗长,如果是当前目录下可以简写为protoc --proto_path=. --micro_out=. --go_out=. proto/hello/hello.proto
    注意,其中的--go_out--micro_out参数指定了生成文件的输出路径,应与上一步我们修改的go_package保持一致。


    5.启动服务

    至此,所有代码都已经生成完毕,理论上go mod tidy && go run main.go就可以愉快的跑起来了。

    > go run main.go
    2020-09-10 11:30:29  file=v2@v2.9.1/service.go:200 level=info Starting [service] go.micro.service.hello
    2020-09-10 11:30:29  file=grpc/grpc.go:864 level=info Server [grpc] Listening on [::]:60662
    2020-09-10 11:30:29  file=grpc/grpc.go:881 level=info Broker [http] Connected to 127.0.0.1:60663
    2020-09-10 11:30:29  file=grpc/grpc.go:697 level=info Registry [mdns] Registering node: go.micro.service.hello-3b9e045d-6db0-47a5-9504-743b4d9175ba
    2020-09-10 11:30:29  file=grpc/grpc.go:730 level=info Subscribing to topic: go.micro.service.hello
    

    根据日志信息,会发现框架帮我们启动了

    • 服务:go.micro.service.hello-3b9e045d-6db0-47a5-9504-743b4d9175ba
    • 服务发现:mdns
    • 基于grpc的Server服务:60662
    • 基于http的Broker服务:60663
    • 订阅消息服务,主题:go.micro.service.hello

    你可以在另一个命令行窗口执行micro list services命令,可以看到我们的服务go.micro.service.hello已经被注册:

    > micro list services
    go.micro.service.hello
    micro.http.broker
    

    如果你看到如下报错,是由于第三方库兼容性造成的。这个问题困扰了我很久,但是在我写文时,已经被官方最新版解决:

    # github.com/coreos/etcd/clientv3/balancer/picker
    F:\go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\picker\err.go:37:44: undefined: balancer.PickOptions
    F:\go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\picker\roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
    # github.com/coreos/etcd/clientv3/balancer/resolver/endpoint
    F:\go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:114:78: undefined: resolver.BuildOption
    F:\go\pkg\mod\github.com\coreos\etcd@v3.3.22+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:182:31: undefined: resolver.ResolveNowOption
    # github.com/micro/go-micro/transport/quic
    F:\go\pkg\mod\github.com\micro\go-micro@v1.18.0\transport\quic\quic.go:54:12: q.s.Close undefined (type quic.Session has no field or method Close)
    F:\go\pkg\mod\github.com\micro\go-micro@v1.18.0\transport\quic\quic.go:121:3: unknown field 'IdleTimeout' in struct literal of type quic.Config
    

    在 go.mod 文件中添加以下两行 replace 解决编译问题

    replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
    replace github.com/lucas-clemente/quic-go => github.com/lucas-clemente/quic-go v0.14.1
    

    三、服务调用 hello-cli

    如上所述,我们已经启动了第一个go-micro微服务hello,怎么调用他呢?我们可以新建一个hello-cli.go文件:

    package main
    
    import (
    	"context"
    	"github.com/micro/go-micro/v2"
    	"github.com/micro/go-micro/v2/client"
    	pb "hello/proto/hello"
    	"log"
    )
    
    func main() {
    	// 这里以HelloService默认提供的Call接口调用为例示范服务的调用
    	// 可以看到他的调用就像调用本地方法一样,go-micro为我们隐藏了背后的服务注册、发现、负载均衡以及网络操作
    	testCallFunc()
    	
    	// 这里示范消息的发送
    	testSendMessage()
    }
    func testCallFunc(){
    	// 获取hello服务
    	// 这里第一个参数"go.micro.service.hello"必须与hello-service注册信息一致
    	// 一般由micro生成的项目默认服务名为:{namespace 默认[go.micro]}.{type 默认[service]}.{项目名}组成
    	// 如果要修改默认值,在生成项目时可以这样: micro --namespace=XXX --type=YYYY ZZZZ
    	// 当然也可以直接修改main.go中micro.Name("go.micro.service.hello")的内容
    	helloService := pb.NewHelloService("go.micro.service.hello", client.DefaultClient)
    
    	// 默认生成的hello服务中自带三个接口: Call() Stream() PingPong(),分别对应参数调用、流传输和心跳
    	resp, err := helloService.Call(context.Background(), &pb.Request{
    		Name: "xiao xie",
    	})
    	if err != nil {
    		log.Panic("call func", err)
    	}
    	log.Println("call func success!", resp.Msg)
    }
    
    func testSendMessage(){
    	// 消息主题,定义规则与服务一致
    	// 同样,也可以修改main.go的micro.RegisterSubscriber("go.micro.service.hello", service.Server(), new(subscriber.Hello))
    	const topic = "go.micro.service.hello"
    	// 获取消息发送接口,这里我一直使用的时micro.NewPublisher()
    	// 但在写文时发现NewPublisher()已经被废止,改为NewEvent(),二者参数和返回值一致
    	event := micro.NewEvent(topic, client.DefaultClient)
    	if err := event.Publish(context.Background(), &pb.Message{
    		Say: "hello server!",
    	}); err != nil {
    		log.Panic("send msg", err)
    	}
    	log.Println("send msg success!")
    }
    

    执行go run hello-cli.go,即可看到运行结果:

    > go run hello-cli.go
    2020-09-10 12:43:25.446682 I | call func success! Hello xiao xie
    2020-09-10 12:43:25.547441 I | send msg success!

    至此,一个基础的微服务就部署完成并通过测试了。


    总结

    本章我们介绍了借助micro工具包快速编写go-micro微服务的基本操作流程,和微服务的两种基本调用方式gRpc消息,由于篇幅关系我们并没有详解自动生成的代码的含义。

    下一章我们将参考示例代码结构手动编写一个微服务,并在后续章节中逐步开发一个微服务化的todolist项目。

    展开全文
  • import "github.com/asim/go-micro/v3" // create a new service service := micro.NewService( micro.Name("helloworld"), ) // initialise flags service.Init() // start the service service.Run() See the ...
  • 对应 examples/noproto 例子: go- micro 中微服务 都可以使用哪些 传输协议... github.com/micro/go-micro ) type Greeter struct{} func (g *Greeter) Hello(ctx context.Context, name *string, msg *string) error
  • 本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-micro 入门笔记2.1...

    本章节阐述go-micro 服务发现原理

    go-micro架构

    下图来自go-micro官方 go-micro系统架构

    阅读本文前你可能需要进行如下知识储备

    Service

    实现如下接口的,都是Service

    type Service interface {
    	Init(...Option)
    	Options() Options
    	Client() client.Client
    	Server() server.Server
    	Run() error
    	String() string
    }
    

    我们根据常见的service初始化流程来理解这个接口

    
    func main() {
    	// New Service
    	service := micro.NewService(
    		micro.Name("go.micro.srv.broker"),
    		micro.Version("latest"),
    	)
    
    	// Initialise service
    	service.Init()
    
    	// Register Struct as Subscriber
    	micro.RegisterSubscriber("go.micro.srv.broker", service.Server(), new(subscriber.Broker))
    
    	// Register Function as Subscriber
    	micro.RegisterSubscriber("go.micro.srv.broker", service.Server(), subscriber.Handler)
    
    	// Run service
    	if err := service.Run(); err != nil {
    		log.Fatal(err)
    	}
    }
    

    micro.NewService

    micro.NewService的函数调用关系如下 micro.NewService的函数调用关系如下 该函数主要是初始化一个service并设置service的常用属性属性,代码如下:

    opt := micro.Options{
    	Broker: broker.DefaultBroker,
    	Cmd: cmd.DefaultCmd,
    	Client: client.DefaultClient,
    	Server: server.DefaultServer,
    	Registry: registry.DefaultRegistry
    	}
    

    micro.Options全部属性包含如下几个方面

    type micro.Options struct {
    	Broker    broker.Broker  //订阅事件用的
    	Cmd       cmd.Cmd       //命令行用的
    	Client    client.Client  //作为服务消费者,用来发送请求
    	Server    server.Server  //作为服务提供者用来监听请求
    	Registry  registry.Registry //这个是服务发现支持
    	Transport transport.Transport //这是网络传递用的
    
    	// Before and After funcs     
    	BeforeStart []func() error //服务start钱的回调函数
    	BeforeStop  []func() error //服务stop后的回调函数
    	AfterStart  []func() error //服务start后的回调函数
    	AfterStop   []func() error //服务stop后的回调函数
    	// Other options for implementations of the interface
    	// can be stored in a context
    	Context context.Context   //有时候服务需要携带一些参数,需要规定时间内返回,可以用这个来承载
    }
    

    我们可以通过micro.Options.Server.Options获得server的属性,实际上server还有其他的属性,server的全部参数属性如下

    type server.Options struct {
    	Codecs       map[string]codec.NewCodec //订阅事件用的
    	Broker       broker.Broker             //订阅事件用的
    	Registry     registry.Registry        //这个是服务发现支持
    	Transport    transport.Transport     //节点之间网络传递用的
    	Metadata     map[string]string       //传递一些k,v数据用
    	Name         string                  //名称
    	Address      string                 //服务地址
    	Advertise    string                  //广播地址
    	Id           string                //服务ID
    	Version      string                 //处理程序wrapper
    	HdlrWrappers []HandlerWrapper            //网络处理程序封装
    	SubWrappers  []SubscriberWrapper        //订阅程序封装
    
    	// RegisterCheck runs a check function before registering the service
    	RegisterCheck func(context.Context) error   //注册服务前的校验函数
    	// The register expiry time
    	RegisterTTL time.Duration                      //注册服务生命周期,过了这么长事件需要重新注册
    	// The interval on which to register
    	RegisterInterval time.Duration                     //多长时间注册一次
    
    	// The router for requests
    	Router Router     //请求的路由表
    
    	// Other options for implementations of the interface
    	// can be stored in a context
    	Context context.Context   //有时候服务需要携带一些参数,需要规定时间内返回,可以用这个来承载
    }
    

    如果server需要配置额外的属性,则调用属性配置函数来刷新配置。如Name()运行结果是返回一个函数,因此最后通过server.Name(name)来刷新这个函数,

    micro.Name("go.micro.srv.broker"),
    // Name of the service
    func Name(n string) Option {
    	return func(o *Options) {
    		o.Server.Init(server.Name(n))
    	}
    }
    

    函数关系如下 micro.NewService的函数调用关系如下

    注意最后的o.Name即设置service.Options.Name = name micro.Version("latest")也是一样的

    service.Init

    init 函数原型如下

    func (s *service) Init(opts ...Option) {
    	// process options
    	for _, o := range opts {
    		o(&s.opts)
    	}
    
    	s.once.Do(func() {
    		// Initialise the command flags, overriding new service
    		_ = s.opts.Cmd.Init(
    			cmd.Broker(&s.opts.Broker),
    			cmd.Registry(&s.opts.Registry),
    			cmd.Transport(&s.opts.Transport),
    			cmd.Client(&s.opts.Client),
    			cmd.Server(&s.opts.Server),
    		)
    	})
    }
    

    for _, o := range opts代码片段的作用是设置service的属性,底层也是通过 类似o.Server.Init(server.NaME(n)来实现的。

    s.once.Do(func) 这里利用了sync.Once特性,这里预示着func只会运行1次。

    micro.NewService的函数调用关系如下

    两行传入的参数通过c := a.Command(name)来获得需要运行的命令行

    service.Run

    源代码如下

    func (s *service) Run() error {
    	// 这一段代码的作用其实只开启调试支持
    	s.opts.Server.Handle(
    		s.opts.Server.NewHandler(
    			handler.DefaultHandler,//默认处理脚本handler就是调试
    			server.InternalHandler(true),//把这个标记为成内置的handler
    		),
    	)
    
    	if err := s.Start(); err != nil {
    		return err
    	}
    
    	ch := make(chan os.Signal, 1)
    	signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
    
    	select {
    	// wait on kill signal
    	case <-ch:
    	// wait on context cancel
    	case <-s.opts.Context.Done():
    	}
    
    	return s.Stop()
    }
    

    s.Start()作用是启动服务,目前micro支持的rpcservce/httpservice/apiservice/websercice等,他们都实现了这个Start()方法。以RPCService为例,函数流程如下

    micro.NewService的函数调用关系如下

    具体代码解读如下

    func (s *rpcServer) Start() error {
    	config := s.Options()
    
    	//启动监听
    	ts, err := config.Transport.Listen(config.Address)
    	if err != nil {
    		return err
    	}
    
    
    	// 连接消息代理
    	if err := config.Broker.Connect(); err != nil {
    		return err
    	}
    
    
    	// 注册发现,严格校验注册服务,
    	if err = s.opts.RegisterCheck(s.opts.Context); err != nil {
    		log.Logf("Server %s-%s register check error: %s", config.Name, config.Id, err)
    	} else {
    		// 注册发现,匿名注册
    		if err = s.Register(); err != nil {
    			log.Logf("Server %s-%s register error: %s", config.Name, config.Id, err)
    		}
    	}
    
    	exit := make(chan bool)
    
    	//启动监听服务
    	go func() {
    		for {
    			// 监听
    			err := ts.Accept(s.ServeConn)
    
    			// TODO: listen for messages
    			// msg := broker.Exchange(service).Consume()
    
    			select {
    			// check if we're supposed to exit
    			case <-exit:
    				return
    			// check the error and backoff
    			default:
    				if err != nil {
    					log.Logf("Accept error: %v", err)
    					time.Sleep(time.Second)
    					continue
    				}
    			}
    
    			// no error just exit
    			return
    		}
    	}()
    
    	//开启定时注册携程
    	go func() {
    		t := new(time.Ticker)
    
    		// only process if it exists
    		if s.opts.RegisterInterval > time.Duration(0) {
    			// new ticker
    			t = time.NewTicker(s.opts.RegisterInterval)
    		}
    
    		// return error chan
    		var ch chan error
    
    	Loop:
    		for {
    			select {
    			// register self on interval
    			case <-t.C:
    				s.RLock()
    				registered := s.registered
    				s.RUnlock()
    				//校验注册
    				if err = s.opts.RegisterCheck(s.opts.Context); err != nil && registered {
    					log.Logf("Server %s-%s register check error: %s, deregister it", config.Name, config.Id, err)
    					// deregister self in case of error
    					if err := s.Deregister(); err != nil {
    						log.Logf("Server %s-%s deregister error: %s", config.Name, config.Id, err)
    					}
    				} else {
    					//匿名注册
    					if err := s.Register(); err != nil {
    						log.Logf("Server %s-%s register error: %s", config.Name, config.Id, err)
    					}
    				}
    			// wait for exit
    			case ch = <-s.exit:
    				t.Stop()
    				close(exit)
    				break Loop
    			}
    		}
    
    		// 如果退出来了,那么注销服务
    		if err := s.Deregister(); err != nil {
    			log.Logf("Server %s-%s deregister error: %s", config.Name, config.Id, err)
    		}
    
    		// 等到请求完成
    		if s.wg != nil {
    			s.wg.Wait()
    		}
    
    		// 关闭
    		ch <- ts.Close()
    
    		// 关闭消息代理连接
    		config.Broker.Disconnect()
    
    		// swap back address
    		s.Lock()
    		s.opts.Address = addr
    		s.Unlock()
    	}()
    
    	return nil
    }
    

    相关代码获得

    关注公众号回复micro-broker即可获得

    公众号betaidea

    推荐阅读

    扫微信二维码实现网站登陆提供体验地址和源代码

    开源项目golang go语言后台管理框架restgo-admin

    支持手势触摸,可左右滑动的日历插件

    你必须知道的18个互联网业务模型

    转载于:https://my.oschina.net/u/4187011/blog/3100425

    展开全文
  • 基础组件服务 提供mysql,redis,mongo.consul,kafka...go get github.com/hammercui/mega-go-micro 常问问题 1 etcd err:go mod使用gprc 1.26.0 replace google.golang.org/grpc => google.golang.org/grpc v1.26.0
  • go-micro 入门教程1.搭建 go-micro环境

    千次阅读 2019-08-19 16:29:10
    go-micro是基于golang的微服务编程框架,go-micro操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章定位最简单最容易上手的go-micro入门教程,所有案列来自实操,而非网络上的复制粘贴。 本章节的...
     

    微服务的本质是让专业的人做专业的事情,做出更好的东西。

    golang具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。go-micro是基于golang的微服务编程框架,go-micro操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章定位最简单最容易上手的go-micro入门教程,所有案列来自实操,而非网络上的复制粘贴。

    本章节的目的是让大家最快速搭建好go-micro环境

    #linux 下
    export GO111MODULE=on
    export GOPROXY=https://goproxy.io
    # windows下设置如下环境变量
    setx GO111MODULE on
    setx GOPROXY https://goproxy.io
    # 使用如下指令安装
    go get -u -v github.com/micro/micro
    go get -u -v github.com/micro/go-micro

    如果没有git请自行安装git

    #下载地址
    https://git-scm.com/downloads/

    安装 protoc

    访问如下网址

    https://github.com/protocolbuffers/protobuf/releases

    下载,不同的版本文件名称不一样,我们这里选择protoc-3.9.1-win64.zip

    protoc-3.9.1-win64.zip

    解压到目标文件架,我们以e:dev为例

    e:\dev\protoc-3.9.1-win64

    添加e:devprotoc-3.9.1-win64bin到环境变量path

    安装protoc-gen-micro插件

    这个插件主要作用是通过.proto文件生成适用于go-micro的代码

    go get -u -v github.com/micro/protoc-gen-micro

    安装 consul

    下载windows版本

    https://www.consul.io/downloads.html

    解压到

    e:\dev\consul

    添加e:devconsul到环境变量path使用如下指查看是否安装成功,如下所示安装成功

    >consul
    Usage: consul [--version] [--help] <command> [<args>]
    Available commands are:
        acl            Interact with Consul's ACLs
        agent          Runs a Consul agent
        catalog        Interact with the catalog
        config         Interact with Consul's Centralized Configurations
        connect        Interact with Consul Connect
        debug          Records a debugging archive for operators

    hello,world

    创建微服务

    使用如下指令创建微服务

    >micro new techidea8.com/microapp/hello
    Creating service go.micro.srv.hello in E:\winlion\gopath\src\techidea8.com\microapp\hello
    
    .
    ├── main.go
    ├── plugin.go
    ├── handler
    │   └── hello.go
    ├── subscriber
    │   └── hello.go
    ├── proto\hello
    │   └── hello.proto
    ├── Dockerfile
    ├── Makefile
    ├── README.md
    └── go.mod
    
    
    download protobuf for micro:
    
    brew install protobuf
    go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
    go get -u github.com/micro/protoc-gen-micro
    
    compile the proto file hello.proto:
    
    cd E:\winlion\gopath\src\techidea8.com\microapp\hello
    protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/hello/hello.proto

    生成适配proto的golang代码

    注意:在win系统下$GOPATH环境变量无效,因此如上脚本将创建微服务失败,因此我们需要对如上脚本进行处理

    #切换到项目目录下
    >cd /d E:\winlion\gopath\src\techidea8.com\microapp\hello
    
    # 根据proto生成文件
    >protoc --proto_path=. --go_out=. --micro_out=. proto/hello/hello.proto

    启动应用

    >go run main.go
    2019/08/19 13:00:46 Transport [http] Listening on [::]:54689
    2019/08/19 13:00:46 Broker [http] Connected to [::]:54690
    2019/08/19 13:00:46 Registry [mdns] Registering node: go.micro.srv.hello-4851dce2-ab5d-4e4c-801e-44dae5d93f26
    2019/08/19 13:00:46 Subscribing go.micro.srv.hello-4851dce2-ab5d-4e4c-801e-44dae5d93f26 to topic: go.micro.srv.hello
    2019/08/19 13:00:46 Subscribing go.micro.srv.hello-4851dce2-ab5d-4e4c-801e-44dae5d93f26 to topic: go.micro.srv.hello

    查看是否启动

    >micro list services
    go.micro.srv.hello
    topic:go.micro.srv.hello

    启动restful api接口支持支持

    注意其中的--namespace参数,我们每一个微服务都属于一个命名空间,通过api暴露出来该命名空间后,满足go.micro.srv.*格式的微服务都可以访问。如go.micro.srv.hello可以通过如下格式访问

    http://127.0.0.1:8080/user/call
    >micro api --namespace=go.micro.srv
    2019/08/19 13:07:11 Registering API Default Handler at /
    2019/08/19 13:07:11 HTTP API Listening on [::]:8080
    2019/08/19 13:07:11 Transport [http] Listening on [::]:54934
    2019/08/19 13:07:11 Broker [http] Connected to [::]:54935
    2019/08/19 13:07:11 Registry [mdns] Registering node: go.micro.api-1753185c-b8e1-49c4-aa0f-617f243a8e2a

    测试

    restd插件请求接口rested接口

    展开全文
  • go-micro是基于golang的微服务编程框架,go-micro操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章定位最简单最容易上手的go-micro入门教程,所有案列来自实操,而非网络上的复制粘贴。 本章节的...
     

    微服务的本质是让专业的人做专业的事情,做出更好的东西。

    golang具备高并发,静态编译等特性,在性能、安全等方面具备非常大的优势。go-micro是基于golang的微服务编程框架,go-micro操作简单、编码高效、功能强大。但是网络上资料偏少,本系列文章定位最简单最容易上手的go-micro入门教程,所有案列来自实操,而非网络上的复制粘贴。

    本章节的目的是让大家最快速搭建好go-micro环境

    #linux 下
    export GO111MODULE=on
    export GOPROXY=https://goproxy.io
    # windows下设置如下环境变量
    setx GO111MODULE on
    setx GOPROXY https://goproxy.io
    # 使用如下指令安装
    go get -u -v github.com/micro/micro
    go get -u -v github.com/micro/go-micro

    如果没有git请自行安装git

    #下载地址
    https://git-scm.com/downloads/

    安装 protoc

    访问如下网址

    https://github.com/protocolbuffers/protobuf/releases

    下载,不同的版本文件名称不一样,我们这里选择protoc-3.9.1-win64.zip

    protoc-3.9.1-win64.zip

    解压到目标文件架,我们以e:dev为例

    e:\dev\protoc-3.9.1-win64

    添加e:devprotoc-3.9.1-win64bin到环境变量path

    安装protoc-gen-micro插件

    这个插件主要作用是通过.proto文件生成适用于go-micro的代码

    go get -u -v github.com/micro/protoc-gen-micro

    安装 consul

    下载windows版本

    https://www.consul.io/downloads.html

    解压到

    e:\dev\consul

    添加e:devconsul到环境变量path使用如下指查看是否安装成功,如下所示安装成功

    >consul
    Usage: consul [--version] [--help] <command> [<args>]
    Available commands are:
        acl            Interact with Consul's ACLs
        agent          Runs a Consul agent
        catalog        Interact with the catalog
        config         Interact with Consul's Centralized Configurations
        connect        Interact with Consul Connect
        debug          Records a debugging archive for operators

    hello,world

    创建微服务

    使用如下指令创建微服务

    >micro new techidea8.com/microapp/hello
    Creating service go.micro.srv.hello in E:\winlion\gopath\src\techidea8.com\microapp\hello
    
    .
    ├── main.go
    ├── plugin.go
    ├── handler
    │   └── hello.go
    ├── subscriber
    │   └── hello.go
    ├── proto\hello
    │   └── hello.proto
    ├── Dockerfile
    ├── Makefile
    ├── README.md
    └── go.mod
    
    
    download protobuf for micro:
    
    brew install protobuf
    go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
    go get -u github.com/micro/protoc-gen-micro
    
    compile the proto file hello.proto:
    
    cd E:\winlion\gopath\src\techidea8.com\microapp\hello
    protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/hello/hello.proto

    生成适配proto的golang代码

    注意:在win系统下$GOPATH环境变量无效,因此如上脚本将创建微服务失败,因此我们需要对如上脚本进行处理

    #切换到项目目录下
    >cd /d E:\winlion\gopath\src\techidea8.com\microapp\hello
    
    # 根据proto生成文件
    >protoc --proto_path=. --go_out=. --micro_out=. proto/hello/hello.proto

    启动应用

    >go run main.go
    2019/08/19 13:00:46 Transport [http] Listening on [::]:54689
    2019/08/19 13:00:46 Broker [http] Connected to [::]:54690
    2019/08/19 13:00:46 Registry [mdns] Registering node: go.micro.srv.hello-4851dce2-ab5d-4e4c-801e-44dae5d93f26
    2019/08/19 13:00:46 Subscribing go.micro.srv.hello-4851dce2-ab5d-4e4c-801e-44dae5d93f26 to topic: go.micro.srv.hello
    2019/08/19 13:00:46 Subscribing go.micro.srv.hello-4851dce2-ab5d-4e4c-801e-44dae5d93f26 to topic: go.micro.srv.hello

    查看是否启动

    >micro list services
    go.micro.srv.hello
    topic:go.micro.srv.hello

    启动restful api接口支持支持

    注意其中的--namespace参数,我们每一个微服务都属于一个命名空间,通过api暴露出来该命名空间后,满足go.micro.srv.*格式的微服务都可以访问。如go.micro.srv.hello可以通过如下格式访问

    http://127.0.0.1:8080/user/call
    >micro api --namespace=go.micro.srv
    2019/08/19 13:07:11 Registering API Default Handler at /
    2019/08/19 13:07:11 HTTP API Listening on [::]:8080
    2019/08/19 13:07:11 Transport [http] Listening on [::]:54934
    2019/08/19 13:07:11 Broker [http] Connected to [::]:54935
    2019/08/19 13:07:11 Registry [mdns] Registering node: go.micro.api-1753185c-b8e1-49c4-aa0f-617f243a8e2a

    测试

    restd插件请求接口rested接口

    推荐阅读

    扫微信二维码实现网站登陆提供体验地址和源代码

    开源项目golang go语言后台管理框架restgo-admin

    支持手势触摸,可左右滑动的日历插件

    你必须知道的18个互联网业务模型

    推荐阅读

    扫微信二维码实现网站登陆提供体验地址和源代码

    开源项目golang go语言后台管理框架restgo-admin

    支持手势触摸,可左右滑动的日历插件

    你必须知道的18个互联网业务模型

    展开全文
  • go-go-micro机器人bot

    2019-10-11 11:51:08
    title: go-go-micro机器人bot categories: Go tags: [go, 微服务, bot, 机器人, slack] date: 2019-10-10 19:30:53 comments: false go-go-micro机器人bot 前篇 micro bot - ...
  • go-micro-service-源码

    2021-03-26 14:22:55
    go-micro-service
  • go-go-micro安全tls

    2019-10-11 19:40:57
    title: go-go-micro安全tls categories: Go tags: [go, 微服务, tls, 安全] date: 2019-10-11 17:42:57 comments: false go-go-micro安全tls 前篇 a 内置的 tls 证书 是用 micro 默认的 tls 非常简单, 只需要 ...
  • 基于go-micro 微服务实战 配套Android iOS 前端
  • 之前的文章中我们已经学习了使用go-micro创建微服务,并实现了服务的调用。我们具体的实现是实例化了client对象,并调用了对应服务的相关方法。这种方式可以实现系统功能,但有比较大的缺点。 我们通过举例来说明:...
  • 在前面使用gRPC一步一步搭建使用流程,但是以上这些具体的方案都是为了...Go-Micro 介绍 Micro是一个简化分布式开发的微服务生态系统,该系统为开发分布式应用程序提供了高效,便捷的模块构建。主要目的是简化分布式
  • 基于微服务框架go-micro 封装的go微服务脚手架
  • 开源项目-nitishm-go-micro-framework.zip,一个极简的微服务框架
  • go-micro是一个微服务项目,封装比较优雅,API友好,二进制注释比较明确,具有快速灵活,容错方便等特点,让您快速了解go微服务项目 生成proto protoc --proto_path = src / protos --micro_out = src / Users --go...
  • nacos插件 使用nacos-sdk-go的go-micro注册表插件
  • 在这个go-micro / v2稳定版的基础上,维持初心,保持架构,增加功能,修复Bug。 概述 Go Micro提供了分布式系统开发的核心要求,包括RPC和事件驱动的通信。 Micro哲学是可插拔体系结构的默认设置。我们提供默认设置...
  • go-micro讲解--Go Micro编写微服务

    万次阅读 2018-07-07 10:53:09
    一、什么是go-micro Go Micro是一个插件化的基础框架,基于此可以构建微服务。Micro的设计哲学是『可插拔』的插件化架构。在架构之外,它默认实现了consul作为服务发现,通过http进行通信,通过protobuf和json进行...
  • 创建go-micro v2项目

    2021-05-09 21:42:47
    1.使用go mod init 名称 创建项目 2.执行下面方法 ...go-micro自己的生成工具: (和go-micro版本一致都是V2版本) go get github.com/micro/protoc-gen-micro/v2 还需要一个protoc.exe,windows平
  • 1.Go-Micro微服务框架简介 Go-Micro类似Java中的SpringCloud,虽然生态上有一些区别,但是可以类比比较。官当Github地址为 https://github.com/micro/go-micro,下载安装依赖命令: go get -u github....
  • go微服务框架go-micro深度学习(一) 整体架构介绍 go微服务框架go-micro深度学习(二) 入门例子 go微服务框架go-micro深度学习(三) Registry服务的注册和发现 go微服务框架go-micro深度学习(四) rpc方法调用过程详解 ...
  • micro new helloworld 服务的启动与运行 # 在本地运行该服务并确保其正常工作. # 启动服务器 micro server # 设置为本地环境 micro env set local # 启动你的服务 micro run helloworld 服务状态 # 检查状态 ...
  • go-micro教程

    千次阅读 2020-01-10 15:23:55
    go-micro - 基于Go语言的可插拔RPC微服务开发框架;包含服务发现、RPC客户/服务端、广播/订阅机制等等。 go-plugins - go-micro的插件有etcd、kubernetes、nats、rabbitmq、grpc等等。 micro - 微服务工具集包含传统...
  • go-micro学习资料

    2021-04-05 21:36:25
    安装工具 protobuf 相关工具 1、安装框架 ...go-micro自己的生成工具 go get github.com/micro/protoc-gen-micro/v2 //此处为这个错误的解决方法 /** protoc-gen-go: unable to determine Go import path fo

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,465
精华内容 986
关键字:

go-micro