«1. Обзор

В этом руководстве мы продемонстрируем разработку микросервисов с использованием среды MSF4J.

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

2. Зависимости Maven

Нам потребуется немного больше настроек Maven, чем обычно, для создания микросервиса на основе MSF4J. Простота и мощь этого фреймворка имеют свою цену: в основном нам нужно определить родительский артефакт, а также основной класс:

<parent>
    <groupId>org.wso2.msf4j</groupId>
    <artifactId>msf4j-service</artifactId>
    <version>2.6.0</version>
</parent>

<properties>
    <microservice.mainClass>
        com.baeldung.msf4j.Application
    </microservice.mainClass>
</properties>

Последнюю версию msf4j-service можно найти на Maven Central .

Далее мы покажем три различных сценария микросервисов. Сначала минималистичный пример, затем RESTful API и, наконец, пример интеграции Spring.

3. Базовый проект

3.1. Простой API

Мы собираемся опубликовать простой веб-ресурс.

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

Возвращаемый тип содержимого — обычный текст:

@Path("/")
public class SimpleService {

    @GET
    public String index() {
        return "Default content";
    }

    @GET
    @Path("/say/{name}")
    public String say(@PathParam("name") String name) {
        return "Hello " + name;
    }
}

И помните, что все используемые классы и аннотации — это просто стандартные элементы JAX-RS, которые мы уже рассмотрели в этой статье.

3.2. Приложение

Мы можем запустить микросервис с этим основным классом, где мы устанавливаем, развертываем и запускаем сервис, определенный ранее:

public class Application {
    public static void main(String[] args) {
        new MicroservicesRunner()
          .deploy(new SimpleService())
          .start();
    }
}

Если мы хотим, мы можем сцепить здесь вызовы deploy для одновременного запуска нескольких сервисов: ~~ ~

new MicroservicesRunner()
  .deploy(new SimpleService())
  .deploy(new ComplexService())
  .start()

3.3. Запуск микросервиса

Для запуска микросервиса MSF4J у нас есть несколько вариантов:

  1. On an IDE, running as a Java application
  2. Running the generated jar package

После запуска вы можете увидеть результат по адресу http://localhost:9090.

3.4. Конфигурации запуска

Мы можем настроить конфигурацию множеством способов, просто добавив некоторые пункты в код запуска.

Например, мы можем добавить любой перехватчик для запросов:

new MicroservicesRunner()
  .addInterceptor(new MetricsInterceptor())
  .deploy(new SimpleService())
  .start();

Или мы можем добавить глобальный перехватчик, например, для аутентификации:

new MicroservicesRunner()
  .addGlobalRequestInterceptor(newUsernamePasswordSecurityInterceptor())
  .deploy(new SimpleService())
  .start();

Или, если нам нужно управление сеансом , мы можем установить диспетчер сеансов:

new MicroservicesRunner()
  .deploy(new SimpleService())
  .setSessionManager(new PersistentSessionManager()) 
  .start();

Для получения более подробной информации о каждом из этих сценариев и просмотра некоторых рабочих примеров посетите официальный репозиторий MSF4J на GitHub.

4. Создание микросервиса API

Мы показали самый простой пример. Теперь перейдем к более реалистичному проекту.

На этот раз мы покажем, как создать API со всеми типичными операциями CRUD для управления хранилищем еды.

4.1. Модель

Модель представляет собой простой POJO, представляющий еду:

public class Meal {
    private String name;
    private Float price;

    // getters and setters
}

4.2. API

Мы создаем API как веб-контроллер. Используя стандартные аннотации, мы устанавливаем для каждой функции следующее:

    URL-адрес HTTP-метод: GET, POST и т. д. ввод (@Consumes) тип контента вывод (@Produces) тип контента

Итак, давайте создадим метод для каждая стандартная операция CRUD:

@Path("/menu")
public class MenuService {

    private List<Meal> meals = new ArrayList<Meal>();

    @GET
    @Path("/")
    @Produces({ "application/json" })
    public Response index() {
        return Response.ok()
          .entity(meals)
          .build();
    }

    @GET
    @Path("/{id}")
    @Produces({ "application/json" })
    public Response meal(@PathParam("id") int id) {
        return Response.ok()
          .entity(meals.get(id))
          .build();
    }

