精华内容
下载资源
问答
  • 上一篇帖子《go微服务框架go-micro深度学习(一) 整体架构介绍》简单介绍了go-micro的整体框架结构,这一篇主要写go-micro使用方式的例子,中间会穿插一些go-micro的源码,和调用流程图,帮大家更好的理解go-micro的...

    上一篇帖子《go微服务框架go-micro深度学习(一) 整体架构介绍》简单介绍了go-micro的整体框架结构,这一篇主要写go-micro使用方式的例子,中间会穿插一些go-micro的源码,和调用流程图,帮大家更好的理解go-micro的底层。更详细更具体的调用流程和细节,会在以后的帖子里详细讲解。

    例子的github地址: gomicrorpc 跑一遍例子,也就会明白个大概。

    安装所需要的环境

    go-micro服务发现默认使用的是consul,

    brew install consulconsul agent -dev

    或者直接使用使用docker跑

    docker run -p 8300:8300 -p 8301:8301 -p 8301:8301/udp -p 8302:8302/udp -p 8302:8302 -p 8400:8400 -p 8500:8500 -p 53:53/udp consul

    我个人更喜欢etcdv3原因我上一篇也有提到过,gomicro服务发现不支持consul集群,我之前也写过etcdv3 集群的搭建和使用帖子,有时间大家可以看一下

    安装go-micro框架

    go get github.com/micro/go-micro

    安装protobuf和依赖 prtobuf的基础知识我这里就不讲了,如果不了解的可以看一下官方文档,就是一个跨平台,跨语言的数据序列化库,简单易学。

    是go-micro用于帮助我们生成服务接口和一系列的调用代码

    brew install protobufgo get -u -v github.com/golang/protobuf/{proto,protoc-gen-go}go get -u -v github.com/micro/protoc-gen-micro

    protobuf也可以直接从源码安装

    wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-all-3.6.1.tar.gztar zxvf protobuf-all-3.6.1.tar.gzcd protobuf-3.6.1/./autogen.sh./configure makemake installprotoc -h

    安装micro工具包,这个安装是可选项,micro提供了一系列的工具来帮助我们更好的使用go-micro。

    go get github.com/micro/micro

    例子1

    创建proto文件common.proto,这个文件包含了传入和返回的参数,参数包含了常用的基础类型、数组、map等。还有一个Say 服务,这个服务里有一个rpc方法。

    syntax = "proto3";package model;message SayParam {    string msg = 1;}message Pair {    int32 key = 1;    string values = 2;}message SayResponse {    string msg = 1;    // 数组    repeated string values = 2;    // map    map header = 3;    RespType type = 4;}enum RespType {    NONE = 0;    ASCEND = 1;    DESCEND = 2;}// 服务接口service Say {    rpc Hello(SayParam) returns (SayResponse) {}}

    在根目录下运行,生成两个模板文件

      protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. example1/proto/*.proto 

    一个文件是proto的go 结构文件,还有一个go-micro rpc的接口文件。

    3e3b3320dad3ba45565fb0eef6b91061.png

    server 端:

    type Say struct {}func (s *Say) Hello(ctx context.Context, req *model.SayParam, rsp *model.SayResponse) error {    fmt.Println("received", req.Msg)    rsp.Header = make(map[string]*model.Pair)    rsp.Header["name"] = &model.Pair{Key: 1, Values: "abc"}    rsp.Msg = "hello world"    rsp.Values = append(rsp.Values, "a", "b")    rsp.Type = model.RespType_DESCEND    return nil}func main() {    // 我这里用的etcd 做为服务发现,如果使用consul可以去掉    reg := etcdv3.NewRegistry(func(op *registry.Options){        op.Addrs = []string{            "http://192.168.3.34:2379", "http://192.168.3.18:2379", "http://192.168.3.110:2379",        }    })    // 初始化服务    service := micro.NewService(        micro.Name("lp.srv.eg1"),        micro.Registry(reg),    )    service.Init()    // 注册 Handler    model.RegisterSayHandler(service.Server(), new(Say))    // run server    if err := service.Run(); err != nil {        panic(err)    }}

    服务发现我使用的是etcdv3 替换了默认的consul

    micro.NewService 初始化服务,然后返回一个Service接口的实例,newService()方法的大概流程如下,

    5468b5a44496535ac5f5e96d081f548b.png

    先是给各个接口初始化默认值,再使用传入的值替换默认值,这也是go-micro可替换插件的地方。

    service有一个Init()可选方法,这是一个单例方法,

    func (s *service) Init(opts ...Option) {    // process options    for _, o := range opts {        o(&s.opts)    }    s.once.Do(func() {        // save user action        action := s.opts.Cmd.App().Action        // set service action        s.opts.Cmd.App().Action = func(c *cli.Context) {                .........//这里就不把代码全显示出来了                .........        }}

    用于始化cmd的一些信息

    service.Run()方法 调用流程

    c6f99a109f76054fb4ae12cd9a111959.png

    因为在初始化的时候没有指定端口,系统会自动分配一个端口号分给Server,并把这个server的信息注册到Register。

    BeferStart和AfterStart也都是可以自定义的

    client 端:

    func main() {    // 我这里用的etcd 做为服务发现,如果使用consul可以去掉    reg := etcdv3.NewRegistry(func(op *registry.Options){        op.Addrs = []string{            "http://192.168.3.34:2379", "http://192.168.3.18:2379", "http://192.168.3.110:2379",        }    })    // 初始化服务    service := micro.NewService(        micro.Registry(reg),    )    service.Init()    sayClent := model.NewSayService("lp.srv.eg1", service.Client())    rsp, err := sayClent.Hello(context.Background(), &model.SayParam{Msg: "hello server"})    if err != nil {        panic(err)    }    fmt.Println(rsp)}

    上面根据proto文件的生成的两个文件中有一个是rpc的接口文件,接口文件已经帮我们把调用方法的整个流程封装好了。

    只需要给出服务名称和licent就可以。然后调用Hello方法

    源码:

    func (c *sayService) Hello(ctx context.Context, in *SayParam, opts ...client.CallOption) (*SayResponse, error) {    req := c.c.NewRequest(c.name, "Say.Hello", in)    out := new(SayResponse)    err := c.c.Call(ctx, req, out, opts...)    if err != nil {        return nil, err    }    return out, nil}

    主要的流程里都在c.c.Call方法里。简单来说流程如下

    4dd74006fa3c816de662c31c58ea209a.png

    就是得到节点信息address,根据address去查询 pool里是否有连接,如果有则取出来,如果没有则创建,然后进行数据传输,传输完成后把client放回到pool内。pool的大小也是可以控制的,这部分的代码读起来特别爽,具体的细节和处理流程会在以后的帖子里详细讲解

    例子2

    例子1,做了一个简单的服务,已经不能再简单了,只是为了能让大家熟悉一下go-micro。看完例子1后应该会有更多的想法,想使用更多的go-micro的功能,比如protobuf生成的类都在一起,如果想model和api分开怎么处理,怎么使用go-micro的双向流,怎么使用消息推送,等等。所以我就双做了一个小例子,这个例子里包含了一些东西。

    2e586ef11f3f4c698cb318a5f13673c5.png

    这个例子我就只说一下组织结构,也没有多少代码,大家有时间看一下就ok了。

    proto下的两个文件夹,一个model一个rpcapi,是把数据和api分开,api引用了model

    看一下rpcapi

    syntax = "proto3";package rpcapi;import "github.com/lpxxn/gomicrorpc/example2/proto/model/common.proto";// 服务接口service Say {    rpc Hello(model.SayParam) returns (model.SayResponse) {}    rpc Stream(model.SRequest) returns (stream model.SResponse) {}}

    import了model里的common.proto

    在生成的时候一个只要go_out另一个只要micro_out就好了

      protoc --proto_path=$GOPATH/src:. --go_out=. example2/proto/model/*.proto     protoc --proto_path=$GOPATH/src:. --micro_out=. example2/proto/rpcapi/*.proto 

    订阅一个信息

        // Register Subscribers    if err := server.Subscribe(server.NewSubscriber(common.Topic1, subscriber.Handler)); err != nil {        panic(err)    }

    当有信息发送时,所有订阅了lp.srv.eg2.topic1这个信息的服务都会收到信息

    客户端发送信息

        p := micro.NewPublisher(common.Topic1, service.Client())    p.Publish(context.TODO(), &model.SayParam{Msg: lib.RandomStr(lib.Random(3, 10))})

    如果是生产环境一定不要用go-micro默认的信息发布和订阅处理方式,micro的插件plugin里是有很多成熟的插件。

    使用双向流的小功能

    这个方法只是每次向客户端发送一些数据,每次只发送一部分。比如我们给客户端推送的数据很大时,一次性全都推过去,是不太正确的做法,分批推送还是比较好的。

    func (s *Say) Stream(ctx context.Context, req *model.SRequest, stream rpcapi.Say_StreamStream) error {    for i := 0; i < int(req.Count); i++ {        rsp := &model.SResponse{}        for j := lib.Random(3, 5); j < 10; j++ {            rsp.Value = append(rsp.Value, lib.RandomStr(lib.Random(3, 10)))        }        if err := stream.Send(rsp); err != nil {            return err        }        // 模拟处理过程        time.Sleep(time.Microsecond * 50)    }    return nil    return nil}

    希望这个小例子能让大家入门go-micro.

    展开全文
  • Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具。
  • go微服务框架go-micro深度学习(一) 整体架构介绍 go微服务框架go-micro深度学习(二) 入门例子 go微服务框架go-micro深度学习(三) Registry服务的注册和发现 go微服务框架go-micro深度学习(四) rpc方法调用过程详解 ...
    展开全文
  • 点击上方蓝色“polarisxu”关注我,设个星标,不会让你失望用过或了解过 Micro 这个框架的人,可能有所耳闻,大家对其...前些天,有人问我有无其他 Go 微服务框架推荐,说 Micro 3.0.0 开始不能用了!!我听了一惊:...

    点击上方蓝色“polarisxu”关注我,设个星标,不会让你失望

    用过或了解过 Micro 这个框架的人,可能有所耳闻,大家对其抱怨比较多,典型的抱怨是升级后不兼容。比如网上有教程是基于 1.x,但新版本是 2.x,完全不一样了,而且似乎官方文档也没有及时更新,使用了它的人“痛苦不堪”。

    前些天,有人问我有无其他 Go 微服务框架推荐,说 Micro 3.0.0 开始不能用了!!

    我听了一惊:我只听说它不稳定,总是变来变去,兼容性不好,但没听说不能用。后来了解了下,原来 3.0 做了巨大的改变。主要有:

    • Micro 3.0 推荐叫做 M3O,微服务框架成为了云原生开发平台
    • 废弃了 Go-Micro
    • 开源 License 由 Apache 2.0 改为 Polyform Shield[1]

    说明一点,Micro 是一个公司:Micro Services, Inc。

    01 Micro 3.0 叫做 M3O,一个云原生开发平台

    在 11 月 05 日,官方宣布 Micro 3.0.0 发布。这不再是一个微服务框架,而是一个云原生平台。有什么不一样呢?

    官方在 3.0 版本对主要工具进行了重大重构,并将其整合到可以从开发人员的角度解决构建、运行、管理和使用这整个工作流的问题。

    为什么做这样的改变

    Micro 最初是作为微服务开发的工具包,它结合了 api 网关,Web dashboard 和 cli 与使用 Go RPC 框架构建的服务进行交互。因为考虑到那时让所有人重新购买 PaaS 感觉就像是一场失败的战斗。因此,官方选择围绕 RPC 框架编写单一用途的工具,以为它可以使人们逐步采用它,直到他们看到对平台的需求为止。

    虽然有一个简单的 Go 框架以及一些用于查询和与之交互的周围组件,但是就像任何长期存在的项目一样,随着试图解决瑞士军刀无法做到的那种平台体验,其复杂性也在增加,开发了许多独立的库。这对于用户而言,增加了认知上的负担。

    在 2019 年,官方对所有这些库进行了合并,这提供了极大的帮助,但始终仍然存在一个悬而未决的问题。micro 和 go-micro 有什么区别?一般我们将 go-micro 视为框架,将 micro 视为工具箱,但这样的划分似乎没有意义。

    过去 5 年,随着容器和容器编排成为焦点,“云原生”工具激增,世界爆炸了。更具体地说,Docker 和 Kubernetes 重新定义了技术领域,并更加有意识地转向在云中构建软件。

    Micro 甚至可以追溯到 2015 年,都具有前瞻性的观点。很明显,分布式系统和云原生将在未来几年内成为后端服务开发的主导模型,但是不清楚要花多长时间花折腾各种工具,例如 docker,kubernetes,grpc,istio 等。这感觉就像重新构建技术栈。Micro 希望解决整个工作流上的事情,而只是在微服务开发上。

    M3O 官方认为 PaaS 3.0 不仅是在运行容器甚至是源代码,而且还囊括了整个开发人员的经验,包括用于编写云代码的模型。因此它们打造了 Micro 3.0,或叫 M3O,这是用于云原生开发的平台。

    更多信息可以看 Micro 3.0.0 的发布公告[2]

    02 废弃 Go-Micro

    这个点上面已经做了一定说明。

    官方终止对 go-micro 的支持。这个项目自 2014 年创建至今,已经拥有 14.7k+ Star。作者认为尽管它为许多人解决了一些问题,但它并没有完成它的初衷。

    现在这个项目并没有直接放弃,而是转交到个人名下(Micro 公司的 CEO Asim),为了避免混淆,项目名也改了,叫 Nitro[3]。现在它是一个快速的分布式应用程序开发框架。

    虽然 go-micro 2.0 依然可以使用,但已经不维护。更多相信信息可以查看 Nitro 项目的 FAQ。

    03 Licence 改为 Polyform Shield

    Polyform Shield 这个 Licence 我是第一次见 ,相信很多人也是。官方的说法是:

    Micro 继续保持开源状态,但使用 Polyform Shield 进行了许可,这可以防止该软件被提取并作为服务运行。这是为了与 AWS 和其他运行开放源代码以谋取利益而不回馈的人抗衡。

    这个 Licence 是为了防止 AWS 这样的云服务部署 Micro 服务,和 Micro 公司进行直接竞争,其他情况下可以免费使用。因此不存在开头网友说的不让用的情况。

    值得一提的是,Nitro 项目的 Licence 也改为了 Polyform Shield。

    04 总结

    Micro 3.0 的出现,可能是顺应时代的产物。但从另一个角度,包括 Licence 的变更,一个靠开源项目活下去的公司不容易。M3O 是一个云原生(m3o.com)托管平台,有兴趣可以了解它的收费模式,这是开源项目公司进行商业化的一种方式。

    就像 Micro 的创始人 Asim 在 Nitro 项目的 FAQ 中说的:

    Go Micro 的维护,需要花费很多的时间精力,它属于 Micro Services,Inc. 公司,该公司现在专注于 Micro as a Service,并将此处的所有接口合并到该项目的服务库中。在大多数情况下,Go Micro 都没有资金支持,虽然得到过好评。因此,在坚持了 6 年后,在 3.0 版中,这个项目属于我个人(Asim),我做出了艰难的决定,要重新许可为非商业项目。对于任何商业应用程序,我正在寻找  github sponsorship[4],以便我可以将这些资金用于维护和支持工作。

    所以,如果你曾经喜欢 Micro 这个项目,建议你可以继续喜欢。当然也希望这次之后,版本能够更稳定。而我看了这些后,作为一个开源爱好者,我准备花时间研究研究 Micro,顺便写写笔记,希望为它的推广做一点贡献。

    参考资料

    [1]

    Polyform Shield: https://polyformproject.org/licenses/shield/1.0.0/

    [2]

    Micro 3.0.0 的发布公告: https://micro.mu/blog/2020/11/05/micro-v3-aka-m3o.html

    [3]

    Nitro: https://github.com/asim/nitro

    [4]

    github sponsorship: https://github.com/sponsors/asim


    往期推荐

    • I Have a Dream:写在 Go1.15.4 发布之计

    觉得不错,欢迎关注:

    005e58ab57b5f2801be02a1a323e2923.png

    点个赞、在看和转发是最大的支持

    展开全文
  • go微服务框架go-micro

    2019-08-14 10:55:28
    go微服务框架go-micro深度学习(一) 整体架构介绍 https://blog.csdn.net/mi_duo/article/details/82701732 go 微服务micro基础搭建 https://blog.csdn.net/meiyouwsm/article/details/83090639 在kubernetes上...

    go微服务框架go-micro深度学习(一) 整体架构介绍

    https://blog.csdn.net/mi_duo/article/details/82701732

     

    go 微服务micro基础搭建

    https://blog.csdn.net/meiyouwsm/article/details/83090639

    在kubernetes上部署Go Micro代码(一)

    https://blog.csdn.net/anakinsun/article/details/98392884

    Go - Micro微服务框架实践 - 常见问题

    https://blog.csdn.net/m0_37125796/article/details/89424174

    展开全文
  • 这是在新公司接触微服务框架(micro框架)后的总结,go微服务序列之一,在未来,我将会较深入的研究go和微服务,之后也会陆陆续续的发布一些文章,如果想直接查阅源码或者通过demo学习的,可以点击原文链接进入~如何...
  • Go 微服务框架 micro

    2021-01-08 05:33:20
    使用 micro 微服务框架+代码生成器提高开发效率  持续集成:代码提交后,自动发布测试环境  使用分布式调用链追踪  优先拆分简单服务,目前定先拆封面点赞模块,进行试水 使用 k8s 部署、服务伸缩、故障恢复 ...
  • 作者:稀饭下雪链接:https://www.jianshu.com/p/9cb474dd451d来源:简书在前两篇系列博文中,我已经实现了user-srv、web-srv、api-srv,在新的一篇博文中,我要讲解的是如何在项目中...这里用的是go微服务框架...
  • gRPC框架使用上节课已经学习了gRPC基本知识,对gRPC有了初步的认识。本节课通过编程实现gRPC编程。定义服务我们想要实现的是通过gRPC框架进行远程服务调用,首先第一步应该是要有服务。利用之前所掌握的内容,gRPC...
  • 文章目录go微服务框架kratos学习笔记三(构建单独的http或者grpc demo项目)grpchttp go微服务框架kratos学习笔记三(构建单独的http或者grpc demo项目) 前面两篇跑通了demo项目,和大概了解了kratos demo整体结构,本...
  • 这次更新修复了旧框架中的所有主要问题,尽管它的的主要项目结构和接口都没有改变,具体改动内容请参见清晰架构(Clean Architecture)的Go微服务—重大升级。 现在它几乎拥有了我理想框架中的所有内容。它是一个轻...
  • 摘要: 上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go...上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,...
  • KratosKratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具。名字来源于:《战神》游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成为战神并展开弑神屠杀的冒险历程。Goals我们致力于...
  • KratosKratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具。名字来源于:《战神》游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成为战神并展开弑神屠杀的冒险历程。Goals我们致力于...
  • go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) 文章目录go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)demodemo serverdemo client池daoservicep2croundrobingrpc官方负载均衡...
  • go微服务框架kratos学习笔记十(熔断器) 文章目录go微服务框架kratos学习笔记十(熔断器)什么是熔断熔断器逻辑kratos Breakerkratos 熔断逻辑kratos熔断器使用说明bladmaster client breaker配置说明test 什么是熔断 ...
  • Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具:HTTP框架: Blademaster(bm)基于gin二次开发,具有快速、灵活的特点,可以方便的开发中间件处理通用或特殊逻辑,基础库默认实现了log&...
  • go 语言微服务实践原文链接 1024coder.com简介近一两年来,微服务架构已经成为热门话题(microservices.io),与传统的一体化应用架构相比,微服务架构在开发、测试、部署方面都有众多吸引人之处,越来越多没有历史...
  • Micro作为go-micro[1]——一个微服务框架开始了它的旅程,专注于提供微服务开发的核心需求。它通过抽象出分布式系统的复杂性,为构建微服务创造了更简单的体验。随着时间的推移,我们已经从go-micro扩展到其他工具、...
  • go微服务框架kratos学习笔记八(kratos的依赖注入) 文章目录go微服务框架kratos学习笔记八(kratos的依赖注入)什么是依赖注入google wirekratos中的wireProvidersinjector(注入器)Binding Interfaces 笔记二提过依赖...
  • go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) 文章目录go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)zipkin使用demo数据持久化 当代的互联网的服务,通常都是用复杂的、大规模分布式集群来...
  • 摘要: 上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go...上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,...
  • KratosKratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具。名字来源于:《战神》游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成为战神并展开弑神屠杀的冒险历程。Goals我们致力于...
  • KratosKratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具。名字来源于:《战神》游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成为战神并展开弑神屠杀的冒险历程。Goals我们致力于...
  • KratosKratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具。名字来源于:《战神》游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成为战神并展开弑神屠杀的冒险历程。Goals我们致力于...
  • KratosKratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具。名字来源于:《战神》游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成为战神并展开弑神屠杀的冒险历程。Goals我们致力于...
  • KratosKratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具。名字来源于:《战神》游戏以希腊神话为背景,讲述由凡人成为战神的奎托斯(Kratos)成为战神并展开弑神屠杀的冒险历程。Goals我们致力于...
  • Kratos是bilibili开源的一套Go微服务框架,包含大量微服务相关框架及工具:基于gin二次开发,具有快速、灵活的特点,可以方便的开发中间件处理通用或特殊逻辑,基础库默认实现了log&trace等。基于官方gRPC封装,...

空空如也

空空如也

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

go微服务框架