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

OSCHINA-MIRROR/52itstyle-spring-boot-elasticsearch

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

Запуск

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

Логирование

SpringBoot 2.0 версия: https://gitee.com/52itstyle/spring-boot-elasticsearch/tree/spring-boot2-elasticsearch/

На самом деле цель этого демонстрационного проекта — показать, как можно построить систему обработки веб-логов на основе Elasticsearch. Для этого используются некоторые открытые компоненты, такие как инструменты синхронизации данных и другие, чтобы быстро создать систему логирования. Проект находится в стадии разработки.

Демонстрационный сайт для просмотра логов: http://es.52itstyle.vip (данные не сохраняются, демонстрация приостановлена).

Введите описание изображения

Демонстрация логов по регионам: http://es.52itstyle.vip/area/index (данные не сохраняются, демонстрация приостановлена).

Введите описание изображения

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

Введите описание изображения

Среда разработки

JDK 1.8, Maven, Eclipse, SpringBoot 1.5.9, elasticsearch 2.4.6, Dubbo 2.6.2, zookeeper 3.4.13, Redis, Kafka, Vue, Iview.

Группа QQ

  • JAVA-любители ④:JAVA-любители

Версия

spring-boot-starter-parent-1.5.9.RELEASE, spring-data-elasticsearch-2.1.9.RELEAS, elasticsearch-2.4.6 (для версий выше 5.0 требуется JDK 8).

По состоянию на 22 января 2018 года последняя версия ElasticSearch — 6.1.2, но скорость обновления Spring-Boot значительно отстаёт от скорости обновления ElasticSearch, и на данный момент последней версией, поддерживаемой Spring-Boot, является elasticsearch-2.4.6.

Ссылка: https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix

Введите описание изображения

Подключение

В Spring-Boot используется spring-data-elasticsearch, который предоставляет два встроенных клиента для подключения:

  1. Клиент узла (node client): в файле конфигурации устанавливается значение local: false, клиент узла присоединяется к кластеру в качестве узла без данных (node-master или node-client), то есть он не хранит никаких данных, но знает расположение данных в кластере и может напрямую пересылать запросы соответствующему узлу.

  2. Транспортный клиент (Transport client): в файле конфигурации устанавливается значение local: true, этот более лёгкий транспортный клиент может отправлять запросы удалённому кластеру. Он не присоединяется к кластеру, а просто пересылает запросы удаленному кластеру. Оба Java-клиента взаимодействуют с кластером через порт 9300, используя протокол передачи ElasticSearch (Elasticsearch Transport Protocol). Узлы в кластере также обмениваются данными через порт 9300. Если этот порт не открыт, ваши узлы не смогут сформировать кластер.

Сервисная информация

Использование локального сервиса ElasticSearch (application-dev.properties)
spring.data.elasticsearch.cluster-name=elasticsearch
# По умолчанию это локальный хост, если вы хотите использовать удалённый сервер или сервер в локальной сети, вам необходимо настроить IP: порт; вы можете настроить несколько, разделяя их запятыми, что эквивалентно кластеру.
# Java-клиент: взаимодействует с кластером через порт 9300
# Все остальные языки программирования: могут использовать RESTful API через порт 9200 для связи с ElasticSearch.
# spring.data.elasticsearch.cluster-nodes=192.168.1.180:9300
Использование удалённого сервиса ElasticSearch (application-dev.properties)
  • Необходимо самостоятельно установить ElasticSearch и убедиться, что версия соответствует версии JAR-файла.

  • Ссылка для скачивания: https://www.elastic.co/downloads/past-releases/elasticsearch-2-4-6

  • Инструкции по установке: http://www.52itstyle.com/thread-20114-1-1.html

  • Не рекомендуется использовать root-пользователя для запуска новой версии, необходимо создать отдельного пользователя ElasticSearch или использовать следующую команду для запуска elasticsearch -Des.insecure.allow.root=true -d или добавить ES_JAVA_OPTS="-Des.insecure.allow.root=true" в elasticsearch.

