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

OSCHINA-MIRROR/ainilili-No-Framework

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Текст технической направленности из области разработки и тестирования программного обеспечения

No Framework

maven code style

一、序言

NoFramework — это проект сетевого краулера, который автор разрабатывал в свободное время. Проект получил название Seeker и впоследствии развился в серию No. За время разработки некоторые проекты были переписаны, а архитектура претерпела значительные изменения. Некоторые решения продолжают оптимизироваться, и в процессе оптимизации автор получает понимание деталей нижнего уровня.

Многие люди не понимают, зачем нужен этот проект. Автор объясняет:

он может заменить Tomcat, Spring и MyBatis для разработки веб-сервисов!

Преимущества использования этой платформы:

  • можно напрямую общаться с автором;
  • можно участвовать в разработке платформы;
  • можно почувствовать привлекательность использования отечественной платформы.

В основе многих фреймворков Java лежат простые принципы. Из известных автору фреймворков используются:

  • ThreadLocal;
  • Dynamic Proxy;
  • Reflect;
  • Genericity;
  • AQS&CAS.

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

Вернёмся к основной теме. В течение почти года автор прошёл путь от базового анализа JSON и XML до создания контейнера сервисов и, наконец, создания базовой структуры веб-сайта. Конечно, некоторые модули всё ещё имеют много недостатков и требуют оптимизации. Автор будет продолжать работу над ними. Возможно, в конечном итоге код потеряет смысл, но автор всё равно будет стремиться улучшить его.

二、Проект

No Framework (NF) — это набор сервисов, предоставляющий комплексное решение для веб-разработки на Java.

2.1. Модули NF

2.2. Модули NF

2.2.1. Родительский модуль

Проект Версия Функция
noframework 1.1.3 Зависимость родительского модуля для дочерних модулей

2.2.2. Дочерние модули

Проект Версия Функция
noson 1.1.3 Сериализация и десериализация JSON
nocat 1.1.3 Веб-контейнер на основе Java
noaoc 1.1.3 IOC и AOP
nomvc 1.1.3 MVC
nolog 1.1.3 Логирование и инструменты
seeker 1.1.3 Анализ XML
nodb 1.1.3 ORM
noasm 1.1.3 Инструменты ASM
nomvc-support-for-nocat 1.1.3 Поддержка MVC для nocat
nomvc-support-for-tomcat 1.1.3 Поддержка MVC для Tomcat
noaoc-listener-for-nocat 1.1.3 Слушатель загрузки noaoc для nocat
nf 1.1.3 Обеспечивает зависимости других модулей

2.3. Подробное описание модулей NF

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

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

2.3.1. Noson — инструмент сериализации и десериализации JSON

Noson отвечает за анализ данных JSON в процессах взаимодействия между передней и задней частью. Это инструмент сериализации и десериализации по умолчанию для контейнера MVC. После непрерывной оптимизации производительность Noson стала весьма впечатляющей. Хотя она не сравнима с FastJson, Jackson или Gson, для тех, кто не предъявляет высоких требований к производительности, Noson является хорошим выбором.

Noson обладает высокой отказоустойчивостью. Например, следующий JSON может быть корректно проанализирован Noson:

