squbs-1. 率领

初稿地址:Unicomplex & Cube
Bootstrapping

Unicomplex和Cube的引导

squbs默认自带一个org.squbs.unicomplex.Bootstrap的引导类。它能够透过IDE、命令行、sbt、Maven启动。指点类扫描类加载器,并在各样加载的jar包资源中追寻META-INF/squbs-meta.<ext&gt。假设squbs的元数据是实惠的,jar包将被作为squbs的cube或扩充,并透过元数据的宣示进行先导化。辅导(Bootstrap)会率先最先化扩张程序、cubes,然后服务电脑,而不是他俩在classpath中的先后顺序。

在健康情况下,指导细节尚未太大的含义。不过,有种境况或者需要通过不同方法的编程来指点squbs。这在在举办测试用例(需要自定义配置和出现运行)时特别常见。更多信息方可参见Testing
squbs
Applications
。辅导squbs的语法如下:
Option 1) 用户自定义启动配置

UnicomplexBoot(customConfig)  
    .createUsing {(name, config) => ActorSystem(name, config)}  
    .scanResources() 
    .initExtensions  
    .stopJVMOnExit  
    .start()

Option 2) 使用默认配置启动

UnicomplexBoot {(name, config) => ActorSystem(name, config)}
  .scanResources()
  .initExtensions
  .stopJVMOnExit
  .start() 

让我们来探视每个部分:

  1. 始建UnicomplexBoot (boot)
    对象。它能够经过传递一个自定义的布置文件或者actor系统创设者的闭包
    UnicomplexBoot.apply()来完成。

  2. 在例子中显得的customConfig即为配置对象
    。这是一个从Typesafe配置类库解析函数中取得的配置对象。此安排对象尚未与application.conf
    合并。

  3. ActorSystem创制者通过传递一个函数或者闭包来创设ActorSystem。那多少个实际上的始建在最先阶段(条目7)。默认的函数是{(name, config) => ActorSystem(name, config)}。其中输入的name是从配置项中读取的ActorSystem的称谓。这一个config将会在任何所有配置项联合之后再开展加载。大多是用例都希望以这种方法创立ActorSystem,因而并不需要提供该函数。
    createUsing 完全可以制止采纳。

  4. 通过scanResources()函数扫描cubes,服务,扩大等零件。这多少个是威胁默认的,否则将没有组件被启动。假诺没有参数传入,suqbs引导将会扫描它的类加载器。测试用例可能希望仅扫描其中一些零部件。通过传递附加的配置文件squbs-meta.conf将可以实现(作为参数的格局传入scanResources),例如:scanResources("component1/META-INF/squbs-meta.conf", "component2/META-INF/squbs-meta.conf")。它将围观你的类路径和附加的资源文件路径。假诺你不想让类路径被扫描,在资源列表前流传withClassPath = false
    或仅仅false即可:.scanResources(withClassPath = false, "component1/META-INF/squbs-meta.conf", "component2/META-INF/squbs-meta.conf")

  5. 使用
    initExtension函数起始化扩大。它会起首化扫描到的恢弘。在ActorSystem创设前,扩张将会完结初叶化。在多重Unicomplex用例中(三个ActorSystem),同样的扩展至多起初化三回。一个恢弘只可以用在一个测试用例中。在一些测试用例中,我们一向不想起头化增加,并且不会调用initExtension

  6. 在剥离的时候截止JVM。调用 stopJVMOnExit
    这么些函数启动该效用。这么些选项经常不会在测试用例里面使用。它被用在squbs辅导中以保证subqs正常的倒闭与脱离。

  7. 调用start()方法启动Unicomplex。那些是强制性的步调。尽管没有这么些ActorSystem将不会启动,并且Actor也不行运行。该启动调用在完全启动并运行仍旧逾期前会处于阻塞。假诺开行超时,某些零部件可能依然在初阶化,从而使系统处于Initializing
    状态,可是,任何单个组件故障将在逾期时将系统状态转变为 Failed
    。这将同意类似系统组件的系统诊断执行和终止。默认的启动超时时间为60秒。对于盼望超时的测试,可以安装一个较低的过期时间作为参数传递给
    start() 函数,如start(Timeout(5 seconds))
    ,或者通过如start(5 seconds)隐式转换的主意设置超时时间。

