[Go 微服务] go-micro + consul 的使用

07-03 1692阅读

文章目录

      • 1.go-micro 介绍
      • 2.go-micro 的主要功能
      • 3.go-micro 安装
      • 4.go-micro 的使用
        • 4.1 创建服务端
        • 4.2 配置服务端 consul
        • 4.3 生成客户端
        • 5.goodsinfo 服务
          • 5.1 服务端开发
          • 5.2 客户端开发

            1.go-micro 介绍

            Go Micro是一个简化分布式开发 的微服务生态系统,该系统为开发分布式应用程序提供了 高效, 便捷的模块构建, 主要目的是 简化分布式系统的开发,它默认实现了 consul作为服务发现(2019年源码修改了默认使用 mdns),通过 http进行通信,通过 protobuf和 json进行编解码,可以方便开发者们非常简单的开发出微服务架构的项目,并且随着业务模块的增加和功能的增加,Go Micro还能够提供管理微服务环境的工具和功能。

            2.go-micro 的主要功能

            1. 身份验证
            2. 动态配置
            3. 数据存储
            4. 服务发现: 自动服务注册和 名称解析,服务发现是 微服务开发的核心,当服务 A 需要与服务 B 通话时,它需要该服务的位置,默认发现机制是 多播 DNS (mdns),一个 zeroconf 系统。
            5. 负载均衡
            6. 消息编码: 基于 内容类型的 动态消息编码,客户端和服务器将使用 编解码器和 内容类型无缝编码和解码 Go 类型,任何种类的消息都可以被编码并从不同的客户端发送,默认情况下,客户端和服务器会处理此问题,这默认包括 protobuf 和 json。
            7. RPC 客户端/服务器
            8. Async Messaging: PubSub 作为 异步通信和 事件驱动架构的一等公民内置, 事件通知是 微服务开发的核心模式,默认消息系统是 HTTP 事件消息代理。
            9. 事件流: 从偏移量和确认中消耗,Go Micro 包括对 NATS Jetstream 和 Redis 流的支持。
            10. 同步分布式系统通常以 最终一致的方式构建,对 分布式锁定和 领导(Leader)的支持作为同步接口内置,当使用 最终一致的数据库或 调度时,请使用 Sync 接口。
            11. Pluggable Interfaces: Go Micro 为每个分布式系统抽象使用 Go 接口,因此,这些接口是 可插拔的,并 允许 Go Micro 与运行时无关,可以插入任何底层技术。

            3.go-micro 安装

            go install github.com/go-micro/cli/cmd/go-micro@latest
            

            [Go 微服务] go-micro + consul 的使用

            [Go 微服务] go-micro + consul 的使用

            4.go-micro 的使用

            4.1 创建服务端
            go-micro new service helloworld
            

            [Go 微服务] go-micro + consul 的使用

            [Go 微服务] go-micro + consul 的使用

            #init里面的命令:引入需要的包
            go get -u google.golang.org/protobuf/proto
            go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
            go install github.com/go-micro/generator/cmd/protoc-gen-micro@latest
            #proto:执行生成对应的protobuf相关文件
            protoc --proto_path=. --micro_out=. --go_out=:. proto/helloworld.proto
            

            会生成相关 .pd.go 文件

            [Go 微服务] go-micro + consul 的使用

            go mod tidy
            

            [Go 微服务] go-micro + consul 的使用

            go get go-micro.dev/v4
            

            [Go 微服务] go-micro + consul 的使用

            4.2 配置服务端 consul
            go get github.com/go-micro/plugins/v4/registry/consul
            

            [Go 微服务] go-micro + consul 的使用

            # 实例化consul
            consulReg := consul.NewRegistry()
            # 注册consul
            srv := micro.NewService(
                micro.Address("192.168.1.132:8080"),  // 选择注册服务器地址,默认为本机,也可以选择consul集群中的client
                micro.Name(service),
                micro.Version(version),
                micro.Registry(consulReg),
            )
            

            main.go

            package main
             
            import (
                "helloworld/handler"
                pb "helloworld/proto"
                "go-micro.dev/v4"
                "go-micro.dev/v4/logger"
                "github.com/go-micro/plugins/v4/registry/consul"
            )
             
            var (
                service = "helloworld"
                version = "latest"
            )
             
            func main() {
                //集成consul
                consulReg := consul.NewRegistry()
                // Create service
                srv := micro.NewService(
                    micro.Address("127.0.0.1:8080"),  //指定微服务的ip:  选择注册服务器地址,也可以不配置,默认为本机,也可以选择consul集群中的client
                    micro.Name(service),
                    micro.Version(version),
                    //注册consul
                    micro.Registry(consulReg),
                )
                srv.Init(
                    micro.Name(service),
                    micro.Version(version),
                )
             
                // Register handler
                if err := pb.RegisterHelloworldHandler(srv.Server(), new(handler.Helloworld)); err != nil {
                    logger.Fatal(err)
                }
                // Run service
                if err := srv.Run(); err != nil {
                    logger.Fatal(err)
                }
            }
            
            go run main.go
            

            [Go 微服务] go-micro + consul 的使用

            [Go 微服务] go-micro + consul 的使用

            服务端配置操作完成

            4.3 生成客户端
            go-micro new client helloworld
            

            [Go 微服务] go-micro + consul 的使用

            [Go 微服务] go-micro + consul 的使用

            需要把helloworld/proto修改为helloworld-client/proto

            [Go 微服务] go-micro + consul 的使用

            go mod tidy
            go get github.com/go-micro/plugins/v4/registry/consul 
            

            main.go

            package main
             
            import (
                "context"
                "time"
                pb "helloworld-client/proto"
                "go-micro.dev/v4"
                "go-micro.dev/v4/logger"   
                "go-micro.dev/v4/registry"
                "github.com/go-micro/plugins/v4/registry/consul"
            )
             
            var (
                service = "helloworld" //需要和微服务服务端对应的service名统一,这样才能调用该微服务
                version = "latest"
            )
             
            func main() {
                //集成consul
                consulReg := consul.NewRegistry(
                    //指定微服务的ip:  选择注册服务器地址,默认为本机,也可以选择consul集群中的client
                    registry.Addrs("127.0.0.1:8500"),
                )
                // Create service
                srv := micro.NewService(
                    //注册consul
                    micro.Registry(consulReg),
                )
                srv.Init()
             
                // 创建客户端实例
                c := pb.NewHelloworldService(service, srv.Client())
                for {
                    // Call service: CallRequest就是.proto中的
                    rsp, err := c.Call(context.Background(), &pb.CallRequest{Name: "张三"})
                    if err != nil {
                        logger.Fatal(err)
                    }
             
                    logger.Info(rsp)
                    //每隔一段时间请求
                    time.Sleep(2 * time.Second)  // 每隔2秒请求
                }
            }
            

            客户端:

            [Go 微服务] go-micro + consul 的使用

            服务端:

            [Go 微服务] go-micro + consul 的使用

            客户端配置操作完成

            5.goodsinfo 服务

            5.1 服务端开发
            go-micro new service goodsinfo
            

            goodsinfo.proto

            syntax = "proto3";
             
            package goodsinfo;
             
            option go_package = "./proto;goodsinfo";
             
            //商品相关方法
            service Goodsinfo {
                //AddGoods: 定义增加商品的微服务, 这里的写法和gRPC中的写法一致
                rpc AddGoods(AddRequest) returns (AddResponse) {}
            }
             
            //和gRPC中的写法一致
            message AddRequest {
                string title = 1;
                string price = 2;
                string content = 3;
            }
             
            //和gRPC中的写法一致
            message AddResponse {
                string message = 1;
                bool success = 2;
            }
            
            #init:引入相关包
            go get -u google.golang.org/protobuf/proto
            go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
            go install github.com/go-micro/generator/cmd/protoc-gen-micro@latest
            #proto: 生成protobuf相关文件
            protoc --proto_path=. --micro_out=. --go_out=:. proto/goodsinfo.proto
            
            go get go-micro.dev/v4
            go mod tidy
            

            修改远程调用的方法handler/goodsinfo.go

            package handler
             
            import (
                "context"
                "go-micro.dev/v4/logger"
                pb "goodsinfo/proto"
            )
             
            type Goodsinfo struct{}
             
            func (e *Goodsinfo) AddGoods(ctx context.Context, req *pb.AddRequest, rsp *pb.AddResponse) error {
                logger.Infof("request: %v", req)
                //书写返回的逻辑结果
                rsp.Message = "增加成功"
                rsp.Success = true
                return nil
            }
            

            引入consul

            go get github.com/go-micro/plugins/v4/registry/consul 
            

            maiin.go

            package main
             
            import (
             
                "goodsinfo/handler"
                pb "goodsinfo/proto"
                "go-micro.dev/v4"
                "go-micro.dev/v4/logger"
                "github.com/go-micro/plugins/v4/registry/consul"
            )
             
            var (
                service = "goodsinfo"
                version = "latest"
            )
             
            func main() {
                //集成consul
                consulReg := consul.NewRegistry()
                // Create service
                srv := micro.NewService(
                    micro.Address("127.0.0.1:8080"),  //指定微服务的ip:  选择注册服务器地址,也可以不配置,默认为本机,也可以选择consul集群中的client
                    micro.Name(service),
                    micro.Version(version),
                    //注册consul
                    micro.Registry(consulReg),
                )
                srv.Init(
                    micro.Name(service),
                    micro.Version(version),
                )
             
                // Register handler
                if err := pb.RegisterGoodsinfoHandler(srv.Server(), new(handler.Goodsinfo)); err != nil {
                    logger.Fatal(err)
                }
                // Run service
                if err := srv.Run(); err != nil {
                    logger.Fatal(err)
                }
            }
            
            go run main.go
            

            [Go 微服务] go-micro + consul 的使用

            [Go 微服务] go-micro + consul 的使用

            服务端开发成功

            5.2 客户端开发

            [Go 微服务] go-micro + consul 的使用

            go get go-micro.dev/v4
            go get github.com/go-micro/plugins/v4/registry/consul
            go mod tidy
            

            main.go

            package main
             
            import (
                "context"
                "go-micro.dev/v4/registry"
                "time"
                pb "goodsinfo-client/proto"
                "go-micro.dev/v4"
                "go-micro.dev/v4/logger"
                "github.com/go-micro/plugins/v4/registry/consul"
            )
             
            var (
                service = "goodsinfo"
                version = "latest"
            )
             
            func main() {
                //集成consul
                consulReg := consul.NewRegistry(
                    //指定微服务的ip:  选择注册服务器地址,默认为本机,也可以选择consul集群中的client
                    registry.Addrs("127.0.0.1:8500"),
                    )
                // Create service
                srv := micro.NewService(
                    //注册consul
                    micro.Registry(consulReg),
                )
             
                srv.Init()
             
                // 创建客户端服务
                c := pb.NewGoodsinfoService(service, srv.Client())
             
                // Call service
                rsp, err := c.AddGoods(context.Background(), &pb.AddRequest{
                    Title: "我是一个商品",
                    Price: "20.22",
                    Content: "内容展示",
                })
                if err != nil {
                    logger.Fatal(err)
                }
             
                logger.Info(rsp)
            }
            

            [Go 微服务] go-micro + consul 的使用

            go run .\main.go
            

            [Go 微服务] go-micro + consul 的使用

            客户端开发成功, 并通过consul调用服务端的请求

            [Go 微服务] go-micro + consul 的使用

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]