1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/silentbalanceyh-vertx-zero

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
zero-uniform.md 9.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 04:28 85b9559

Расширенное использование Envelop

В этой главе будет представлено использование завершённого примера в нашем проекте, который основан на разработке бэкенда приложения с использованием нулевой системы.

  • Версия > 0.4.4
  • Mongo Client

Метод использования шины событий представляет собой пример версии. Пожалуйста, обратитесь к Примеру версии шины событий, чтобы узнать больше о том, как использовать шину событий другим способом вместо сложной структуры up.god.file.

0. Список файлов

  • com.tlk.topic.api.TopicApi: (Интерфейс) Определение интерфейса для конечной точки RESTful.
  • com.tlk.topic.api.TopicWorker: Определение метода рабочего процесса для потребления Envelop, полученного из @Address, определённого в TopicApi напрямую.
  • com.tlk.topic.api.TopicStub: (Интерфейс) Определение интерфейса сервисного слоя.
  • com.tlk.topic.api.TopicService: Классы реализации интерфейса сервиса.

Наконец, структура файла up.god.service должна быть следующей, здесь игнорируется определение класса домена Topic, это образец POJO:

ZeroTlk

Поток запросов будет следующим:

(Запрос) -> Api -> (Шина событий) -> Рабочий процесс -> Stub -> Сервис

1. Управление адресами

В этом проекте адрес должен управляться постоянным файлом up.god, чтобы избежать неправильных действий пользователя. Он определяется в интерфейсе com.tlk.up.god.cv.Addr как постоянные значения:

public interface Addr {
    // ......

    String TOPIC_HOT = "TLK://TOPIC/HOT";

    String TOPIC_LATEST = "TLK://TOPIC/LATEST";

    String TOPIC_MY = "TLK://TOPIC/MY";
}

2. TopicApi

Это интерфейс, аннотированный @EndPoint, исходный код следующий:

package com.tlk.topic.api;

import com.tlk.up.god.cv.Addr;
import io.vertx.up.annotations.Address;
import io.vertx.up.annotations.EndPoint;

import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/topic")
@EndPoint
public interface TopicApi {

    @GET
    @Path("/hot/{limit}")
    @Address(Addr.TOPIC_HOT)
    String top(@PathParam("limit") final Integer limit);

    @GET
    @Path("/latest/{limit}")
    @Address(Addr.TOPIC_LATEST)
    String latest(@PathParam("limit") final Integer limit);

    @GET
    @Path("/my/{limit}")
    @Address(Addr.TOPIC_MY)
    String my(@PathParam("limit") final Integer limit,
              @HeaderParam("X-User-Id") final String userId);

}

Обратите внимание на следующие моменты:

  1. Это определение класса является интерфейсом Java, а не классом, это означает, что вы можете игнорировать реализацию.
  2. Проверка Hibernate игнорируется в этом режиме, нет прокси-класса реализации для проверки параметров, в такой ситуации вы можете использовать @Codex вместо этого.

3. TopicWorker

package com.tlk.topic.api;

import com.tlk.up.god.cv.Addr;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.mongo.FindOptions;
import io.vertx.up.annotations.Address;
import io.vertx.up.annotations.Queue;
import io.vertx.up.commune.Envelop;
import io.vertx.up.kidd.Rapider;

import jakarta.inject.Inject;

@Queue
public class TopicWorker {

    @Inject
    private transient TopicStub stub;

    @Address(Addr.TOPIC_HOT)
    public void hot(final Message<Envelop> message) {
        final Integer limit = Rapider.getInt(message, 0);
        stub.query(new JsonObject(), getOptions("subscribers", limit), message);
    }

    @Address(Addr.TOPIC_LATEST)
    public void latest(final Message<Envelop> message) {
        final Integer limit = Rapider.getInt(message, 0);
        stub.query(new JsonObject(), getOptions("createdTime", limit), message);
    }

    @Address(Addr.TOPIC_MY)
    public void my(final Message<Envelop> message) {
        final Integer limit = Rapider.getInt(message, 0);
        final String userId = Rapider.getString(message, 1);
        stub.query(new JsonObject().put("ownerId", userId),
                getOptions("createdTime", limit), message);
    }

    private FindOptions getOptions(final String sortField,
                                   final Integer limit) {
        final FindOptions options = new
``` **FindOptions();**

options.setLimit(limit);
final JsonObject sort = new JsonObject().put(sortField, -1);
options.setSort(sort);
return options;
}

Будьте осторожны со следующим кодом:

final Integer limit = Rapider.getInt(message, 0);
final String userId = Rapider.getString(message, 1);

Это новый API, предоставленный io.vertx.up.kidd.Rapider, kidd означает «Kidd», это имя относится к человеку «Kid the Phantom Thief». Это означает, что в этом режиме запроса нулевая система скрывает реализацию, подобно вору, который крадёт данные запроса из интерфейса агента непосредственно рабочему, минуя реализацию агента. Также Rapider скрывает детали того, как преобразовать данные запроса в ожидаемые параметры. В приведённом выше коде мы можем получить переменную пути limit и параметр заголовка X-User-Id.

4. TopicStub

package com.tlk.topic.api;

import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.mongo.FindOptions;
import io.vertx.ext.mongo.MongoClient;
import io.vertx.up.commune.Envelop;

public interface TopicStub {

    void query(final JsonObject filter,
               final FindOptions options,
               final Message<Envelop> message);
}

5. TopicService

package com.tlk.topic.api;

import com.tlk.atom.Topic;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.mongo.FindOptions;
import io.vertx.ext.mongo.MongoClient;
import io.vertx.up.commune.Envelop;
import io.vertx.up.kidd.Heart;

import jakarta.inject.infix.Mongo;

public class TopicService implements TopicStub {

    @Mongo
    private transient MongoClient client;

    @Override
    public void query(final JsonObject filter,
                      final FindOptions options,
                      final Message<Envelop> message) {
        // 1. Mongo Client to query by filter.
        client.findWithOptions(Topic.TABLE, filter, options, res -> {
            // 2. Build response.
            final Envelop envelop = Heart.getReacts(getClass())
                    .connect(res).result().to();
            message.reply(envelop);
        });
    }
}

Здесь представлен ещё один способ построения ответа под названием Heart, он может помочь нам быстро построить ожидаемый результат, например:

final Envelop envelop = Heart.getReacts(getClass())
                .connect(res).result().to();
  1. Если есть ошибки, в Envelop будет заполнена внутренняя ошибка сервера 500.
  2. _id будет заменён на key в запросе/ответе, потому что React будет использовать key как первичный ключ, но mongo будет использовать _id как первичный ключ. Вы также можете заменить Spy на connect Spy<T>, чтобы установить этот код логически.
  3. result() построит структуру данных JsonArray и вернёт список результатов, как ожидалось.

Summary

Мы добавим больше функций в нулевую систему, сосредоточившись на том, как нормализовать рабочий процесс запросов/ответов, а также ограничим случайные операции разработчика. Но вы также можете игнорировать указанный выше специфический код для реализации своей логики кода самостоятельно, разработчики могут делать это свободно. Единственное, что нужно помнить, — это то, что следует использовать единую модель Envelop. Пожалуйста, обратитесь к справочному руководству, чтобы проверить модель единого ресурса: Как использовать Envelop (модель единого ресурса).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/silentbalanceyh-vertx-zero.git
git@api.gitlife.ru:oschina-mirror/silentbalanceyh-vertx-zero.git
oschina-mirror
silentbalanceyh-vertx-zero
silentbalanceyh-vertx-zero
master