Следуя этому руководству и этому , я создаю систему, состоящую из 3 микросервисов:
- пограничный сервис: может принимать и отправлять запросы на нисходящий поток
- Основная микрослужба: куда приходят все запросы и затем обрабатываются путем выборки данных из базы данных
- Служба eureka: способна обнаруживать две другие службы.
Моя идея заключается в использовании пограничного сервиса для социальной аутентификации, но перед внедрением аутентификации я решил протестировать с помощью Postman мой пограничный сервис, чтобы узнать, может ли он подключиться к основной службе.
работает правильно, но для этого мне пришлось создать пограничную службу, которая является копией базовой службы, за исключением базы данных и интерфейса crud (моя пограничная служба имеет класс DTO).
Мой контроллер в основная служба:
@RestController
public class MainController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/")
public String welcome(){
return "Welcome to the 301 Java Microservice!";
}
@GetMapping("/employees")
public List<Employees> getAllEmployees(){
return (List<Employees>) employeeService.findAll();
}
@GetMapping("/employees/{id}")
public ResponseEntity<Optional<Employees>> getEmployeeById(@PathVariable(value = "id") Long employeeId) {
Optional<Employees> empl = employeeService.findById(employeeId);
if(!empl.isPresent()){
throw new CustomNotFound(employeeId);
}
else return ResponseEntity.ok().body(empl);
}
@PostMapping("/employees")
public Employees createEmployee(@Valid @RequestBody Employees employee) {
return employeeService.save(employee);
}
@DeleteMapping("/employees/{id}")
public Map< String, Boolean > deleteEmployee(@PathVariable(value = "id") Long employeeId) {
try{
employeeService.deleteById(employeeId);
} catch (Exception e) {
e.printStackTrace();
throw new CustomNotFound(employeeId);
}
Map < String, Boolean > response = new HashMap< >();
response.put("deleted", Boolean.TRUE);
return response;
}
}
, а в пограничной службе:
@RestController
public class MainController {
private final MainControllerInt mainControllerInt;
public MainController(MainControllerInt mainControllerInt) {
this.mainControllerInt = mainControllerInt;
}
@GetMapping("/")
public String welcome(){
return "Welcome to the 301 Java Microservice!";
}
@GetMapping("/employees")
public List<EmployeesDto> getAllEmployees(){
return (List<EmployeesDto>) mainControllerInt.findAll();
}
@GetMapping("/employees/{id}")
public ResponseEntity<Optional<EmployeesDto>> getEmployeeById(@PathVariable(value = "id") Long employeeId) {
Optional<EmployeesDto> empl = mainControllerInt.findById(employeeId);
if(!empl.isPresent()){
throw new CustomNotFound(employeeId);
}
else return ResponseEntity.ok().body(empl);
}
@PostMapping("/employees")
public EmployeesDto createEmployee(@Valid @RequestBody EmployeesDto employee) {
return mainControllerInt.save(employee);
}
@DeleteMapping("/employees/{id}")
public Map< String, Boolean > deleteEmployee(@PathVariable(value = "id") Long employeeId) {
try{
mainControllerInt.deleteById(employeeId);
} catch (Exception e) {
e.printStackTrace();
throw new CustomNotFound(employeeId);
}
Map < String, Boolean > response = new HashMap< >();
response.put("deleted", Boolean.TRUE);
return response;
}
}
Эта реализация:
@FeignClient("301javamicro")
public interface MainControllerInt {
@GetMapping("/employees")
Iterable<EmployeesDto> findAll();
@GetMapping("/employees/{id}")
Optional<EmployeesDto> findById(@PathVariable(value = "id") Long id);
@PostMapping("/employees")
EmployeesDto save(@Valid @RequestBody EmployeesDto emp);
@DeleteMapping("/employees/{id}")
void deleteById(@PathVariable(value = "id") Long id);
}
, и у меня есть DTO:
@Data
public class EmployeesDto {
private long employee_id;
private String employee_name;
private String employee_last_name;
private String employee_address;
private String employee_phone;
private String job_position;
private int salary;
private String currency;
}
Как вы видите, мой RestController точно такой же в обоих микросервисах. Я хотел бы избежать дублирования или копирования и вставки кода.
есть ли возможность создать гибкую пограничную службу, способную просто проверять пользователя и передавать запрос в соответствии с моделью: получить что угодно -> проверить пользователя - > отправить в ядро все, что и будет основным сервисом для проверки запроса и в случае плохого результата отправит обратно на край 404, 500 e cc ....?
Спасибо за помощь.