{value:[{\"key1\":a,'key2':b,key3:1c,key4:'\"d',key5:\"'e\",key6:':,[]{}',key7:,key8:'%$&%$&%^><:'}]}

После анализа он преобразуется в стандартный JSON:

{"value":[{"key1":"a","key2":"b","key3":"1c","key4":"\"d","key5":"\'e","key6":":,[]{}","key7":"key8:\'%$&%$&%^><:\'"}]}

Noson также может обрабатывать сложные типы данных:

json = "{list:[{map:{map:{list:[{map:{value:{\"name\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}},{map:{value:{\"name\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}}]}}},{map:{map:{list:[{map:{value:{\"name\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}},{map:{value:{\"name\":nico,age:21,skill:[java,c,c#,python,php,javascript],deposit:0.0,info:{address:china,job:IT}}}}]}}}]}";
Map<String, List<Map<String, Map<String, Map<String, List<Map<String, Map<String, Nico>>>>>>>> target = Noson.convert(json, new NoType<Map<String, List<Map<String, Map<String, Map<String, List<Map<String, Map<String, Nico>>>>>>>>>(){});

Noson может решать проблемы циклических вложений:

Cycle c = new Cycle();
System.out.println(Noson.reversal(c));

Map<String, Object> map = new HashMap<String, Object>();
map.put("map", map);
System.out.println(Noson.reversal(map));

List<Object> list = new ArrayList<Object>();
list.add(list);
System.out.println(Noson.reversal(list));

Set<Object> sets = new HashSet<Object>();
sets.add(sets);
System.out.println(Noson.reversal(sets));

map.put("list", list);
System.out.println(Noson.reversal(map));

Вывод:

{"cycle":{}}
{"map":{}}
[[]]
[[]]
{"list":[[]],"map":{"list":[[]]}}

У Noson есть и другие интересные функции, которые вы можете изучить в следующем разделе.

2.3.2. Nocat — лёгкий веб-сервер

Nocat основан на сокетах Java и предоставляет базовые функции доступа к ресурсам. Он предоставляет три основных модуля:

  • Filter;
  • Listener;
  • Api.

Его функции можно рассматривать как аналоги фильтров, слушателей и сервлетов Tomcat. Отличие от Tomcat заключается в том, что Nocat можно легко запустить в основном методе:

public static void main(String[] args) {
        ServerBootStrap bootStrap = new ServerBootStrap();
        bootStrap.start(8080);
    }

Приведённый выше код запустит сервис на порту 8080 локально.

2.3.3. Noaoc — IOC и AOP функции

Noaoc использует небольшое количество кода для реализации основных функций Spring IOC и AOP. Он поддерживает конфигурацию через xml и аннотации. Ноаос отвечает за управление зависимостями классов во всей семье, а также предоставляет гибкую возможность расширения извне. Это значительно облегчает интеграцию с Номвк.

Ноаос предоставляет слушателя для Нокат:

noaoc-listener-for-nocat.

В конфигурационном файле Нокат добавьте слушатель и настройте параметры:

<listener>
    <handler>org.nico.aoc.listener.NoaocListener</handler>
    <payload>
        {
            // Сканируемые файлы конфигурации XML
            "xmls":["cat-mysql.xml","cat-redis.xml"],

            // Пакеты аннотаций для сканирования
            "packs":["org.nico.ct"],

            // Саморасширяющиеся компоненты
            "compents":["org.nico.cat.mvc.compent.MVCCompent"]
        }
    </payload>
</listener>

2.3.4. Номвк — поддержка MVC для Tomcat и Нокат

Номвк основан на контроллере маршрутизации и использует Noson для помощи в разборе входящих и исходящих данных. Он также включает модуль Verify для проверки входных параметров метода.

Номвк предоставляет два модуля расширения:

  • nomvc-support-for-nocat;
  • nomvc-support-for-tomcat.

Для интеграции с Нокат необходимо добавить слушателя и путь перехвата API в конфигурационный файл:

<listener>
    <handler>org.nico.cat.mvc.listener.ListenerForNocat</handler>
    <payload>
        // Пакет аннотаций MVC
        {"scanpack":"org.nico.ct.controller"}
    </payload>
</listener>
<api>
    <uri>/v1/**</uri>
    <handler>org.nico.cat.mvc.router.RouterForNocat</handler>
</api>

2.3.5. Нолог — лёгкий пакет инструментов и журналов

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

Сам по себе Нолог не имеет никаких зависимостей, но для поддержки переключения на Log4J добавлена зависимость от SLF Log4j.

Имя входного файла Нолога — logno.properties. Далее будет представлено краткое введение в параметры конфигурации и использование Нолога.

2.3.6. Сикер — анализатор гипертекста и инструмент для веб-сканирования

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

Сикер отвечает за анализ гипертекста в семье NF, включая конфигурацию Нокат и Ноаос.

2.3.7. Нодб — ORM-фреймворк

Подобно Hibernate, но гораздо более лёгкий ORM-фреймворк, который в настоящее время поддерживает только MySQL. По производительности близок к JDBC и предоставляет удобные интерфейсы для запросов с условиями и разбиения на страницы.

Можно использовать Ноаос для прямой интеграции:

<book id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <param key="jdbcUrl"
        value="jdbc:mysql://localhost:3306/xx?useUnicode=true&characterEncoding=utf8&useSSL=false" />
    <param key="user" value="xx" />
    <param key="password" value="xx" />
    <param key="driverClass" value="com.mysql.jdbc.Driver" />
    <param key="maxPoolSize" value="100" />
    <param key="minPoolSize" value="10" />
</book>

<book id="MysqlSession" class="org.nico.db.session.branch.MysqlSession">
    <param key="autoCommit" value="false" />
    <label name="dataSource" ref="DataSource" />
</book>

<book id="MysqlDBHelper" class="org.nico.db.helper.impl.MysqlDBHelper">
    <param key="printLog" value="false" />
    <label name="session" ref="MysqlSession" />
</book>

<book id="TransationManager" class="org.nico.db.datasource.TransationManager">
    <label name="dataSource" ref="DataSource" />
</book>

2.3.8. Ноас — простая структура ASM

Зависит от исходного кода ASM и в настоящее время предоставляет следующие методы:

  • получение имён параметров методов объектов;
  • улучшенное отражение.

2.3.9. НФ — ленивый инструмент

Если вы не хотите писать так много зависимостей модулей NF в pom.xml, просто импортируйте модуль NF напрямую. Кроме того, некоторые модули зависят от других модулей. Конкретные зависимости можно найти по ссылке:

http://mvnrepository.com/

3.2.2 Обычный проект

Используйте Git для клонирования проекта на локальный компьютер. Затем используйте вашу IDE, чтобы добавить модули в среду проекта, или вы можете вручную упаковать проект в jar-файл и затем импортировать его!

3.2.3 DEMO

NF предоставляет простой проект CoffeeTime (https://gitee.com/ainilili/CoffeeTime), который демонстрирует процесс разработки с использованием NF. Проект можно клонировать на локальный компьютер с помощью Git, а затем импортировать в вашу IDE как Maven Project.

Запуск CoffeeTime: org.nico.ct.CtApplication

TP: Для удобства запуска, все ссылки на базы данных используют внешний IP-адрес сервера автора. Автор просит не делать ничего плохого, так как сервер не имеет большой ценности, но это всё равно может вызвать некоторые неудобства для автора.

3.3 Использование демонстрации

Давайте рассмотрим использование NF-фреймворка на примере CoffeeTime.

Структура проекта: 输入图片说明

3.3.1 Создание проекта

Создайте новый Maven-проект и добавьте зависимости NF и другие часто используемые jar-файлы в файл pom.xml:

<dependencies>
    <dependency>
      <groupId>com.gitee.ainilili</groupId>
      <artifactId>nf</artifactId>
      <version>1.0.5</version>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.38</version>
    </dependency>
    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1.2</version>
    </dependency>
</dependencies>

3.3.2 Написание конфигурационного файла

Сначала создаём файл конфигурации cat.xml для Nocat:

<?xml version="1.0" encoding="UTF-8"?>
<app>
    <cat:welcomes>
        <welcome>index.html</welcome>
        <welcome>index.jsp</welcome>
        <welcome>index.asp</welcome>
        <welcome>index.php</welcome> 
    </cat:welcomes>

    <cat:configs>
        <!-- 定义访问资源的路径, / 代表项目工作路径 -->
        <property field="server_resource_path"          value="/web"                />
        <property field="server_port"                   value="8080"                />
        <property field="server_charset"                value="utf-8"               />
        <property field="server_revice_buffer_size"     value="104857600"           />
        <property field="server_so_timeout"             value="0"                   />
    </cat:configs>
    
    <cat:listeners>
        <listener>
            <handler>org.nico.aoc.listener.NoaocListener</handler>
            <payload>
                {
                    "xmls":[
                        "cat-mysql.xml",
                        "cat-redis.xml"
                    ],
                    "packs":[
                        "org.nico.ct"
                    ],
                    "compents":[
                        "org.nico.cat.mvc.compent.MVCCompent"
                    ]
                }
            </payload>
        </listener>
        <listener>
            <handler>org.nico.cat.mvc.listener.ListenerForNocat</handler>
            <payload>
                {"scanpack":"org.nico.ct.controller"}
            </payload>
        </listener>
    </cat:listeners>
    
    <cat:filters>
        <filter>
            <uri>/v1/authc/**</uri>
            <handler>org.nico.ct.section.AuthFilter</handler>
        </filter>
    </cat:filters>
    
    <cat:apis>
        <api>
            <uri>/v1/**</uri>
            <handler>org.nico.cat.mvc.router.RouterForNocat</handler>
        </api>
    </cat:apis>
    
</app>

Конфигурируем интеграцию Noaoc с MySQL и Redis в файле cat-mysql.xml:

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <param key="jdbcUrl"
            value="jdbc:mysql://localhost:3306/ct?useUnicode=true&characterEncoding=utf8&useSSL=false" />
        <param key="user" value="root" />
        <param key="password" value="root" />
        <param key="driverClass" value="com.mysql.jdbc.Driver" />
        <param key="maxPoolSize" value="100" />
        <param key="minPoolSize" value="10" />
<!--        <param key="maxIdleTime" value="0" /> -->
    </book>

    <book id="MysqlSession" class="org.nico.db.session.branch.MysqlSession">
        <param key="autoCommit" value="false" />
        <label name="dataSource" ref="DataSource" />
    </book>

    <book id="MysqlDBHelper"
``` Данный текст написан на языке Java. 

Ниже представлен перевод текста на русский язык:

around(ProcessingAspectPoint point) throws Throwable { Object result = point.process(); return result; }

@Override @After(value = "expression(org.nico.ct.service.impl..(..))") public void after(AspectPoint point) { try { tm.commitTransaction(); tm.relaseConnection(); } catch (SQLException e) { } }

@Override @Wrong(value = "expression(org.nico.ct.service.impl..(..))") public void wrong(ProcessingAspectPoint point, Throwable e) throws Throwable{ tm.rollbackTransaction(); throw e; }


**В запросе отсутствует информация о том, что делать с кодом и специальными символами.**

* * *

> **Входная проверка**

![Описание изображения](https://gitee.com/uploads/images/2018/0622/091838_337cf736_1607679.png "2018062201331579.png")

#### 3.3.8. Запуск сервиса

![Описание изображения](https://gitee.com/uploads/images/2018/0622/091906_46ef2765_1607679.png "20180622013503203.png)

![Описание изображения](https://gitee.com/uploads/images/2018/0622/091929_7c51ccc2_1607679.png "20180622013550452.png)

#### 3.3.9. Размещение передней страницы

![Описание изображения](https://gitee.com/uploads/images/2018/0622/091958_530682e7_1607679.png "20180622013824512.png)

#### 3.3.10. Доступ

![Описание изображения](https://gitee.com/uploads/images/2018/0622/092012_79e4c86a_1607679.png "20180622014041959.png)

![Описание изображения](https://gitee.com/uploads/images/2018/0622/092024_b4f8b4fd_1607679.png "20180622014118338.png)

![Описание изображения](https://gitee.com/uploads/images/2018/0622/092037_d1f30c59_1607679.png "20180622014143509.png)

![Описание изображения](https://gitee.com/uploads/images/2018/0622/092048_5a4507b9_1607679.png "20180622014216392.png)

Поддержка потокового видео в прямом эфире

![Видеопоток](https://gitee.com/uploads/images/2018/0622/092104_511b2231_1607679.png "20180622014606746.png)

## Четыре. Продолжайте стараться

### 4.1. Обнаружение ошибок
Если вы обнаружите ошибку в проекте или нелогичное место в дизайне, я очень надеюсь, что вы сможете создать для меня ``Issues``, чтобы сделать NF-фреймворк всё более совершенным.
### 4.2. План на будущее
 - Использовать NF для завершения CoffeeTime
 - Использовать NF для завершения CoffeeBlog
 - Доработать модуль загрузки Noaoc
 - Добавить RPC-модуль
 - Увеличить Noaoc с помощью таймера
 - Оптимизировать Nodb
 - Определить дальнейшие шаги позже

### 4.3. Свяжитесь со мной
Email — ```ainililia@163.com```
QQ — ```473048656```
Группа общения — ```177563526```

Комментарии ( 0 )

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

Введение

Целый набор облегчённых сервисных фреймворков, разработанных на языке Java! Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/ainilili-No-Framework.git
git@api.gitlife.ru:oschina-mirror/ainilili-No-Framework.git
oschina-mirror
ainilili-No-Framework
ainilili-No-Framework
master