Всем привет! Как и в предыдущем посте, мы собираемся реализовать полную архитектуру микросервиса, и в качестве первого шага мы создали микросервис, который называется Служба отдела, и для сложности, с которой может справиться архитектура, нам нужно еще одна служба, в которой есть вызов службы отдела. Итак, здесь, в этом посте, мы попробуем реализовать еще один сервис под названием 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 г.