Статьи

Легкие Java EE Microservices с Payara Micro

Хотите знать, как начать работу с Java EE Microservices? Для развертывания микросервиса с помощью API-интерфейсов Java EE требуется всего несколько быстрых шагов. Многие считают, что Java EE слишком тяжелый для использования с микросервисами, но это просто не тот случай, особенно если вы используете только те спецификации Java EE, которые требуются для вашей службы. В этом кратком посте я покажу, как быстро разработать Microservice с Java EE, а затем развернуть его в Payara Micro.

Чтобы загрузить пример проекта, перейдите на GitHub: https://github.com/juneau001/SimpleService

Для целей этого примера я буду использовать NetBeans, но подойдет любая Java IDE. Для начала создайте веб-приложение Maven и назовите его SimpleService. Затем создайте два пакета Java: org.simpleservice и org.simpleservice.entity. После завершения проект должен выглядеть примерно так:

Сейчас многие считают, что микросервис не должен подключаться к корпоративной базе данных, но я оставлю это для тех, кто хочет спорить. В этом примере я подключу этот сервис к центральной базе данных Apache Derby для получения данных, потому что я считаю, что это очень вероятный сценарий во многих организациях. В этом случае мы создадим веб-службу базы данных «Предлагаемое имя», которая будет запрашивать в таблице базы данных предлагаемые имена для будущей платформы EE4J. Чтобы создать инфраструктуру, подключитесь к локальной базе данных Apache Derby и создайте ее, используя следующий SQL:

1
2
3
4
5
6
7
create table SUGGESTED_NAME (
id numeric primary key,
name varchar(150));
 
insert into suggested_name values(1, 'Open EE');
insert into suggested_name values(2, 'Open JOE');
insert into suggested_name values(3, 'Cappucino');

Затем откройте файл POM Maven для проекта SimpleService и добавьте следующие зависимости:

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
<dependencies>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>javax.persistence-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.ejb</groupId>
            <artifactId>javax.ejb-api</artifactId>
            <version>3.2</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>eclipselink</artifactId>
            <version>2.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId>
            <version>2.5.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.derby</groupId>
            <artifactId>derbyclient</artifactId>
            <version>10.14.1.0</version>
        </dependency>
    </dependencies>

Обратите внимание, что нет зависимости Java EE. Это потому, что я использую только те зависимости, которые необходимы для службы. Каждая зависимость добавляется отдельно.

Затем создайте пакет org.simpleservice.entity и создайте в нем класс сущности с именем Предлагаемое имя. Для краткости я не буду вдаваться во все источники здесь, но вы можете проверить источники на GitHub ( https://github.com/juneau001/SimpleService ).

Нам нужно будет реализовать наш класс веб-сервиса JAX-RS дальше. Чтобы настроить приложение Java EE для JAX-RS, давайте создадим класс с именем ApplicationConfig и поместим его в пакет org.simpleservice:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
import java.util.Set;
import javax.ws.rs.core.Application;
 
/**
 *
 * @author Juneau
 */
@javax.ws.rs.ApplicationPath("rest")
public class ApplicationConfig extends Application {
    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<>();
        resources.add(org.simpleservice.SuggestedNameService.class);
        return resources;
    }
}

Затем я создам сам класс веб-службы JAX-RS и назову его «Предлагаемое имя сервиса». Вот источники для класса Additional_NameService. Обратите внимание, что я ввел блок персистентности. Я доберусь до этого дальше.

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
@Stateless
  
@Path("suggestedNameService")
  
public class SuggestedNameService {
  
 
  
    @PersistenceContext(unitName = "SimpleService_1.0PU")
  
    private EntityManager em;
  
 
  
 
  
    @GET
  
    @Path("{id}")
  
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  
    public SuggestedName find(@PathParam("id") BigDecimal id) {
  
        SuggestedName suggestedName = null;
  
        try {
  
            suggestedName = (SuggestedName) 
  
                    em.createQuery("select object(o) from SuggesetedName o " +
  
                    "where o.id = :id")
  
                    .setParameter("id", id)
  
                    .getSingleResult();
  
        } catch (NoResultException ex){
  
            System.out.println("Error: "  + ex);
  
        }
  
        return suggestedName;
  
    }
  
    
  
    @GET
  
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
  
    public List<SuggestedName> findAll() {
  
        List<SuggestedName> suggestedNames = null;
  
        try {
  
            suggestedNames = em.createQuery("select object(o) from SuggestedName o")
  
                    .getResultList();
  
        } catch (NoResultException ex){
  
            System.out.println("Error: "  + ex);
  
        }
  
        return suggestedNames;
  
    }
  
 
  
    protected EntityManager getEntityManager() {
  
        return em;
  
    }
  
     
  
}

Поскольку этот сервис будет подключаться к базе данных, я создам постоянный модуль для проекта. Это легко сделать в NetBeans, щелкнув правой кнопкой мыши по проекту и выбрав New-> Persistence-> Persistence Unit. Назовите постоянный модуль SimpleService_1.0PU и используйте EclipseLink в качестве поставщика. Не добавляйте источник данных на этом этапе.

После создания откройте модуль сохраняемости и добавьте информацию о соединении. В этом случае я подключусь к источнику данных JTA, который я определю следующим. Источник данных называется DerbyDataSource, поэтому содержимое модуля сохраняемости (persistence.xml) должно выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
 
  
  
  <persistence-unit name="AuthorService_1.0PU" transaction-type="JTA">
  
    <jta-data-source>java:global/DerbyDataSource</jta-data-source>
  
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
  
    <properties/>
  
  </persistence-unit>
  
</persistence>

Создайте дескриптор развертывания web.xml для проекта. Если вы делаете это в NetBeans, просто щелкните правой кнопкой мыши проект и выберите New-> Web -> ”Стандартный дескриптор развертывания (web.xml) и нажмите Finish. После создания дескриптора развертывания web.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
 
  
  
  
         version="3.1">
  
    <session-config>
  
        <session-timeout>
  
            30
  
        </session-timeout>
  
    </session-config>
 
  
  
<data-source>
  
        <name>java:global/DerbyDataSource</name>
  
        <class-name>org.apache.derby.jdbc.ClientDriver</class-name>
  
        <server-name>localhost</server-name>
  
        <port-number>1527</port-number>
  
        <url>jdbc:derby://localhost:1527/acme</url>
  
        <user>acmeuser</user>
  
        <password>yourpassword</password
  
    </data-source>
 
  
</web-app>

Вот и все для приложения Java EE. Теперь вы сможете скомпилировать проект в файл WAR и развернуть его на GlassFish, Payara или другом сервере приложений Java EE по вашему выбору. В этом случае давайте развернемся в Payara Micro.

Для начала загрузите последнюю версию файла JAR Payara Micro с веб-сайта: https://www.payara.fish/payara_micro

После загрузки сервер можно запустить, открыв командную строку и выполнив JAR с локальной средой выполнения Java, набрав:

1
java -jar payara-micro-4.1.2.174.jar

Чтобы развернуть созданное нами приложение (микросервис), просто используйте параметр –deploy при выполнении JAR Payara Micro и укажите его в WAR-файле SimpleService:

1
java -jar payara-micro-4.1.2.174.jar --deploy SimpleService-1.0.war

Микросервис SimpleService теперь доступен по следующему URL: http: // localhost: 8080 / SimpleService-1.0 / rest / предложилNameService

Опубликовано на Java Code Geeks с разрешения Джоша Джуно, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Easy Java EE Microservices с Payara Micro

Мнения, высказанные участниками Java Code Geeks, являются их собственными.