关于微服务:Jupiter-框架入口介绍

3次阅读

共计 2699 个字符,预计需要花费 7 分钟才能阅读完成。

Jupiter 框架入口介绍

概述

这篇咱们来介绍一下 jupiter 微服务框架的利用入口,之所以写这篇文章是为了深刻理解 jupiter 框架的运行机制。

数据结构介绍

上面咱们来看一下 jupiter 的 Application 对象,

// Application is the framework's instance, it contains the servers, workers, client and configuration settings.
// Create an instance of Application, by using &Application{}
// Jupiter 框架的入口构造体
type Application struct {
    cycle        *xcycle.Cycle  // 一些治理运行生命周期的函数治理
    smu          *sync.RWMutex
    initOnce     sync.Once
    startupOnce  sync.Once
    stopOnce     sync.Once
    servers      []server.Server    // 各种服务,http, grpc 等
    workers      []worker.Worker  // 工作
    jobs         map[string]job.Runner  // 工作
    logger       *xlog.Logger // 日志对象
    registerer   registry.Registry  // 服务注册接口对象
    hooks        map[uint32]*xdefer.DeferStack
    configParser conf.Unmarshaller // 系统配置对象
    disableMap   map[Disable]bool
    HideBanner   bool
}

application 对象能够分为一下几个组成部分:

  • cycle、smu、initOnce、startupOnce、stopOnce 对于运行机制的帮忙字段。
  • servers、workers、jobs 这三个字段是用于存储各种服务的,只有服务实现了接口,框架就能依据一样的流程来启动这些服务。
  • registerer 是服务发现与注册策略的理论对象,能够是 etcd、consul,只有实现 Registry 接口。
  • hooks 保留在框架运行时的各个钩子函数
  • configParser 这个字段保留着配置信息,配置信息的起源能够是文件、配置核心地址等。
  • logger 日志对象,xlog 包是 zap 日志库的一个二次批改。

利用流程

这一节咱们介绍一下框架的启动流程,流程图如下:

Application 对象是 Jupiter 框架的利用入口,

  • SetRegistry() 是用于注入服务发现与注册的,例如 registry 包中的 etcdv3 模块。
  • Startup() 办法是各个服务的初始化办法。
  • Serve()、Schedule()、Job() 是各类服务的注入办法。
  • RegisterHooks() 是注册钩子的办法。例如在启动前后进行一些行为,就能够通过这个办法。
  • Run() 办法则是启动利用的各个服务和框架自定义的一些服务,例如监控等。
  • Stop() 是接管到零碎信号后进行一些退出操作。

办法介绍

上面介绍几个启动流程中次要的办法。

Startup() 办法
//Startup 利用启动前的初始化工作办法
func (app *Application) Startup(fns ...func() error) error {app.initialize() // 初始化 app 的各个字段
    // 执行框架定义的初始化办法
    if err := app.startup(); err != nil {return err}
    // 执行自定义的初始化办法
    return xgo.SerialUntilError(fns...)()}

Startup() 办法相当于 Application 的初始化。初始化分为两个局部,一部分是框架定义的初始化程序,包含解析启动传参、加载配置、设置链路追踪、流量监控服务、服务治理等。另一部分是由框架使用者自行定义的各个服务的初始化,这部分函数个别是 Serve()、Job()、Schedule() 几个办法的调用函数。

RegisterHooks() 办法
//RegisterHooks register a stage Hook
func (app *Application) RegisterHooks(k uint32, fns ...func() error) error {hooks, ok := app.hooks[k]
    if ok {hooks.Push(fns...)
        return nil
    }
    return fmt.Errorf("hook stage not found")
}

这个办法次要是执行一些框架的钩子办法,例如在启动前后打印一些日志等等。

Run() 办法
// Run run application
// 利用启动办法
func (app *Application) Run(servers ...server.Server) error {app.smu.Lock()
    app.servers = append(app.servers, servers...)
    app.smu.Unlock()

    app.waitSignals() //start signal listen task in goroutine
    defer app.clean()

    // todo jobs not graceful
    app.startJobs()

    // start servers and govern server
    app.cycle.Run(app.startServers)
    // start workers
    app.cycle.Run(app.startWorkers)

    //blocking and wait quit
    if err := <-app.cycle.Wait(); err != nil {app.logger.Error("jupiter shutdown with error", xlog.FieldMod(ecode.ModApp), xlog.FieldErr(err))
        return err
    }
    app.logger.Info("shutdown jupiter, bye!", xlog.FieldMod(ecode.ModApp))
    return nil
}

这个办法是利用启动办法。Run() 办法能够传入各个实现了 server.Server 接口的对象。waitSignals() 会启动一个 goroutine 来监听系统的信号量用的。接着会顺次启动定时工作、各个服务 (grpc,http,govern)、工作队列。

在这个办法中,grpc、http、govern 服务会往注册核心注册每个服务的信息。用于服务发现。

Stop() 办法

Stop() 办法会程序退出时,调用各个服务的敞开办法,来关掉和断开各个服务。

正文完
 0