    @POST
    @Path("/")
    @Consumes("application/json")
    @Produces({ "application/json" })
    public Response create(Meal meal) {
        meals.add(meal);
        return Response.ok()
          .entity(meal)
          .build();
    }

    // ... other CRUD operations
}

4.3. Функции преобразования данных

MSF4J предлагает поддержку различных библиотек преобразования данных, таких как GSON (которая поставляется по умолчанию) и Jackson (через зависимость функции msf4j). Например, мы можем использовать GSON явно:

@GET
@Path("/{id}")
@Produces({ "application/json" })
public String meal(@PathParam("id") int id) {
    Gson gson = new Gson();
    return gson.toJson(meals.get(id));
}

Кстати, обратите внимание, что мы использовали фигурные скобки как в аннотациях @Consumes, так и в @Produces, поэтому мы можем установить более одного типа MIME.

4.4. Запуск микрослужбы API

Мы запускаем микрослужбу так же, как и в предыдущем примере, через класс приложения, который публикует MenuService.

После запуска вы можете увидеть результат по адресу http://localhost:9090/menu.

5. MSF4J и Spring

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

5.1. Зависимости Maven

Нам нужно будет добавить соответствующие зависимости к предыдущей конфигурации Maven, чтобы добавить поддержку Spring и Mustache:

<dependencies>
    <dependency>
        <groupId>org.wso2.msf4j</groupId>
        <artifactId>msf4j-spring</artifactId>
        <version>2.6.1</version>
    </dependency>
    <dependency>
        <groupId>org.wso2.msf4j</groupId>
        <artifactId>msf4j-mustache-template</artifactId>
        <version>2.6.1</version>
    </dependency>
</dependencies>

Последние версии msf4j-spring и msf4j-mustache-template можно найти на Maven. Центральный.

5.2. Meal API

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

@Service
public class MealService {
 
    @Autowired
    private MealRepository mealRepository;

    public Meal find(int id) {
        return mealRepository.find(id);
    }

    public List<Meal> findAll() {
        return mealRepository.findAll();
    }

    public void create(Meal meal) {
        mealRepository.create(meal);
    }
}

5.3. Контроллер

«Мы объявляем контроллер как компонент, а Spring предоставляет услугу посредством автоматического подключения. Первый метод показывает, как обслуживать шаблон Mustache, а второй — ресурс JSON:

@Component
@Path("/meal")
public class MealResource {

    @Autowired
    private MealService mealService;

    @GET
    @Path("/")
    public Response all() {
        Map map = Collections.singletonMap("meals", mealService.findAll());
        String html = MustacheTemplateEngine.instance()
          .render("meals.mustache", map);
        return Response.ok()
          .type(MediaType.TEXT_HTML)
          .entity(html)
          .build();
    }

    @GET
    @Path("/{id}")
    @Produces({ "application/json" })
    public Response meal(@PathParam("id") int id) {
        return Response.ok()
          .entity(mealService.find(id))
          .build();
    }

}

5.4. Основная программа

В сценарии Spring мы запускаем микросервис следующим образом:

public class Application {

    public static void main(String[] args) {
        MSF4JSpringApplication.run(Application.class, args);
    }
}

После запуска мы можем увидеть результат по адресу http://localhost:8080/meals. Порт по умолчанию отличается в проектах Spring, но мы можем установить любой порт, который захотим.

5.5. Компоненты конфигурации

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

Например, этот изменяет порт по умолчанию для микросервиса:

@Configuration
public class PortConfiguration {

    @Bean
    public HTTPTransportConfig http() {
        return new HTTPTransportConfig(9090);
    }

}

6. Заключение

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

Вокруг этой концепции много шума, но некоторые теоретические предпосылки уже созданы, и MSF4J предоставляет удобный и стандартизированный способ применения этого шаблона.

Кроме того, для дальнейшего чтения взгляните на создание микросервисов с Eclipse Microprofile и, конечно же, наше руководство по микросервисам Spring с Spring Boot и Spring Cloud.

И, наконец, все приведенные здесь примеры можно найти в репозитории GitHub.