Статьи

Развертывание микросервиса — Spring Boot fatjar для Amazon Elastic Beanstalk

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

Я решил использовать Amazon, так как у меня уже был опыт работы с ним. Amazon предлагает несколько различных способов развертывания веб-приложения Java.

Amazon EC2

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

AWS Эластичный бобовый стебель

Elastic Beanstalk — это простой в использовании сервис, который автоматически обрабатывает развертывание, автоматическое масштабирование, балансировку нагрузки и мониторинг работоспособности. Используя Elastic Beanstalk, любой может развернуть веб-приложение в облаке Amazon всего несколькими щелчками мыши.

Я решил пойти с быстрым и легким вариантом Elastic Beanstalk …

Elastic Beanstalk имеет различные способы развертывания приложений Java:

  1. Использование Docker
  2. Развертывание файла войны на сервере Tomcat
  3. Развертывание fatjar выполняется из командной строки

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

Чтобы это работало в Amazon, jar-файл должен быть помещен в zip-файл.

Создать JAR и ZIP файлы

В этом посте я использую Maven для создания jar-файлов и zip-файлов, описанных выше. Давайте рассмотрим пример файла pom.xml, чтобы увидеть, как это делается:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?xml version="1.0" encoding="UTF-8"?>
  <modelVersion>4.0.0</modelVersion>
  ...
  <groupId>com.kaviddiss</groupId>
  <artifactId>spring-boot-aws-beanstalk</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  ...
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.2.RELEASE</version>
    <relativePath />
    <!-- lookup parent from repository -->
    </parent>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    ...
  </dependencies>
  
  <build>
    <finalName>${project.artifactId}</finalName>
    <plugins>
      ...
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin 
       <plugin>
      <!-- NOTE: We don't need a groupId specification because the group is org.apache.maven.plugins ...which is assumed by default. -->
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <executions>
          <execution>
            <id>make-zip</id>
            <!-- this is used for inheritance merges -->
            <phase>package</phase>
            <!-- bind to the packaging phase -->
            <goals>
              <goal>
                single
              </goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <appendAssemblyId>false</appendAssemblyId>
          <descriptors>
            <descriptor>src/assembly/zip.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Этот файл основан на файле pom.xml, созданном для веб-приложений Spring Boot по адресу http://start.spring.io/ , и содержит несколько дополнительных изменений:

  1. Убедитесь, что тег упаковки установлен в банку
  2. Spring-boot-maven-plugin позаботится о создании файла jar, включая всю зависимость jar внутри самого файла
  3. Сконфигурируйте подключаемый модуль maven-assembly-plugin для создания файла zip из файла jar с использованием файла дескриптора src / assembly / zip.xml

После настройки плагина maven-assembly-plugin в файле pom.xml нам также потребуется настроить дескриптор zip.xml, который сообщает плагину сборки, как создавать сам zip-файл.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
   <id>zip</id>
   <formats>
     <format>zip</format>
   </formats>
   <includeBaseDirectory>false</includeBaseDirectory>
   <fileSets>
     <fileSet>
       <directory>${project.build.directory}</directory>
       <includes>
         <include>${project.artifactId}.jar</include>
       </includes>
       <outputDirectory>.</outputDirectory>
    </fileSet>
   </fileSets>
</assembly>

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

Мы также настроили включение файла jar в каталог верхнего уровня zip-файла. И это все, что нужно Amazon для запуска приложения из командной строки,

Пример микросервиса с использованием Spring Boot

Чтобы протестировать конфигурацию maven, я создал простое веб-приложение Spring Boot (см. Ниже).

Application.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
@SpringBootApplication
@Controller
public class Application {    
  @RequestMapping(value = "/hello")  
  public @ResponseBody String helloWorld() {  
    return "Hello, World!";  
  }    
   
  public static void main(String[] args) {  
    SpringApplication.run(Application.class, args);    
  }
}

Этот класс Application обслуживает основной класс веб-приложения и будет точкой входа при запуске fatjar из командной строки.

Развернуть в Эластичный бобовый стебель

Если вы еще не подписались на AWS Elastic Beanstalk, вы можете перейти по этой ссылке: https://console.aws.amazon.com/elasticbeanstalk .

Выберите платформу Amazon Elastic Beanstalk

Выберите платформу Amazon Elastic Beanstalk

Оказавшись внутри консоли, нажмите на создать новую среду для приложения. Затем нажмите «Создать веб-сервер», выберите «Java» в раскрывающемся списке «Платформа» и нажмите «Запустить сейчас».

Задать переменную среды

Задать переменную среды

AWS настраивает прокси-сервер nginx для пересылки запросов нашему приложению, работающему на порту 8080. Чтобы сообщить nginx о порте 8080, в разделе Конфигурация -> Конфигурация программного обеспечения добавьте переменную среды с ключом и значением, установленным в PORT = 8080.

Вот и все. Если все прошло хорошо, вы сможете получить доступ к образцу веб-приложения на AWS!