配置解决方案

squbs接纳一个行使配置,并将classpath中聚合的application.conf
、reference.conf举行统一。这么些动用配置以下边这一个顺序举行合并:

  1. 假设在创造指点对象的时候已经提供了这几个布局,则采取这么些布局。那就是下面例子中的customConfig字段。

  2. 倘使在外表的配备目录中提供了application.conf文件,这个application.conf文件将被挑选。外部的布局文件目录可以经过配备squbs.external-config-dir参数设置,默认为squbsconfig。不是这样的话,设置的目录将不会被提供的目录或外部配置文件改变和掩盖(因为目录本身是利用config属性确定的)。

  3. 其它情况下,将运用应用程序提供的application.conf。最终动用reference.conf

插件模块化系统

squbs将利用细分成称为cube的模块。squbs中的模块在平行的类路径中隔离运行。模块化目的在于直达模块之间的松耦合,而不会招致发生任何借助关系引起的类路径冲突。

眼下的兑现是从一个平面(flat)类路径举行引导。在指点下,squb会自动检测classpath下扫描的模块。扫描到的cubes将会自动被检测和开行。

Cube Jars

有着的cube通过一个顶级jar文件和cube本身展现。所有的cube必须在文件META-INF/squbs-meta.<ext>.中有元数据。辅助.conf、.json和.properties的扩展名。关于格式可以参见Typesafe
config

cube的元数据至多安排唯一的cube和本子定义,并且注解和配备两个以下因素:

Actor: 定义squbs自动启动的well known actor。

Service: 定义一个squbs服务

Extension:
定义一个squbs框架增添。这些扩充入口必须连续org.squbs.lifecycle.ExtensionLifecycle特性。

安排解决方案

当多少个cube尝试提供它们中间的 application.conf文件时,为cube提供
application.conf布置文件或者出现问题。合并这一个部署文件的事先级规则未被定义。推荐cube仅提供reference.conf
并且可以在部署时可以被表面的application.conf覆盖。

Well Known Actors

Well known actors 是单纯指的是在Akka
documentation
中定义的
Akka
actors
。它们经过各样cube中的老板actor启动。老总的名号从cube中而来。因而任何well
known
actor有一个/<CubeName>/<ActorName>的路线,并且可以透过调用ActorSelection查找/user/<CubeName>/<ActorName>。

一个well known
actor可以启动为一个单例actor或一个router。为了表达一个well known
actor为一个router,加上:
with-router = true
在actor声明中。well knwon
actor如路由(Router)、调度员(dispatcher)、邮箱配置(mailbox
configuration)依照Akka文档通过reference.conf或application.conf 配置。

以下是一个cube的事例,配置在 META-INF/squbs-meta.conf下的一个well known
actor:

cube-name = org.squbs.bottlecubecube-version = "0.0.2"
squbs-actors = [
  {
    class-name = org.squbs.bottlecube.LyricsDispatcher
    name = lyrics
    with-router = false  # Optional, defaults to false
    init-required = false # Optional
  }
]

参数init-required用于actors是否需要回到它们统统启动后的状态给系统,以便将其视为起初化完成。有关启动/初始化钩子完整的议论,可以参照Startup
Hooks

中的Runtime Lifecycles & API

