```scala def main(args: Array[String]): Unit = { val ns = parser.parseArgsOrFail(args) val serverConfigPath = ns.getString("config") val serverConf = ServerConfig.load(serverConfigPath) start(serverConf).blockUntilShutdown() }
コンフィグのロード
渡された設定ファイルのPATHを用いて、設定を読み込む。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/** * Load the configurations for the server from the config file. If the file name ends with * `.yaml` or `.yml`, load it using the YAML parser. Otherwise, throw an error. */ defload(configFile: String): ServerConfig = { if (configFile.endsWith(".yaml") || configFile.endsWith(".yml")) { val serverConfig = createYamlObjectMapper.readValue(newFile(configFile), classOf[ServerConfig]) serverConfig.checkConfig() serverConfig } else { thrownewIOException("The server config file must be a yml or yaml file") } }
defstart(serverConfig: ServerConfig): Server = { lazyval server = { updateDefaultJsonPrinterForScalaPbConverterUtil() val builder = Server.builder() .defaultHostname(serverConfig.getHost) .disableDateHeader() .disableServerHeader() .annotatedService(serverConfig.endpoint, newDeltaSharingService(serverConfig): Any) if (serverConfig.ssl == null) { builder.http(serverConfig.getPort) } else { builder.https(serverConfig.getPort) if (serverConfig.ssl.selfSigned) { builder.tlsSelfSigned() } else { if (serverConfig.ssl.certificatePasswordFile == null) { builder.tls( newFile(serverConfig.ssl.certificateFile), newFile(serverConfig.ssl.certificateKeyFile)) } else { builder.tls( newFile(serverConfig.ssl.certificateFile), newFile(serverConfig.ssl.certificateKeyFile), FileUtils.readFileToString(newFile(serverConfig.ssl.certificatePasswordFile), UTF_8) ) } } } if (serverConfig.getAuthorization != null) { // Authorization is set. Set up the authorization using the token in the server config. val authServiceBuilder = AuthService.builder.addOAuth2((_: ServiceRequestContext, token: OAuth2Token) => { // Use `MessageDigest.isEqual` to do a time-constant comparison to avoid timing attacks val authorized = MessageDigest.isEqual( token.accessToken.getBytes(UTF_8), serverConfig.getAuthorization.getBearerToken.getBytes(UTF_8)) CompletableFuture.completedFuture(authorized) }) builder.decorator(authServiceBuilder.newDecorator) } builder.build() } server.start().get() server }
一番最後の箇所の通り、
1 2
server.start().get() server
server は、 Armeria
のビルダを用いてインスタンス化されたサーバを起動する。
なお、startメソッド内ではTLS周りの設定、トークンの設定などが行われる。
なお、サーバに渡されるクラスは以下の通り、
1 2 3 4 5
val builder = Server.builder() .defaultHostname(serverConfig.getHost) .disableDateHeader() .disableServerHeader() .annotatedService(serverConfig.endpoint, newDeltaSharingService(serverConfig): Any)
/** Return the current table version */ deftableVersion: Long = withClassLoader { val snapshot = deltaLog.snapshot validateDeltaTable(snapshot) snapshot.version }
/** * Run `func` under the classloader of `DeltaSharedTable`. We cannot use the classloader set by * Armeria as Hadoop needs to search the classpath to find its classes. */ privatedefwithClassLoader[T](func: => T): T = { val classLoader = Thread.currentThread().getContextClassLoader if (classLoader == null) { Thread.currentThread().setContextClassLoader(this.getClass.getClassLoader) try func finally { Thread.currentThread().setContextClassLoader(null) } } else { func } }