Структура проекта

     
├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─itstyle
│  │  │          └─es
│  │  │              │  Application.java
│  │  │              │  
│  │  │              ├─common
│  │  │              │  ├─constant
│  │  │              │  │      PageConstant.java
│  │  │              │  │      
│  │  │              │  └─interceptor
│  │  │              │          MyAdapter.java
│  │  │              │          
│  │  │              └─log
│  │  │                  ├─controller
│  │  │                  │      LogController.java
│  │  │                  │      
│  │  │                  ├─entity
│  │  │                  │      Pages.java
│  │  │                  │      SysLogs.java
│  │  │                  │      
│  │  │                  ├─repository
│  │  │                  │      ElasticLogRepository.java
│  │  │                  │      
│  │  │                  └─service
│  │  │                      │  LogService.java
│  │  │                      │  
│  |  |                      └─impl
│  │  |                              LogServiceImpl.java
│  │  |                              
│  │  ├─resources
│  │  │  │  application-dev.properties
│  │  │  │  application-prod.properties
│  │  │  │  application-test.properties
``` **application.yml**

│  │  │  │  
│  │  │  ├─static
│  │  │  │  ├─iview
│  │  │  │  │  │  iview.css
│  │  │  │  │  │  iview.min.js
│  │  │  │  │  │  
│  │  │  │  │  └─fonts
│  │  │  │  │          ionicons.eot
│  │  │  │  │          ionicons.svg
│  │  │  │  │          ionicons.ttf
│  │  │  │  │          ionicons.woff
│  │  │  │  │          
│  │  │  │  ├─jquery
│  │  │  │  │      jquery-3.2.1.min.js
│  │  │  │  │      
│  │  │  │  └─vue
│  │  │  │          vue.min.js
│  |  │  │
│  │  │  └─templates
│  │  │      └─log
│  │  │              index.html
│  │  │              
│  │  └─webapp
│  │      │  index.jsp
│  │      │  
│  │      └─WEB-INF
│  │              web.xml
│  │              
│  └─test
│      └─java
│          └─com
│              └─itstyle
│                  └─es
│                      └─test
│                              Logs.java

**Проект демонстрации**

#### Демонстрация веб-сайта: http://es.52itstyle.com

#### Снимки экрана проекта

![Поиск страницы](https://gitee.com/uploads/images/2018/0123/155849_f7e4fcaa_87650.png "ES_index.png")

#### Разбиение на страницы

Используя ElasticsearchTemplate, было вставлено 200 000 записей данных, и это заняло около 60 секунд на локальном внешнем сервере (1 ядро, 1 ГБ), что составляет примерно 1 минуту. Хотя размер индекса увеличился, для поиска потребовалось около 10 минут.

При достижении 10 000+ страниц в разбиении на страницы система выдаёт ошибку «Result window is too large». Чтобы исправить это, добавьте следующий код в config/elasticsearch.yml:

Определённое количество

index.max_result_window : '10000000'


Ссылка: https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html

**Java API**

Elasticsearch предоставляет два встроенных клиента для пользователей Java:

- Клиент узла (node client):

Клиент узла, как следует из названия, сам по себе является частью кластера Elasticsearch. Он присоединяется к кластеру как узел без данных (none data node), то есть он не хранит никаких данных, но знает точное местоположение данных в кластере и может напрямую пересылать запросы соответствующему узлу.

- Транспортный клиент (Transport client):

Этот более лёгкий транспортный клиент может отправлять запросы удалённому кластеру. Сам он не присоединяется к кластеру, а просто пересылает запросы на узлы кластера. Оба клиента Java взаимодействуют с кластером через порт 9300, используя протокол передачи Elasticsearch (Elasticsearch Transport Protocol). Узлы в кластере также общаются друг с другом через порт 9300. Если этот порт не открыт, ваши узлы не смогут сформировать кластер.

**Установка Elasticsearch-Head**

elasticsearch-head — это графический инструмент для управления и администрирования кластеров, который позволяет выполнять операции с кластерами в режиме «всё в одном». Вы можете интегрировать его в es (предпочтительный способ) или установить как отдельный веб-приложение.

Основные функции elasticsearch-head включают:

* Отображение топологии кластера и возможность выполнения операций на уровне индекса и узла.
* Возможность поиска в кластере исходных данных JSON или данных в табличном формате.
* Быстрый доступ и отображение состояния кластера.

Способ установки плагина:

- Для Elasticsearch 5.x: плагины сайтов не поддерживаются. Запустите как отдельный сервер.
- Для Elasticsearch 2.x: sudo elasticsearch/bin/plugin install mobz/elasticsearch-head
- Для Elasticsearch 1.x: sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head/1.x
- Для Elasticsearch 0.x: sudo elasticsearch/bin/plugin -install mobz/elasticsearch-head/0.9

После успешной установки в каталоге plugins появится каталог head, указывающий на успешную установку.

Просмотр снимков экрана:

![Elasticsearch-Head](https://gitee.com/uploads/images/2018/0122/172610_74771172_87650.png "ES_head.png")

**x-pack мониторинг**

С выпуском Elastic 6.1, Elasticsearch, Logstash и Kibana были обновлены с версии 2.4 до версии 5.0. Версия ELK 5.x требует относительно высоких требований к совместимости версий, больше не поддерживает смешивание 5.x и 2.x, и Elastic объединил marvel, watch и alert в пакет под названием x-pack.

Установка: https://www.elastic.co/guide/en/elasticsearch/reference/6.1/installing-xpack-es.html

Управление пользователями

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

Изменить пароль пользователя elastic:

curl -XPUT -u elastic 'localhost:9200/_xpack/security/user/elastic/_password' -d '{ "password" : "123456" }'


**IK Analysis для Elasticsearch**

Скачать и установить:

- Способ 1 — скачать готовый пакет с здесь: https://github.com/medcl/elasticsearch-analysis-ik/releases
Распакуйте плагин в папку your-es-root/plugins/

- Способ 2 — используйте elasticsearch-plugin для установки (версия > v5.5.1):
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.0.0/elasticsearch-analysis-ik-6.0.0.zip

Поскольку версия Elasticsearch — 2.4.6, здесь выбрана версия IK — 1.10.6

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v1.10.6/elasticsearch-analysis-ik-1.10.6.zip


После распаковки файла в файле конфигурации Elasticsearch elasticsearch.yml в разделе index добавьте следующий код (для версии 2.0 и выше можно не устанавливать).

index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true

Или **Анализ текста с помощью Elasticsearch**

**Установка**:

http://192.168.1.180:9200/_analyze?analyzer=standard&pretty=true&text=я люблю тебя китай { "tokens": [ { "token": "я", "start_offset": 0, "end_offset": 1, "type": "", "position": 0 }, { "token": "люблю", "start_offset": 1, "end_offset": 2, "type": "", "position": 1 }, { "token": "тебя", "start_offset": 2, "end_offset": 3, "type": "", "position": 2 }, { "token": "китай", "start_offset": 3, "end_offset": 5, "type": "", "position": 3 } ] }


**После установки**:

http://121.42.155.213:9200/_analyze?analyzer=ik&pretty=true&text=я люблю тебя китай { "tokens": [ { "token": "я люблю тебя", "start_offset": 0, "end_offset": 3, "type": "CN_WORD", "position": 0 }, { "token": "люблю тебя", "start_offse": 1, "end_offset": 3, "type": "CN_WORD", "position": 1 }, { "token": "китай", "start_offset": 3, "end_offset": 5, "type": "CN_WORD", "position": 2 } ] }

Синхронизация данных

Для синхронизации MySQL и Elasticsearch используется сторонняя библиотека elasticsearch-jdbc.

Среда выполнения:

centos7.5, JDK8, elasticsearch-jdbc-2.3.2.0.

Этапы установки:

  1. Скачать библиотеку:

    wget http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc/2.3.2.0/elasticsearch-jdbc-2.3.2.0-dist.zip
  2. Распаковать архив:

    unzip elasticsearch-jdbc-2.3.2.0-dist.zip
  3. Настроить скрипт mysql_import_es.sh:

    
    

#!/bin/sh

elasticsearch-jdbc 安装路径

bin=/home/elasticsearch-jdbc-2.3.2.0/bin lib=/home/elasticsearch-jdbc-2.3.2.0/lib echo '{ "type" : "jdbc", "jdbc": { # 如果数据库中存在Json文件 这里设置成false,否则会同步出错 "detect_json":false, "url":"jdbc:mysql://127.0.0.1:3306/itstyle_log??useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true", "user":"root", "password":"root", # 如果想自动生成_id,去掉第一个获取字段即可;如果想Id作为主键,把id设置为_id即可 "sql":"SELECT id AS _id,id,user_id AS userId ,username,operation,time,method,params,ip,device_type AS deviceType,log_type AS logType,exception_detail AS exceptionDetail, gmt_create AS gmtCreate,plat_from AS platFrom FROM sys_log", "elasticsearch" : { "host" : "127.0.0.1",#elasticsearch服务地址 "port" : "9300" #远程elasticsearch服务 此端口一定要开放 }, "index" : "elasticsearch",# 索引名相当于库 "type" : "sysLog" # 类型名相当于表 } }' | java
-cp "${lib}/*"
-Dlog4j.configurationFile=${bin}/log4j2.xml
org.xbib.tools.Runner
org.xbib.tools.JDBCImporter

4. Выполнить скрипт:

chmod +x mysql_import_es.sh ./mysql_import_es.sh


## ElasticSearchRepository и ElasticSearchTemplate

Spring-data-elasticsearch — это слой данных для работы с Elasticsearch от Spring. Он предоставляет множество базовых операций, которые упрощают работу с Elasticsearch.

#### Основные операции ElasticSearchRepository

/**

  • @param

  • @param

  • @author Rizwan Idrees

  • @author Mohsin Husen */ @NoRepositoryBean public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {

    S index(S entity);

    Iterable search(QueryBuilder query);

    Page search(QueryBuilder query, Pageable pageable);

    Page search(SearchQuery searchQuery);

    Page searchSimilar(T entity, String[] fields, Pageable pageable);

    void refresh();

    Class getEntityClass(); }


ElasticSearchTemplate в большей степени является дополнением к ESRepository и предоставляет некоторые более низкоуровневые методы.

Здесь мы в основном реализуем функцию быстрого чтения и пакетной вставки данных. Вставляем 200 000 записей, на локальном внешнем сервере (1 ядро, 1 ГБ), время выполнения составляет около 60 секунд, то есть примерно одну минуту. Хотя объём индексного хранилища увеличивается, для поиска требуется примерно 10 минут.

// Пакетная синхронизация или вставка данных public void bulkIndex(List logList) {
long start = System.currentTimeMillis(); int counter = 0;
try {
List queries = new ArrayList<>();
for (SysLogs log : logList) {
IndexQuery indexQuery = new IndexQuery();
indexQuery.setId(log.getId()+ "");
indexQuery.setObject(log);
indexQuery.setIndexName("elasticsearch");
indexQuery.setType("sysLog");
// Также можно использовать IndexQueryBuilder для построения
// IndexQuery index = new IndexQueryBuilder().withId(person.getId() + "").withObject(person).build();
queries.add(indexQuery);
if (counter % 1000 == 0) {
elasticSearchTemplate.bulkIndex(queries);
queries.clear();
System.out.println("bulkIndex counter : " + counter);
}
counter++;
}
if (queries.size() > 0) {
elasticSearchTemplate.bulkIndex(queries);
} long end = System.currentTimeMillis(); System.out.println("bulkIndex completed use time:"+ (end-start));

} catch (Exception e) {  
    System.out.println("IndexerService.bulkIndex e;" + e.getMessage());  
    throw e;  
}  

}


**Redis журнал очереди**

См. пакет: com.itstyle.es.common.redis

Конфигурация слушателя RedisListener:

@Component public class RedisListener { private static final Logger LOGGER = LoggerFactory.getLogger(RedisListener.class); @Bean RedisMessageListenerContainer container( RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { LOGGER.info("Запуск прослушивания"); RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(listenerAdapter, new PatternTopic("itstyle_log")); return container; }

@Bean
MessageListenerAdapter listenerAdapter(Receiver receiver) {
    return new MessageListenerAdapter(receiver, "receiveMessage");
}

@Bean
Receiver receiver(CountDownLatch latch) {
    return new Receiver(latch);
}

@Bean
CountDownLatch latch() {
    return new CountDownLatch(1);
}

@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
    return new StringRedisTemplate(connectionFactory);
}

}


Приёмник журнала Receiver:

public class Receiver { private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class); @Autowired private ElasticLogRepository elasticLogRepository; private CountDownLatch latch;

@Autowired
public Receiver(CountDownLatch latch) {
    this.latch = latch;
}

public void receiveMessage(String message) {
    LOGGER.info("Получение сообщения журнала <{}>",message);
    if(message == null){
        LOGGER.info("Получено сообщение журнала <" + null + ">");
    }else {
        ObjectMapper mapper = new ObjectMapper();  
        try {
            SysLogs log = mapper.readValue(message, SysLogs.class);
            elasticLogRepository.save(log);
            LOGGER.info("Содержание сообщения журнала <{}>",log.getOperation());
        } catch (JsonParseException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    latch.countDown();
}

}


Тестирование LogController: http://lip:port/redisLog

**Kafka журнал очереди**

См. пакет: com.itstyle.es.common.kafka

## Рекомендуемые материалы для чтения **Архитектура JavaWeb-проектов: система обработки журналов Elasticsearch**

**Архитектура JavaWeb-проектов: распределённая система очередей журналов Redis**

**Архитектура JavaWeb-проектов: распределённая система очередей журналов Kafka**

Автор: 小柒2012

Подписывайтесь: https://blog.52itstyle.vip/

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

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

Введение

Описание недоступно Развернуть Свернуть
GPL-2.0
Отмена

Обновления

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

Участники

все

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

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