предисловие
Как говорится "не изобретайте велосипед", не надо дискутировать надо это или нет.
Основная цель создания этого проекта — улучшить себя, увидеть разрыв с известными проектами с открытым исходным кодом и изучить отличные методы с открытым исходным кодом.
Хорошо, теперь давайте сосредоточимся на разговоре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 я…
Ваши лайки и ретвиты — лучшая поддержка.