只要一个actor被安排了with-router (with-router =
true)和一个非默认的调度员(dispatcher),那么一般是在非默认调度员(non-default
dispatcher)上调度actor(routee)。路由(router)将承担well known
actor的名目,而不是routee(你兑现的actor)。一个路由(router)上安装的调度员(dispatcher)将仅影响当下路由(router),而不是routee。为了影响routee,你需要为了routee创立单独的安排,并将”/*”附加到名称上。接下来,您将要在下边的事例中,在routee有些设置调度员(dispatcher)

akka.actor.deployment {
  # Router configuration
  /bottlecube/lyrics {
    router = round-robin-pool
    resizer {
      lower-bound = 1
      upper-bound = 10
    }
  }
  # Routee configuration. Since it has a '*', the name has to be quoted.
  "/bottlecube/lyrics/*" {
    # Configure the dispatcher on the routee.
    dispatcher = blocking-dispatcher
  }

路由的概念、例子、配置都被记录在Akka
documentation

服务(Services)

有关于服务具有的底细在 Implementing HTTP(S)
Services
会有描述。在
META-INF/squbs-meta.conf 中扬言的服务元数据,如下所示:

cube-name = org.squbs.bottlesvc
cube-version = "0.0.2"
squbs-services = [
  {
    class-name = org.squbs.bottlesvc.BottleSvc
    web-context = bottles # 例如,你还可以指定bottles/v1

    # 监听的条目是可选的,默认为'default-listener'
    listeners = [ default-listener, my-listener ]

    # 可选,默认为一个默认的pipeline
    pipeline = some-pipeline

    # 可选,如果设置为false则禁用默认pipeline
    defaultPipelineOn = true

    # 可选,仅适用于actor
    init-required = false
  }
]

一体化的讲述可以瞻仰Service
Registration

扩展

squbs中的扩张是为环境所启动的低等级设备。扩张起始化需要连续org.squbs.lifecycle.ExtensionLifecycle特色同时复写回调参数。一个扩张有很大的力量来反思系统,并且提供额外的squbs未提供的功能。在同一个cube中,一个恢宏不得以与一个actor或service组合。

扩充遵照顺序一个一个加载的。扩充的生成者可以在增加注解中通过点名:sequence

[number]来为扩张启动提供系列号。假如体系号没有被指定,它默认为Int.maxValue。这意味着着它将会在具备标有体系号的恢弘启动未来启动。假使存在六个扩展没有点名连串号或者制定了同一的队列号,那么她们之间启动顺序是不确定的。关闭写顺序和开行的相继相反。

关闭squbs

运作中的squbs能够经过向Unicomplex()出殡一个 GracefulStop
音信关闭。
默认的开行main方法,org.squbs.unicomplex.Bootstrap,注册一个JVM关闭关系(hook),可以发送GracefulStop
消息至
Unicomplex。此外,假诺一个squbs应用通过默认的main方法启动,当JVM接收到SIGTERM新闻时,系统将会优雅的倒闭。

万一有其余监察进程负责关闭app,例如JSW,可以安装org.squbs.unicomplex.Shutdown的main方法优雅的倒闭关闭系统。同样的,Shutdown中的main方法发送一条
GracefulStop 消息至Unicomplex

在好几情状下,期望对关闭添加延迟。例如,倘诺一个载重均衡的正规每5s检测五回,但app在健康监测的1s后关门,这个利用将维持在以后的4s中延续处理请求,直到下两回正常检测;不过,它不能够提供这个请求。假诺你使用方面的中间一个办法,org.squbs.unicomplex.Bootstrap
或者org.squbs.unicomplex.Shutdown,你可以通过如下的配备充分一个延迟:

squbs.shutdown-delay = 5 seconds

经过以上的部署, GracefulStop将会延迟5s后向 Unicomplex 发送。

在接收到GracefulStop消息后,Unicomplex actor将会终止服务,并传播
GracefulStop音讯至拥有的cube管理者中。每个领导负责停止其cube中的actor(通过传播GracefulStop音信至希望执行优雅截至的children),确保他们成功关闭或逾期后回传PoisonPill
,随后其关闭自身。一旦有所的cube管理者和劳务截至,squbs系统关闭。然后,一个停歇钩子将被调用来关闭所有的恢弘并且最终退出JVM.

眼前web容器没有一个正经的支配台来允许squbs的用户构建他们协调的控制台。web控制台可以提供正确的用户关闭,通过发送一个截至音讯至Unicomplex

  Unicomplex() ! GracefulStop

相关文章