nirvana 包

nirvana 包在根目录中,实现了 Nirvana Server 和插件系统。这个包放置在根目录中是因为这个包是 Nirvana 提供的用于生成 API Server 的顶级包,而且其依赖的所有包只来自 Nirvana 自身和标准库(config 包依赖了 nirvana 包和其他第三方的包,实际上是一个借助了 Nirvana 和第三方功能的扩展)。

Server 接口如下:

  1. // Server is a complete API server.
  2. // The server contains a router to handle all requests form clients.
  3. type Server interface {
  4. // Serve starts to listen and serve requests.
  5. // The method won't return except an error occurs.
  6. Serve() error
  7. // Shutdown gracefully shuts down the server without interrupting any
  8. // active connections.
  9. Shutdown(ctx context.Context) error
  10. // Builder create a service builder for current server. Don't use this method directly except
  11. // there is a special server to hold http services. After server shutdown, clean resources via
  12. // returned cleaner.
  13. // This method always returns same builder until cleaner is called. Then it will
  14. // returns new one.
  15. Builder() (builder service.Builder, cleaner func() error, err error)
  16. }

创建 Server 需要使用 Config:

  1. // Config describes configuration of server.
  2. type Config struct {
  3. ...
  4. }
  5. // Locked checks if the config is locked.
  6. func (c *Config) Locked() bool
  7. // IP returns listenning ip.
  8. func (c *Config) IP() string
  9. // Port returns listenning port.
  10. func (c *Config) Port() uint16
  11. // Logger returns logger.
  12. func (c *Config) Logger() log.Logger
  13. // Configurer is used to configure server config.
  14. type Configurer func(c *Config) error
  15. // Configure configs by configurers. It panics if an error occurs or config is locked.
  16. func (c *Config) Configure(configurers ...Configurer) *Config
  17. // Config gets external config by name. This method is for plugins.
  18. func (c *Config) Config(name string) interface{}
  19. // Set sets external config by name. This method is for plugins.
  20. // Set a nil config will delete it.
  21. func (c *Config) Set(name string, config interface{})
  22. // NewServer creates a nirvana server. After creation, don't modify
  23. // config. Also don't create another server with current config.
  24. func NewServer(c *Config) Server

在 Config 中,存在一些 Server 级别的配置,这些配置是针对当前服务的。而对应的 Configurer 也在当前包中。如果需要对配置进行扩展,增强 Server 功能,则可以增加相应字段,否则应该使用插件机制增加功能。

在 Config 中可以看到 Config 和 Set 方法,这两个方法就是提供给插件允许插件设置自身的配置的。

  1. // ConfigInstaller is used to install config to service builder.
  2. type ConfigInstaller interface {
  3. // Name is the external config name.
  4. Name() string
  5. // Install installs stuffs before server starting.
  6. Install(builder service.Builder, config *Config) error
  7. // Uninstall uninstalls stuffs after server terminating.
  8. Uninstall(builder service.Builder, config *Config) error
  9. }

注册了插件之后,在服务启动的时候,会遍历所有插件配置,然后调用插件的 Install 方法安装插件。