"Строим колесо" - цикада (облегченный WEB фреймворк)

задняя часть GitHub Tomcat Открытый исходный код
"Строим колесо" - цикада (облегченный WEB фреймворк)

предисловие

Как говорится "не изобретайте велосипед", не надо дискутировать надо это или нет.

Основная цель создания этого проекта — улучшить себя, увидеть разрыв с известными проектами с открытым исходным кодом и изучить отличные методы с открытым исходным кодом.

Хорошо, теперь давайте сосредоточимся на разговореcicadaОсновной функционал этого проекта.

Я определяю его как быструю и легкую веб-инфраструктуру; без слишком большого количества зависимостей основной пакет jar весит всего 30 КБ.

Также требуется всего одна строка кода, чтобы запуститьHTTPСлужить.


характеристика

Теперь давайте поговорим о нескольких важных особенностях.

Текущая версия в основном реализует базовые запросы, ответы, пользовательские параметры и функции перехватчика.

Хотя у него мало функций, у него есть все внутренние органы.

В процессе дальнейшей итерации вышеуказанная функция будет постепенно улучшаться, если у вас есть хорошие идеи, вы можете их упомянуть.GitHub.com/crossover J я….

Быстрый старт

Давайте посмотрим, как быстро запустить службу HTTP.

Просто создайте проект Maven и импортируйте основной пакет.

<dependency>
    <groupId>top.crossoverjie.opensource</groupId>
    <artifactId>cicada-core</artifactId>
    <version>1.0.0</version>
</dependency>

Как показано на рисунке выше, настройте другой класс запуска.

public class MainStart {

    public static void main(String[] args) throws InterruptedException {
        CicadaServer.start(MainStart.class,"/cicada-example") ;
    }
}

Настройка бизнес-действий

Конечно, нам также нужно место для реализации бизнес-логики.cicadaПредоставляется интерфейс, и конкретная логика может быть реализована только путем реализации интерфейса.

Создать реализацию бизнес-действияtop.crossoverjie.cicada.server.action.WorkActionинтерфейс.

@CicadaAction(value = "demoAction")
public class DemoAction implements WorkAction {


    private static final Logger LOGGER = LoggerBuilder.getLogger(DemoAction.class) ;

    private static AtomicLong index = new AtomicLong() ;

    @Override
    public WorkRes<DemoResVO> execute(Param paramMap) throws Exception {
        String name = paramMap.getString("name");
        Integer id = paramMap.getInteger("id");
        LOGGER.info("name=[{}],id=[{}]" , name,id);

        DemoResVO demoResVO = new DemoResVO() ;
        demoResVO.setIndex(index.incrementAndGet());
        WorkRes<DemoResVO> res = new WorkRes();
        res.setCode(StatusEnum.SUCCESS.getCode());
        res.setMessage(StatusEnum.SUCCESS.getMessage());
        res.setDataBody(demoResVO) ;
        return res;
    }

}

В то же время его нужно добавить в пользовательский класс@CicadaActionаннотацию, и необходимо указатьvalue, значение в основном для поиска бизнес-класса при запросе маршрутизации.

Запустите приложение вот так и получите доступ

http://127.0.0.1:7317/cicada-example/demoAction?name=12345&id=10

Вы можете выполнять бизнес-логику и одновременно получать отдачу от сервера.

В настоящее время по умолчанию поддерживаетсяjsonВ ответ парсинг шаблона будет добавлен позже.

Связанные журналы также печатаются в сервисе.

Гибкая настройка параметров

Все параметры запроса здесь инкапсулированы вParam, вы можете использовать различные API для получения данных запроса.

Причина гибкости: мы можем даже запросить это так:

http://127.0.0.1:7317/cicada-example/demoAction?jsonData="info": {
    "age": 22,
    "name": "zhangsan"
  }

Таким образом, можно передавать данные любой структуры, если они анализируются во время бизнес-обработки.

пользовательский перехватчик

Перехватчик — это базовая функция платформы, которую можно использовать для реализации общих задач, таких как ведение журнала и отправка транзакций.

с этой цельюcicadaПредоставьте интерфейс:top.crossoverjie.cicada.server.intercept.CicadaInterceptor.

Нам нужно только реализовать этот интерфейс, чтобы написать функцию перехвата:

@Interceptor(value = "executeTimeInterceptor")
public class ExecuteTimeInterceptor implements CicadaInterceptor {

    private static final Logger LOGGER = LoggerBuilder.getLogger(ExecuteTimeInterceptor.class);

    private Long start;

    private Long end;

    @Override
    public void before(Param param) {
        start = System.currentTimeMillis();
    }

    @Override
    public void after(Param param) {
        end = System.currentTimeMillis();

        LOGGER.info("cast [{}] times", end - start);
    }
}

Демонстрация здесь заключается в записи времени выполнения всех действий.

В настоящее время по умолчанию реализован только перехват действий, а пользовательские перехватчики будут добавлены позже.

Адаптер перехвата

Хотя в перехватчике предусмотреноbefore/afterДва метода, но не все методы должны быть реализованы.

следовательноcicadaАдаптер предоставляется:

top.crossoverjie.cicada.server.intercept.AbstractCicadaInterceptorAdapter

Нам нужно наследоваться от него, чтобы реализовать один из методов по требованию, следующим образом:

@Interceptor(value = "loggerInterceptor")
public class LoggerInterceptorAbstract extends AbstractCicadaInterceptorAdapter {

    private static final Logger LOGGER = LoggerBuilder.getLogger(LoggerInterceptorAbstract.class) ;

    @Override
    public void before(Param param) {
        LOGGER.info("logger param=[{}]",param.toString());
    }

}

Тестирование производительности

Поскольку это инфраструктура службы HTTP, производительность, естественно, должна быть гарантирована.

Условия испытаний:300 并发连续压测两轮;1G 内存、单核 CPU、1Mbps。Измерение давления с помощью Jmeter выглядит следующим образом:

Тот же сервер протестирован с Tomcat, чтобы увидеть результаты.

Конфигурация пула потоков Tomcat:

<Executor name="tomcatThreadPool" namePrefix="consumer-exec-"
        maxThreads="510" minSpareThreads="10"/>

То, что я прошу здесь, - это каталог документов Tomcat, хотя результат, похоже,cicadaПроизводительность выше, чем у Tomcat.

Но на самом деле переменные в этом процессе сравнения полностью не контролируются.Tomcat возвращает HTML, аcicadaВозвращается только json, конечно проблема не в этом.

Но это все еще может объяснитьcicadaТекущая производительность по-прежнему хороша.

Суммировать

В этой статье не обсуждается слишком многоcicadaПринцип реализации, если интересно, можете посмотреть исходники, он относительно прост.

Более подробно об этом будет рассказано в следующем обновлении.

При этом не удивительноcicadaОн будет продолжать обновляться, и в будущем будут добавлены более полезные функции.

Даже я применю его к своему производственному проекту в нужное время, и я надеюсь, что больше друзей смогут присоединиться и сделать это «колесо» лучше.

адрес проекта:GitHub.com/crossover J я…

Ваши лайки и ретвиты — лучшая поддержка.