Применение SpringBoot в Бэйчао

Spring Boot Java Spring Dubbo

Автор: Ляо Мин (добро пожаловать на liaoming.lxm@gmail.com)

С ростом силы экологического сообщества Spring Boot серверная команда Beichat постепенно приняла среду Spring Boot при разработке некоторых новых систем и накопила некоторый опыт, которым я хотел бы поделиться с вами.

Преимущества весенней загрузки

Каковы преимущества использования Spring Boot в проекте и прямого использования Spring MVC? Здесь мы анализируем следующие моменты:

  • Используйте метод конфигурации Java Config, чтобы заменить конфигурацию XML-файла, чтобы обеспечить повторное использование класса конфигурации. Избегайте копирования файла конфигурации xml в старый проект каждый раз, когда вы создаете новый проект Spring MVC.
  • Богатый пакет зависимостей Starter pom, предоставленный сообществом, значительно облегчает нашу интеграцию сторонних фреймворков.
  • Предоставляет встроенный контейнер сервлетов, поддерживает развертывание jar и war и обеспечивает большое удобство эксплуатации, обслуживания и разработки.
  • Автоматически управляйте зависимостями и избегайте конфликтов версий.
  • Предоставляет основные функции мониторинга приложений.

Подводя итог, по сравнению со сборкой проектов непосредственно с помощью Spring MVC, Spring Boot упрощает разработку, настройку, мониторинг и развертывание.

Применение Spring Boot в Бэйчао

Прежде чем говорить о Spring Boot, необходимо рассказать о стеке технологий, который сейчас использует наш сервер Beichat:

  • Базовый фреймворк Spring MVC.
  • Для управления услугами используется Dubbo.
  • На уровне базы данных используются Mybatis и Druid, и настраивается несколько источников данных.
  • Контроль разрешений использует Широ.
  • Распределенная конфигурация с использованием Disconf.
  • Распределенные задачи синхронизации с использованием Elastic-Job.
  • Cat используется для полного мониторинга ссылок.
  • Для развертывания мы используем собственную систему публикации.

Представляя Spring Boot, мы должны поддерживать существующий стек технологий и иметь возможность быстро знакомить новых коллег. Опираясь на концепцию Spring Boot о соглашении по сравнению с конфигурацией и различные богатые конфигурации Starter pom, предоставляемые официальными лицами и сообществом при поддержке коллег, интеграция всех аспектов проходит относительно гладко. В следующем тексте я объясню вам некоторые способы использования Beichao Spring Boot.

Использование Dubbo с Spring Boot

Сервер Beichat использует инфраструктуру Dubbo для реализации управления услугами.Dubbo в настоящее время находится в стадии инкубации в инкубаторе Apache, и официальный представитель также предоставляетincubator-dubbo-spring-boot-project, но официально0.1.0Версия вышла только в апреле, а до этого мы написали свой spring-boot-starter-dubbo под существующие нужды.

После того, как новый проект использует spring-boot-starter-dubbo, мы используем аннотации при выставлении и внедрении сервисов Dubbo, отказываясь от исходного метода конфигурации xml, и нам не нужно обращать внимание на то, находится ли он в dubbo.xml во время разработки. есть служба внедрения, ее относительно легко кодировать.

Интеграция с Elastic-Job-Lite

Бэй Ляо очень рано использовал Elastic-Job для управления распределенными заданиями и использовал более раннюю версию без обновления. Для существующих проектов конфигурация и задания Elastic-Job размещаются в одномspring-job.xmlвнутри файла. При интеграции Elastic-Job и Spring Boot я обнаружил, что у сообщества есть открытый исходный код.spring-boot-starer-elastic-job, но с последней версией Elastic-Job-Lite. На этом фоне я подготовил два сценария:

  • использовать@ImportResource({"classpath:spring-job.xml"})способ быть совместимым с задачами старой версии Elastic-Job и нормально работать при написании демок;
  • Обновите версию Elastic-Job до Elastic-Job-Lite и установите последнюю версию Elastic-Console, обратитесь к Starter сообщества, напишите и настройте временные задачи с помощью аннотаций и перейдите на xml;

