「go-micro」学习笔记2——安装与应用

go-micro的安装与使用

  • 安装与应用
    • 安装
      • Micro
      • Go-Micro
      • protobuf
      • gRPC 网关
        • protobuf
        • 安装插件
    • Micro 命令
      • 创建服务
      • 启动、运行服务
      • 服务状态
      • 结束服务
      • 部署服务
      • 调用服务
    • 第一个应用
      • micro new
      • 执行 .proto 文件
      • 启动服务
      • 调用服务

安装与应用

安装

Micro

# go get
$ go get github.com/micro/micro/v2

# docker install
$ docker pull microhq/micro

Go-Micro

Go Micro是Go开发微服务的RPC框架 (用2.x好了)

$ go get github.com/micro/go-micro/v2

protobuf

如果使用代码生成,您还需要使用protoc-gen-go

$ go get github.com/micro/protobuf/{
     proto,protoc-gen-go}

gRPC 网关

protobuf

mkdir tmp
cd tmp
git clone https://github.com/google/protobuf
cd protobuf
./autogen.sh
./configure
make
make check
sudo make install

安装插件

go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go get -u github.com/micro/protobuf/protoc-gen-go

Micro 命令

创建服务

# 新建一个服务
$ micro new service-name

NAME:
   micro new - Create a new micro service

USAGE:
   micro new [command options] [arguments...]

OPTIONS:
   --namespace "go.micro"	Namespace for the service e.g com.example
   --type "srv"				Type of service e.g api, srv, web
   --fqdn 					FQDN of service e.g com.example.srv.service (defaults to namespace.type.alias)
   --alias 					Alias is the short name used as part of combined name if specified

启动、运行服务

# 在本地运行该服务并确保其正常工作.
# 启动服务器
micro server

# 设置为本地环境
micro env set local

# 启动服务
micro run service-name

服务状态

# 检查状态
micro status

# 检查是否已注册
micro services

# 检查日志
micro logs service-name

结束服务

micro kill service-name

部署服务

# 将代码上传到 Github 才能完成部署

# 初始化 git
cd service-name && git init && git add . && git commit -m "My helloworld service"

# 在 github 创建一个新的仓库并推送上去
# assuming you created it, add the remote origin
git remote add origin https://github.com/$user/service-name.git

# 推送
git push origin master

# 设置环境为平台模式
micro env set platform

# 确保已经登陆到平台
micro login

# 现在可以运行了
micro run github.com/$user/service-name

调用服务

检查服务在运行并调用该服务。另外因为是从源码构建的,可能需要几分钟才能启动 (后续我们会优化这个情况)

# 检查服务状态
micro status

# 检查服务注册情况
micro services

# 调用指定的服务
micro helloworld --name=Alice

注意调用服务的符号. Micro 支持动态的 CLI 命令,这意味着你的命名空间下的任何东西都将成为一个子命令.

micro [service] [endpoint] [args]

在终结点被提交的地方, 我们假设它是服务名称 + “呼叫” 方法, 例如 helloworld 成为 Helloworld. call 。如果这是一个问候方法,我们将假设 Helloworld. 问候与 c 在 c.micro helloworld greet

我们假设有一个服务名称 + “Call” 的方法是一个终结点。例如 helloworld 会是 Helloworld.Call. 如果是 Greet 方法我们会假设 Helloworld.Greet 对应的命令为 micro helloworld greet.

参数可以作为标志传递 --name 表示的就是 Name 字段参数.

如果你想要一个使用纯 json 和原始方法的更简单方式

micro call helloworld Helloworld.Call '{"name": "Alice"}'

第一个应用

micro new

使用micro new hello创建了一个hello的微服务,并得到一个这样的目录结构。

.
├── main.go
├── generate.go
├── plugin.go
├── handler
│   └── hello.go
├── subscriber
│   └── hello.go
├── proto
│   └── hello
│       └── hello.proto
├── Dockerfile
├── Makefile
├── README.md
├── .gitignore
└── go.mod

执行 .proto 文件

进入 hello 目录,并执行:

make proto

启动服务

执行 main.go 函数

go run main.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: "World",
    })
    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!")
}

你可能感兴趣的:(Golang,go,微服务,golang)