首页 /  技术专区  /  Vert.x 宽屏模式 >

Vert.x中外部化参数配置

Vert.x Config提供了一种配置Vert.x应用程序的方法。它:

        提供多种配置语法(JSON,属性,Yaml(扩展名),Hocon(扩展名)...

        提供多种配置存储,例如文件,目录,HTTP,git(扩展名),Redis(扩展名),系统属性和环境属性。

        让您定义处理顺序和重载

        支持运行时重新配置

Vert.x应用程序实例化并使用了Config Retriever它配置了一组配置存储区 配置存储区定义了从中读取配置数据的位置以及格式(默认情况下为JSON)

该配置将作为JSON对象检索。


1、引入依赖

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-config</artifactId>
  <version>4.0.3</version>
</dependency>

2、完成后,您首先需要实例化ConfigRetriever

ConfigRetriever retriever = ConfigRetriever.create(vertx);

默认情况下,配置检索器配置有以下存储(按此顺序):

        Vert.x垂直 config()

        系统属性

        环境变量

一个conf/config.json文件。可以使用vertx-config-path系统属性或 VERTX_CONFIG_PATH环境变量来覆盖此路径

3、示例,ConfigVerticle程序

package vertx;

import io.vertx.config.ConfigRetriever;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.mysqlclient.MySQLConnectOptions;
import io.vertx.mysqlclient.MySQLPool;
import io.vertx.sqlclient.PoolOptions;
import io.vertx.sqlclient.SqlConnection;
import io.vertx.sqlclient.Tuple;

import java.util.ArrayList;

public class ConfigVerticle extends AbstractVerticle {

  //声明Router
  Router router;

  //配置连接参数
  MySQLConnectOptions connectOptions;

  //配置连接池 Pool options
  PoolOptions poolOptions = new PoolOptions()
    .setMaxSize(5);

  //Create the client pool
  MySQLPool client;

  @Override
  public void start(Promise<Void> startPromise) throws Exception {

    //第一步 加入这行代码
    ConfigRetriever retriever = ConfigRetriever.create(vertx);

    retriever.getConfig(ar -> {
      if (ar.failed()) {
        // Failed to retrieve the configuration
      } else {
        JsonObject config = ar.result();

        connectOptions = new MySQLConnectOptions()
          .setPort(config.getInteger("port"))
          .setHost(config.getString("host"))
          .setDatabase(config.getString("database"))
          .setUser(config.getString("user"))
          .setPassword(config.getString("password"));

        client = MySQLPool.pool(vertx, connectOptions, poolOptions);

        //初始化Router
        router = Router.router(vertx);

        //配置Router解析url
        router.route("/").handler(
          req -> {
            req.response()
              .putHeader("content-type", "text/plain")
              .end("Hello from Vert.x!");
          }
        );

        //配置Router解析url
        router.route("/test/list").handler(
          req -> {
            var page = (Integer.valueOf(req.request().getParam("page")) - 1) * 10;
            var size = Integer.valueOf(req.request().getParam("size"));
            //Get a connection from the pool
            client.getConnection(ar1 -> {
              if(ar1.succeeded()){
                System.out.println("Connected");

                //Obtain our connection
                SqlConnection conn = ar1.result();

                //All operations execute on the same connection
                conn
                  .preparedQuery("select id, name, age, info from person limit ?, ?")
                  .execute(Tuple.of(page, size), ar2 -> {
                    //Release the connection to the pool
                    conn.close();

                    if(ar2.succeeded()){
                      var list = new ArrayList<JsonObject>();
                      ar2.result().forEach(item -> {
                        var json = new JsonObject();
                        json.put("id", item.getValue("id"));
                        json.put("name", item.getValue("name"));
                        json.put("age", item.getValue("age"));
                        json.put("info", item.getValue("info"));
                        list.add(json);
                      });
                      req.response()
                        .putHeader("content-type", "application/json")
                        .end(list.toString());
                    }else{
                      req.response()
                        .putHeader("content-type", "text/plain")
                        .end(ar2.cause().toString());
                    }
                  });
              }else{
                System.out.println("Could not connect:" + ar1.cause().getMessage());
              }
            });
          }
        );

        //将Router与vertx HttpServer 绑定
        vertx.createHttpServer().requestHandler(router).listen(8888, http -> {
          if (http.succeeded()) {
            startPromise.complete();
            System.out.println("HTTP server started on port 8888");
          } else {
            startPromise.fail(http.cause());
          }
        });
      }
    });
  }
}

在resources新建conf文件夹,并新建config.json文件:

{
  "port": 3306,
  "host": "127.0.0.1",
  "database": "db",
  "user": "root",
  "password": "password"
}

4、启动测试

image.png



头像
0/200
图片验证码