После обсуждения с коллегами была принята последняя схема, а версия Elastic-Job была обновлена ​​до Elastic-Job-Lite, а в новом проекте использовалисьspring-boot-starter-elastic-jobнастроить и использовать аннотации для объявления заданий. На данный момент другой файл xml был удален.

Интеграция с Disconf

Discof — это инструмент управления распределенной конфигурацией, представленный Beichao в первые дни. Он также очень прост в использовании. Хотя первоначальный автор прекратил его поддержку, все еще есть энтузиасты-нетизены, которые его предоставляют.disconf-spring-boot-starter, Основываясь на этом Starter, он также значительно упрощает наши затраты на настройку в новом проекте.Когда новые коллеги настраивают Discof, им не нужно копировать xml-конфигурацию старого проекта Diconf.

Интеграция с Mybatis, Druid и несколькими источниками данных

Эта часть интеграции относительно проста.Mybatis и Druid официально имеют Starter poms, которые обеспечивают автоматическую настройку, которую можно использовать из коробки.

Особого внимания требует конфигурация с несколькими источниками данных.Единый класс конфигурации компании, использовавшийся в предыдущей системе, представляет собой просто конфигурацию xml. Чтобы повторно использовать код, мы преобразуем его в Java Config и планируем извлечь его в стартовый пакет для автоматической настройки в будущем. Точно так же, когда мы интегрировали Shiro, мы также приняли форму Java Config и интегрировали JWT в качестве маркера доступа к интерфейсу.

Интеграция с мониторингом кошек

Что касается APM-мониторинга, наша компания использует Cat, а наши коллеги из команды платформы строят Cat и предоставляют соответствующий метод интеграции. Некоторые из них до сих пор используют xml при настройке bean-инъекций. Позже автор изменил его на Java Config. общий процесс интеграции выглядит следующим образом:

  • 1. Представить упаковки банок, связанные с Cat;
  • 2. Если это веб-проект, внедрить егоCatServletFilter, для достижения конфигурации Cat уровня MVC;
  • 3. Если в проекте используется Dubbo, добавьтеCatDubboFilter;
  • 4. ВMETA-INFдобавлено вapp.properties, объявить имя проекта;
  • 5. Вlogback-spring.xmlдобавлено вCatLogbackAppenderнастроить;

В приведенных выше 5 шагах первые 3 шага можно объединить в один, 2 и 3 шага, вы можете изменить конфигурацию xml на конфигурацию Java и создатьspring-boot-starter-cat-monitorpackage, чтобы реализовать повторное использование классов конфигурации и упростить этапы настройки. Далее также представлен принцип автоматической настройки на шагах 2 и 3:

  • Внедрить CatServletFilter, в основном используя@ConditionalOnWebApplicationОбратите внимание: если текущая среда является веб-средой, класс конфигурации вступит в силу.Основной код выглядит следующим образом:
/**
 * 功能:web 环境下,集成cat监控功能
 */
@Configuration
@ConditionalOnWebApplication
public class CatWebFilterConfigure {

    @Bean
    public FilterRegistrationBean catFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new CatServletFilter());
        registration.addUrlPatterns("/*");
        registration.setDispatcherTypes(DispatcherType.REQUEST,DispatcherType.FORWARD);
        registration.setName("cat-filter");
        return registration;
    }
}
  • Внедрить CatDubboFilter, в основном используя Dubbo@Activateбезоговорочно активировать конфигурацию. Поскольку все наши проекты интегрируют Dubbo, нет необходимости внедрять классы конфигурации в соответствии со средой.
/**
 * 功能:dubbo cat 监控,使用Activate注解, 无条件自动激活,不需要在yml 配置中声明该filter 了
 */
@Activate(group = {Constants.PROVIDER, Constants.CONSUMER})
public class CatBootDubboConfigure extends Filter {
    //此处省略具体的埋点操作
}

Используйте spring-boot-start-web-log для равномерного перехвата журналов запросов и ответов.

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

На этапе отладки ежедневной разработки интерфейса нам часто требуется просматривать журналы запросов и ответов интерфейса. Есть много способов использовать Spring для перехвата журналов запросов и ответов интерфейса.Вы можете определить Filter, Intercepter самостоятельно или использовать Aspectj.Если вы пишете набор реализаций для каждого веб-проекта или копируете копии из других проектов, это определенно не хороший способ. Основываясь на этой ситуации, мы применяем принцип соглашения Spring Boot по сравнению с конфигурацией и инкапсулируем его внутри.spring-boot-start-web-logи предоставляет некоторые общие элементы конфигурации. Когда это нужно новому веб-проекту, ему нужно только ввести зависимости и добавить следующую конфигурацию в файл конфигурации yml:

