使用micro创建微服务

概述

micro是一个工具集,用来帮助开发者创建和管理微服务。它包括两部分:

  • go-micro:它是一个go语言的微服务开发框架。
  • micro:它是一个命令行工具,这个工具是基于go-micro开发的。

另外go-plugins作为一组插件,在开发过程中也是必要的。通过插件,我们在服务发现、异步消息和传输协议等方面有了更多的选择。

go-micro的体系架构

go-micro的设计目标是简化微服务的开发和分布式系统的创建。
使用micro创建微服务_第1张图片

安装micro

在golang 1.14以后需要使用如下命令进行micro的安装:

export GO111MODULE=on
go get github.com/micro/micro/v2

在安装结束后,如下命令可以确认安装是否正确完成:

micro --version

如果显示如下信息,则可确认micro已经正确安装:
成功
在成功安装了micro后,我们就可以进行微服务的开发了。

开发

创建项目

作为开发的第一步,我们可以使用如下命令创建一个项目:

micro new helloworld --namespace=com.pera --gopath=false

参数说明

  • micro new:创建一个gRPC服务;
  • helloworld:指定服务的名称;
  • –namespace=com.pera:为服务提供一个命名空间;
  • –gopath=false:在当前目录中生成代码,而不是在$GOPATH中生成代码;

项目结构

在我们执行完项目创建命令后,micro会给我们生成如下结构的项目文件:
使用micro创建微服务_第2张图片

项目文件说明

  • main.go:项目主文件;
  • generate.go:用于整合go generate。确保在go generate执行过程中可以自动调用make proto;
  • plugin.go:初始情况下是一个空文件,主要用于管理所有需要使用的插件;
  • proto/helloworld/helloworld.proto:gRPC的服务定义文件,定义了一个名为Helloworld的服务。在这个服务里定义了三种典型的RPC方法:unary RPC,server streaming RPC和bidirectional streaming RPC;
  • proto/helloworld/helloworld.pb.go:是protoc编译proto文件生成的go语言的源代码文件;
  • proto/helloworld/helloworld.pb.micro.go:通过protoc-gen-micro生成的go语言的源代码文件,用于进一步简化开发者工作。它定义了HelloworldService接口和HelloworldHandler接口;
  • handler/helloworld.go:用于实现具体的业务逻辑。它定义了一个实现了HelloworldHandler接口的名为Helloworld的结构体;
  • subscriber/helloworld.go:实现了消息的异步处理。在这个文件中它提供了两种处理异步消息的方法:一个是通过结构体的方法,另一个是通过函数;
  • Dockerfile:定义如何基于项目文件创建一个docker的镜像;
  • Makefile:定义了一些常用的任务,如:编译、测试、创建docker镜像等;
  • README.md:包含项目的基础信息;
  • .gitignore:定义不需要进行版本管理的文件,默认需要忽略的文件是:helloworld-service;
  • go.mod:go的模块文件;

安装依赖

在成功创建项目后,需要使用如下命令,安装项目需要的依赖:

go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
export GO111MODULE=on 
go get -u github.com/micro/protoc-gen-micro/v2
go get github.com/micro/go-micro/[email protected]

执行

在使用micro创建的项目中会有一个Makefile文件,在此文件中包括了一些常用的任务,我们可以使用make命令来编译和运行项目:

make build && ./helloworld-service

在项目成功编译后,在命令行中会显示如下信息:
运行

启动过程

一个服务的具体启动过程可以参考main.go文件:

package main

import (
	log "github.com/micro/go-micro/v2/logger"
	"github.com/micro/go-micro/v2"
	"helloworld/handler"
	"helloworld/subscriber"

	helloworld "helloworld/proto/helloworld"
)

func main() {
	// New Service
	service := micro.NewService(
		micro.Name("go.micro.service.helloworld"),
		micro.Version("latest"),
	)

	// Initialise service
	service.Init()

	// Register Handler
	helloworld.RegisterHelloworldHandler(service.Server(), new(handler.Helloworld))

	// Register Struct as Subscriber
	micro.RegisterSubscriber("go.micro.service.helloworld", service.Server(), new(subscriber.Helloworld))

	// Run service
	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

从main.go文件可以清楚的看到,一个服务的启动包括了如下三个过程:

创建和初始化服务

// New Service
	service := micro.NewService(
		micro.Name("go.micro.service.helloworld"),
		micro.Version("latest"),
	)

我们使用NewService(opts …Option) Service方法来创建一个服务。这个方法可以接收多个Option作为参数,然后返回一个service实例。

通过Option我们可以控制service的行为。

在我们创建完服务实例后,就可以通过如下代码对服务进行初始化:

// Initialise service
	service.Init()

服务的Init()方法可以接收和NewService()同样的参数。

在这个阶段实际上服务的实例已经创建完成,所以我们可以通过如下方式,获取实例的基本信息。如获取服务器的元数据信息:

// Initialise service
	service.Init(micro.AfterStart(func() error {
		log.Infof("server's meta: %v\n", service.Options().Server.Options().Metadata)
		return nil
	}))

注册业务逻辑处理器

// Register Handler
	helloworld.RegisterHelloworldHandler(service.Server(), new(handler.Helloworld))

	// Register Struct as Subscriber
	micro.RegisterSubscriber("go.micro.service.helloworld", service.Server(), new(subscriber.Helloworld))

只有在注册完业务逻辑处理器后,我们的服务才能真正的对外提供业务能力。

通常有两种典型的操作:

  1. 注册一个gRPC处理器:首先创建一个Helloworld对象,并把这个对象注册到服务器上。因为Helloworld实现了HelloworldHandler接口,所以它可以被传递到helloworld.RegisterHelloworldHandler方法中,否则会产生错误。在一个服务器上可以注册多个处理器,用于多种业务能力。
  2. 注册消息处理器:在此情况下,第一个参数是消息的主题,第二个参数是服务器,第三个参数就是具体处理消息的对象

运行服务

if err := service.Run(); err != nil {
      log.Fatal(err)
}

到这里,服务就真正的运行起来了。

访问

在我们启动项目后,在命令行中我们可以看到http的监听端口是62674,我们可以通过这个端口访问我们的服务了。

监控运行状态

在我们启动了一个服务后,我们可以通过micro命令行工具监控和操作这些服务。

我们可以执行micro web命令,显示如下信息:
web
从上面的信息,我们可以看到我们有个服务运行在本地,并监听8082接口。

这样我们可以访问http://localhost:8082/service/go.micro.service.helloworld,显示如下页面:
使用micro创建微服务_第3张图片
在这个web看板里,我们可以看到服务的不同信息:

  • 服务名称
  • 服务所在节点的列表
  • 每个节点的信息:版本、唯一的ID、地址及元数据等
  • 服务入口:服务的定义、gRPC服务名称、方法名、参数信息及数据类型等

通过micro web我们可以很容易的查看服务的相关信息。这些服务信息的获取是依赖于服务发现的。

在缺省情况下,micro的服务发现是基于mDNS的,所以只要在同一个局域网内,服务都是可发现和注册的。

注意

8082是一个缺省值,我们可以通过环境变量或命令行参数修改需要监听的端口值。

你可能感兴趣的:(微服务)