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

Шаг 2 — Пользовательский микросервис

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

Детали инициализации

  • Инструмент сборки проекта: Maven
  • Язык: Java
  • Весенняя загрузка: 2.4.2
  • Метаданные проекта

Группа:com.agnasarp

Артефакт:agnasarp-user-microservice

Имя:agnasarp-user-microservice

Описание:Пользовательский микросервис Agnasarp

Имя пакета:com.agnasarp.user

Упаковка: банка

Версия Java: 8

  • Зависимости:

Spring Web: создавайте веб-приложения, в том числе RESTful, с помощью Spring MVC. Использует Apache Tomcat в качестве встроенного контейнера по умолчанию.

Spring Data JPA: сохраняйте данные в хранилищах SQL с помощью Java Persistence API, используя Spring Data и Hibernate.

База данных H2. Предоставляет быструю базу данных в памяти, которая поддерживает JDBC API и доступ R2DBC, занимая небольшую площадь (2 МБ). Поддерживает встроенный и серверный режимы, а также консольное приложение на основе браузера.

Lomok: библиотека аннотаций Java, помогающая сократить шаблонный код.

Структура проекта

пом.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.4.2</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.agnasarp</groupId>
   <artifactId>agnasarp-user-microservice</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>agnasarp-user-microservice</name>
   <description>Agnasarp User Microservice</description>
   <properties>
      <java.version>1.8</java.version>
      <spring-cloud.version>2020.0.1</spring-cloud.version>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
         <groupId>com.h2database</groupId>
         <artifactId>h2</artifactId>
         <scope>runtime</scope>
      </dependency>
      <dependency>
         <groupId>org.projectlombok</groupId>
         <artifactId>lombok</artifactId>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>
   <dependencyManagement>
      <dependencies>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>
      </dependencies>
   </dependencyManagement>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
               <excludes>
                  <exclude>
                     <groupId>org.projectlombok</groupId>
                     <artifactId>lombok</artifactId>
                  </exclude>
               </excludes>
            </configuration>
         </plugin>
      </plugins>
   </build>

</project>

приложение.yml

server:
  port: 8380

Агнасарпусермикросервисаппликатион.java

package com.agnasarp.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class AgnasarpUserMicroserviceApplication {

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

    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

UserController.java

package com.agnasarp.user.controller;

import com.agnasarp.user.entity.User;
import com.agnasarp.user.service.UserService;
import com.agnasarp.user.vo.ResponseTemplateVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/users")
public class UserController {
    private static final Logger log = LoggerFactory.getLogger(UserController.class);
    @Autowired
    private UserService userService;

    @PostMapping("/")
    public User saveUser(@RequestBody User user) {
        log.info("Inside saveUser method of UserController");
        return userService.saveUser(user);
    }

    @GetMapping("/{id}")
    public ResponseTemplateVo getUserById(@PathVariable("id") Long userId) {
        log.info("Inside getUserById method of UserController");
        return userService.getUserWithDepartment(userId);
    }
}

UserService.java

package com.agnasarp.user.service;

import com.agnasarp.user.entity.User;
import com.agnasarp.user.repository.UserRepository;
import com.agnasarp.user.vo.Department;
import com.agnasarp.user.vo.ResponseTemplateVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class UserService {
    private static final Logger log = LoggerFactory.getLogger(UserService.class);
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private RestTemplate restTemplate;

    public User saveUser(User user) {
        log.info("Inside saveUser method of UserService");
        return userRepository.save(user);
    }

    public ResponseTemplateVo getUserWithDepartment(Long userId) {
        log.info("Inside getUserWithDepartment method of UserService");
        ResponseTemplateVo responseTemplateVo = new ResponseTemplateVo();
        User user = userRepository.getUserByUserId(userId);
        Department department = restTemplate.getForObject("http://localhost:8280/departments/" + userId, Department.class);
        responseTemplateVo.setUser(user);
        responseTemplateVo.setDepartment(department);
        return responseTemplateVo;
    }

}

UserRepository.java

package com.agnasarp.user.repository;

import com.agnasarp.user.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User getUserByUserId(Long userId);
}

Пользователь.java

package com.agnasarp.user.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long userId;
    private String firstName;
    private String lastName;
    private Long departmentId;
}

Просмотр объектов

Нам нужны прикрепленные сведения об отделе пользователя, поэтому мы должны создать объект представления Department здесь, в пользовательском микросервисе. И нам нужно показать информацию о пользователе и отделе вместе в ответе, для этого мы должны создать ResponseTemplateVo.

Департамент.java

package com.agnasarp.user.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Department {
    private Long departmentId;
    private String departmentName;
    private String departmentAddress;
    private String departmentCode;
}

ResponseTemplateVo.java

package com.agnasarp.user.vo;

import com.agnasarp.user.entity.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ResponseTemplateVo {
    private User user;
    private Department department;

    public void setUser(User user) {
        this.user = user;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}

Сервисный звонок

Создать пользовательский сценарий

CURL

curl --location --request POST 'http://localhost:8380/users/' \
--header 'Content-Type: application/json' \
--data-raw '{
    "firstName":"John",
    "lastName":"Smith",
    "departmentId":"1"
}'

Звонок почтальона

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

CURL

curl --location --request GET 'http://localhost:8380/users/1'

Звонок почтальона

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

Исходник с гитхаба: https://github.com/Agnasarp/agnasarp-user-microservice

Перейти к Шагу 1 — Микросервис отдела

Первоначально опубликовано на https://www.agnasarp.com 19 февраля 2021 г.