web.log:
    ## 拦截路径
    mapping-path: "/*"
    ## 排除路径
    exclude-mapping-path: "/files/*;/favicon.ico;/login;/captcha/*
    ## 打印header,多个按照';'分隔
    print-header: "Authorization"
    ## 是否允许打印日志,默认true,建议生成关闭
    enable: true

Эффект журнала выглядит следующим образом:

Развертывание приложений Spring Boot в существующих системах распространения

Когда мы впервые начали развертывать наше приложение Spring Boot в нашей существующей системе публикации, мы столкнулись с некоторыми проблемами.

Что касается развертывания приложений, мы попробовали два метода: развертывание военного пакета и развертывание jar. Среди них при развертывании war-пакета обнаруживается, что он будет конфликтовать с существующим Resin, и некоторые jar-файлы Resion необходимо удалить, что доставляет хлопот, поэтому мы используем метод развертывания jar-пакета.

Используя развертывание пакета jar, мы также столкнулись с некоторыми проблемами. Наше существующее развертывание приложения Dubbo использует развертывание пакета jar. Удаление некоторых параметров JVM настраивается и в конечном итоге используетсяjava -cp имя класса пути к пакету jarкоманда для запуска приложения. Обратите внимание, что таким образом вам нужно указать путь к банке и имя класса, а такжеjava -jar spring-boot-app.jarотличается, поэтому, чтобы избежать изменений сценария, мы должны адаптировать существующий сценарий выпуска.

Dubbo упакован в пакет jar, который может работать независимо, используяmaven-shade-pluginплагин, указанное имя классаcom.alibaba.dubbo.container.Main. При упаковке приложений Spring Boot мы используемspring-boot-maven-pluginплагин . в выбореjava -cpКогда команде требуется имя класса параметра, мы просто начали использовать класс запуска приложения Spring Boot по умолчанию.В конце концов, когда мы разрабатываем, мы также напрямую запускаем основной метод этого класса для запуска приложения. Однако, когда он фактически запущен, обнаруживается, что приложение вообще не может быть запущено, что указывает на то, что основной класс не может быть найден или не может быть загружен. После некоторого поиска и изучения данных проблема была решена.

Ключом к решению проблемы является понимание принципа работы баночки, т.е.MANIFEST.MFдокумент. Разархивируйте файл jar, упакованный Spring Boot, гдеMANIFEST.MFФайлы следующие:

Manifest-Version: 1.0
Implementation-Title: demo
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: Ming
Implementation-Vendor-Id: com.beiliao.app
Spring-Boot-Version: 1.5.4.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.beiliao.app.DemoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.3.1
Build-Jdk: 1.8.0_73
Implementation-URL: http://projects.spring.io/spring-boot/demo/

обратите внимание здесьMain-Class: org.springframework.boot.loader.JarLauncherявляется основным методом, используйтеjava -jar spring-boot-app.jarВы можете запускать приложения Spring Boot, потому чтоspring-boot-maven-pluginПлагин уже сгенерировал этот файл при упаковке,java -jarКоманда прочитает файл. Поэтому используйтеjava -cpКогда команда запускает приложение Spring Boot, полная команда должна быть такой:

windows:
java -cp .;c:\\Project\\boot-demo\\target\\demo-0.0.1-SNAPSHOT.jar  org.springframework.boot.loader.JarLauncher
linux:
java -cp .:/data/project/demo/*  org.springframework.boot.loader.JarLauncher

Суммировать

Выше приведены некоторые приложения Spring Boot в Beichao. В настоящее время Бэй Ляо использовал Spring Boot в нескольких новых проектах, и в группе были хорошие отзывы.Большинство коллег по разработке, которые использовали его, говорят, что это намного удобнее, чем непосредственное использование Spring MVC ранее. В репозитории Gitlab компании также есть 6 пакетов зависимостей Starter, которые будут добавлены в будущем.