Введение в микросервисы Java с MSF4J

Введение в микросервисы Java с MSF4J

1. обзор

В этом руководстве мы продемонстрируемmicroservices development using the MSF4Jframework.

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

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

Нам понадобится немного больше конфигурации Maven, чем обычно, чтобы построить микросервис на основе MSF4J. За простоту и мощь этого фреймворка приходится платить:basically, we need to define a parent artifact, а также основной класс:


    org.wso2.msf4j
    msf4j-service
    2.6.0



    
        com.example.msf4j.Application
    

Последнюю версию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;
    }
}

И помните, что все используемые классы и аннотации - это просто элементыstandard JAX-RS, которые мы уже рассмотрелиin this article.

3.2. заявка

We can launch the microservice with this main class, где мы устанавливаем, развертываем и запускаем службу, определенную ранее:

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. В среде IDE, работающей как приложение Java

  2. Запуск сгенерированного пакета jar

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

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

We can tweak the configuration разными способами, просто добавляя некоторые предложения в код запуска.

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

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();

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

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 и т. Д.

  • input (@Consumes) тип содержимого

  • output (@Produces) тип содержимого

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

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

    private List meals = new ArrayList();

    @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 offers support for different data conversion libraries, например GSON (по умолчанию) и Jackson (через зависимостьmsf4j-feature). Например, мы можем использовать 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

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

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

5. MSF4J и Spring

We can also apply Spring in our MSF4J based microservices, из которого мы получим его функции внедрения зависимостей.

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

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


    
        org.wso2.msf4j
        msf4j-spring
        2.6.1
    
    
        org.wso2.msf4j
        msf4j-mustache-template
        2.6.1
    

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

5.2. API еды

Этот API - простой сервис, использующий репозиторий фиктивной еды. Notice how we use Spring annotations for auto-wiring и установить этот класс как компонент службы Spring.

@Service
public class MealService {

    @Autowired
    private MealRepository mealRepository;

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

    public List findAll() {
        return mealRepository.findAll();
    }

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

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

Мы объявляем контроллер как компонент, а Spring предоставляет сервис через автоматическое подключение. Первый метод показывает, как обслуживать шаблон усов, а второй - 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);
    }
}

Once started, we can see the result at http://localhost:8080/meals. Порт по умолчанию отличается в проектах Spring, но мы можем установить его на любой порт, который захотим.

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

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

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

@Configuration
public class PortConfiguration {

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

}

6. Conclusionс

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

Вокруг этой концепции много шума, ноsome theoretical background has been already set и MSF4J предоставляют удобный и стандартизированный способ применения этого шаблона.

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

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