• go-micro


    1.安装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
    

    2.其他安装方式

    # 安装方式一
    export GO111MODULE=on
    export GOPROXY=https://goproxy.io
    go get -u -v github.com/micro/micro
    cd $GOPATH/src/github.com/micro/micro
    go build -o micro main.go
    sudo cp micro /usr/local/bin/
    
    # 安装方式二
    
    cd $GOPATH/src/github.com/micro/
    git clone https://github.com/micro/micro.git
    cd $GOPATH/src/github.com/micro/micro
    go build -o micro main.go
    sudo cp micro /usr/local/bin/
    
    安装 go-micro 和protoc-gen-micro
    go get -u -v github.com/micro/go-micro
    go get github.com/micro/protoc-gen-micro
    

    3.安装 protoc

    # 源码安装,下载最新版,目前是 v3.10.1
    
    wget https://github.com/protocolbuffers/protobuf/releases/download/v3.10.1/protobuf-all-3.10.1.tar.gz
    tar zxvf protobuf-all-3.10.1.tar.gz
    cd protobuf-3.10.1/
    ./autogen.sh
    ./configure
    make
    make install
    protoc -h
    
    # 或者
    git clone https://github.com/google/protobuf
    cd protobuf
    ./autogen.sh
    ./configure
    make
    make check
    sudo make install
    
    # 安装protoc-gen-go
    go get -u -v github.com/golang/protobuf/protoc-gen-go
    
    # 生成代码
    protoc --proto_path=$GOPATH/src:. --micro_out=. --go_out=. xxx.proto
    

    说明:
    所需二进制文件:micro、protoc-gen-micro、protoc、

    4.生成微服务框架

    cd micro-demo
    micro new hello/srv --type=srv --alias=hello --namespace=io.github.xxx --gopath=false
    
    //实践案例:
    root@localhost:src/micro-example# micro new --type service  micro-example/rpc/srv
    Creating service go.micro.service.srv in micro-example/rpc/srv
    
    .
    ├── main.go
    ├── generate.go
    ├── plugin.go
    ├── handler
    │   └── srv.go
    ├── subscriber
    │   └── srv.go
    ├── proto/srv
    │   └── srv.proto
    ├── Dockerfile
    ├── Makefile
    ├── README.md
    ├── .gitignore
    └── go.mod
    
    
    download protoc zip packages (protoc-$VERSION-$PLATFORM.zip) and install:
    
    visit https://github.com/protocolbuffers/protobuf/releases
    
    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
    
    compile the proto file srv.proto:
    
    cd micro-example/rpc/srv
    protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/srv/srv.proto
    
    ---------------------------------------------------------------------------------
    
    root@cwj-PC:/usr/workspace/gocode/TestCode/src# micro new --type api micro-example/rpc/api
    Creating service go.micro.api.api in micro-example/rpc/api
    
    .
    ├── main.go
    ├── generate.go
    ├── plugin.go
    ├── client
    │   └── api.go
    ├── handler
    │   └── api.go
    ├── proto/api
    │   └── api.proto
    ├── Makefile
    ├── Dockerfile
    ├── README.md
    ├── .gitignore
    └── go.mod
    
    
    download protoc zip packages (protoc-$VERSION-$PLATFORM.zip) and install:
    
    visit https://github.com/protocolbuffers/protobuf/releases
    
    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
    
    compile the proto file api.proto:
    
    cd micro-example/rpc/api
    protoc --proto_path=.:$GOPATH/src --go_out=. --micro_out=. proto/api/api.proto
    
    ----------------------------------------------------------------------------------
    
    root@localhost:src# micro new --type "web" micro-example/rpc/web
    Creating service go.micro.web.web in micro-example/rpc/web
    
    .
    ├── main.go
    ├── plugin.go
    ├── handler
    │   └── handler.go
    ├── html
    │   └── index.html
    ├── Dockerfile
    ├── Makefile
    ├── README.md
    ├── .gitignore
    └── go.mod
    
    链接:https://www.codeleading.com/article/6791963704/	
    

    命令说明:

    配置指令 作用 默认值 说明
    –namespace 服务命令空间 go.micro 可以根据自己的域名定义合适的空间前缀
    –type 服务类型 srv 目前支持4种服务类型,分别是api、fnc(function)、srv(service)、web。
    –alias 指定别名 声明则必填 使用单词,不要带任何标点符号,名称对Micro路由机制影响很大
    –plugin 使用哪些插件 声明则必填 需要自选插件时使用
    –gopath 是否使用GOPATH作为代码路径 true或者false 使用go modules 可以设置为false
    –fqdn 服务定义域,API需要通过该域找到服务 默认是使用服务的命令空间加上类型再加上别名 服务定义域

    5.创建一个服务

    //创建一个新的服务对象实例
        service := micro.NewService(
            micro.Name("helloservice"),
            micro.Version("v1.0.0"),
        )
    

    6.编写proto文件,生成go文件

    protoc --go_out=plugins=micro:. message.proto
    
    protoc --proto_path=./:. --micro_out=. --go_out=. ./message.proto
    
    
    protoc参数说明:
    
    --proto_path - proto文件目录
    --micro_out - 生成的micro源码保存目录
    --go_out - 生成的go源码保存目录
    proto/xxx.proto - 最后面的参数就是我们要编译的proto文件
    

    7.错误记录

    (1.)缺乏包路径

    2020/04/26 16:33:39 WARNING: Missing 'go_package' option in "hello.proto", please specify:
            option go_package = ".;protoes";
    A future release of protoc-gen-go will require this be specified.
    See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
    

    解决办法:

    //package message;  //注释掉包
    option go_package = ".;protoes";   //新增该行
    
    参考:https://learnku.com/articles/43758
    

    8.服务启动后,测试

    (1.)命令行测试

    micro call 服务名 接口 参数
    
    说明:服务名是我们启动微服务定义的唯一标识,接口的格式是:proto文件定义的service名字 + rpc接口名
    使用示例:
    micro call go.micro.api.orderservice OrderSrv.GetOrder '{"id":1}'
    

    (2.)web界面测试

    // 启动web
    micro web
    //访问localhost:8082
    

    9.基于consul/etcd的服务注册

    MICRO_REGISTRY=consul 
    MICRO_REGISTRY_ADDRESS=127.0.0.1:8500 
    go run orderservice.go
    
    MICRO_REGISTRY - 注册中心类型,这里设置为consul
    MICRO_REGISTRY_ADDRESS - 注册中心地址, IP + PORT的形式
    
    ---------------------------------------------------------
    MICRO_REGISTRY= etcd 
    MICRO_REGISTRY_ADDRESS=127.0.0.1:2379 
    go run orderservice.go
    
    MICRO_REGISTRY - 注册中心类型,这里设置为etcd
    MICRO_REGISTRY_ADDRESS - 注册中心地址, IP + PORT的形式
    

    10.API网关示例

    (1.)反向代理的方式

    1.下载代码
    git clone https://github.com/micro/examples
    
    2.切换到例子源码根目录
    cd examples
    
    3. 启动基础服务
    go run greeter/srv/main.go
    
    4. 新打开一个命令窗口,启动api服务,这就是我们说的聚合服务
    go run greeter/api/api.go
    
    5. 新打开一个命令窗口,启动go micro api网关
    micro api --handler=api
    
    6.测试网关API
    curl "http://localhost:8080/greeter/say/hello?name=John"
    
    {"message":"Hello John"} // 输出结果
    

    (2.)Restful方式
    安装go-restful库来实现RESTful风格的路径映射,从而实现HTTP的WEB API服务

    go get github.com/emicklei/go-restful
    

    (3.)Rest映射

    type Student struct {
    }
    
    var (
        cli proto.StudentService
    )
    
    func (s *Student) GetStudent(req *restful.Request, rsp *restful.Response) {
    
        name := req.PathParameter("name")
        fmt.Println(name)
        response, err := cli.GetStudent(context.TODO(), &proto.Request{
            Name: name,
        })
    
        if err != nil {
            fmt.Println(err.Error())
            rsp.WriteError(500, err)
        }
    
        rsp.WriteEntity(response)
    }
    
    func main() {
    
        service := web.NewService(
            web.Name("go.micro.api.student"),
        )
    
        service.Init()
    
        cli = proto.NewStudentService("go.micro.srv.student", client.DefaultClient)
    
        student := new(Student)
        ws := new(restful.WebService)
        ws.Path("/student")
        ws.Consumes(restful.MIME_XML, restful.MIME_JSON)
        ws.Produces(restful.MIME_JSON, restful.MIME_XML)
    
        ws.Route(ws.GET("/{name}").To(student.GetStudent))
    
        wc := restful.NewContainer()
        wc.Add(ws)
    
        service.Handle("/", wc)
    
        if err := service.Run(); err != nil {
            log.Fatal(err)
        }
    }
    
    参考链接:
    https://www.qfgolang.com/?special=go-microweifuwukuangjia&pid=2620
    

    11.micro web后台

    1.启动web后台

    micro web
    通过http://localhost:8082访问后台
    

    2.使用注册中心启动web后台

    MICRO_REGISTRY=consul 
    MICRO_REGISTRY_ADDRESS=127.0.0.1:8500 
    micro web
    

    12.micro实现发布订阅模式

    (1.)消息组件初始化

    ...
    server := micro.NewService(
            micro.Name("go.micro.srv"),
            micro.Version("latest"),
            micro.Broker(mqtt.NewBroker()),
    )
    ...
    

    (2.)消息订阅

    pubSub := service.Server().Options().Broker
    _, err := pubSub.Subscribe("go.micro.srv.message", func(event broker.Event) error {
            var req *message.StudentRequest
            if err := json.Unmarshal(event.Message().Body, &req); err != nil {
                return err
            }
            fmt.Println(" 接收到信息:", req)
            //去执行其他操作
    
            return nil
        })
    

    (3.)消息发布

    brok := service.Server().Options().Broker
    if err := brok.Connect(); err != nil {
        log.Fatal(" broker connection failed, error : ", err.Error())
    }
    
    student := &message.Student{Name: "davie", Classes: "软件工程专业", Grade: 80, Phone: "12345678901"}
    msgBody, err := json.Marshal(student)
    if err != nil {
        log.Fatal(err.Error())
    }
    msg := &broker.Message{
        Header: map[string]string{
            "name": student.Name,
        },
        Body: msgBody,
    }
    
    err = brok.Publish("go.micro.srv.message", msg)
    if err != nil {
        log.Fatal(" 消息发布失败:%s
    ", err.Error())
    } else {
        log.Print("消息发布成功")
    }
    

    相关链接

    https://www.qfgolang.com/?special=go-microweifuwukuangjia
    http://entere.github.io/2019/10/29/go-micro微服务教程一:搭建go-micro运行环境/
    https://songyuchao.cn/blog/protobuf-for-go-micro/
    https://www.tizi365.com/archives/486.html

  • 相关阅读:
    学生管理系统代写
    学生竞赛评价系统
    《划时代51单片机C语言全新教程》前言
    《划时代51单片机C语言全新教程》第三章 开发环境 概览
    校验和
    NBOOT分析-S3C244xInit.s(1)
    《划时代51单片机C语言全新教程》第一章 8051简介 概览
    《划时代51单片机C语言全新教程》第二章 STC89C52RC 处理器 概览
    ARM9中断调试(1)
    NBOOT分析-NBOOT.c(2)
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/12936651.html
Copyright © 2020-2023  润新知