Я строю микросервисную архитектуру с помощью Spring Framework, Feign и Eureka.
- Магазин работает как API-шлюз, реализованный с помощью Zuul (без базы данных)
- Каждый микросервис имеетего собственная база данных h2.
- Служба CustomerService может вызывать сопоставления корзины с помощью Feign
Пример: У меня есть "Магазин", и я хочу создать покупателя с корзиной в одном методе вСам сервис.
Как я могу вызывать методы в ShopService, чтобы управлять другими Сервисами без связи с другими сервисами?Пожалуйста, дайте мне знать, если вам нужны примеры кода.
CustomerController.java:
@ComponentScan
@RestController
public class CustomerController {
final Customer2CartConnectorRequester customer2CartConnectorRequester;
final Customer2OrderConnectorRequester customer2OrderConnectorRequester;
@Autowired
private CustomerJpaRepository customerJpaRepository;
@Autowired
public CustomerController(Customer2CartConnectorRequester customer2CartConnectorRequester,
Customer2OrderConnectorRequester customer2OrderConnectorRequester) {
this.customer2CartConnectorRequester = customer2CartConnectorRequester;
this.customer2OrderConnectorRequester = customer2OrderConnectorRequester;
}
@GetMapping("/list")
@ResponseBody
public List<CustomerEntity> getCustomers() {
return customerJpaRepository.findAll();
}
@RequestMapping("/{customerId}")
@ResponseBody
public Optional<CustomerEntity> getCustomer(@PathVariable("customerId") int customerId) {
return customerJpaRepository.findById(customerId);
}
// Client to Server
// POST über z.B. Postman Client
@PostMapping("/customer")
public CustomerEntity addCustomer(@RequestBody CustomerEntity customerEntity) {
customerJpaRepository.save(customerEntity);
return customerEntity;
}
@DeleteMapping("customer/{customerId}")
public String deleteCustomer(@PathVariable int customerId) {
CustomerEntity a = customerJpaRepository.getOne(customerId);
customerJpaRepository.delete(a);
return "deleted";
}
@PutMapping("/customer")
public CustomerEntity updateCustomer(@RequestBody CustomerEntity customerEntity) {
customerJpaRepository.save(customerEntity);
return customerEntity;
}
/// CONNECTOR REQUESTER ///
@GetMapping("/cart")
public List<?> getCart() {
return customer2CartConnectorRequester.getCart();
}
@GetMapping("/orders")
public List<?> getOrders() {
return customer2OrderConnectorRequester.getOrders();
}
}
Обновление: Я пытался использовать POST-методотправлять данные через Postman Client следующим образом, но, похоже, все еще что-то не так:
Shop2CustomerConnectorRequester:
@FeignClient("customermicroservice")
public interface Shop2CustomerConnectorRequester {
@RequestMapping(value = "/list", method = RequestMethod.POST)
public ResponseEntity<String> createCustomer(Map<String, ?> queryMap);
}
ShopController:
@ComponentScan
@RestController
public class ShopController {
final Shop2CustomerConnectorRequester shop2CustomerConnectorRequester;
@Autowired
private ShopJpaRepository shopJpaRepository;
@Autowired
public ShopController(Shop2CustomerConnectorRequester shop2CustomerConnectorRequester) {
this.shop2CustomerConnectorRequester = shop2CustomerConnectorRequester;
}
@GetMapping("/customer")
public ResponseEntity<String> createCustomer(Map<String, ?> queryMap) {
return shop2CustomerConnectorRequester.createCustomer(queryMap);
}
}