javascript
Spring Boot微服务,Docker和Kubernetes研讨会–第2部分
在上一篇文章中,我們使用SpringBoot和Docker創建了第一個微服務“ ProductService”。 在這一部分中,我們將詳細介紹如何使用Spring Cloud,netflix庫,API網關來管理多個微服務。
假設對于我們的訂單管理系統,最小關系可能是這樣的:
因此,讓我們以構建“ productService”的類似方式再構建兩個名為“ orderService”和“ customerService”的服務。
訂購服務
要創建訂單,我們可以傳遞customerId,以及帶有productId和數量的項目列表。 讓我們看看如何做到這一點:
@PostMapping("/orders")public Order save(@RequestBody CustomerOrderRequest request) {return orderRepository.save(Order.builder().customerId(request.getCustomerId()).externalReference(request.getExternalReference()).items(toItems(request.getItems())).build());}private List toItems(List items) {return items.stream().map(item -> Item.builder().productId(item.getProductId()).quantity(item.getQuantity()).build()).collect(Collectors.toList());}在這里,我們將customerId和帶有productIds的項目列表保存到數據庫中。
為了獲取完整的訂單明細,我們需要完整的客戶對象和產品明細。 結果看起來像這樣:
{"orderId": "1234","externalReference": "234257hf","customer": {"id": 123,"firstName": "anirudh","lastName": "bhatnagar","phone": "21323","email": "test@test.com","address": {"addressLine1": "123","addressLine2": "pwe","city": "Syd","state": "NSW","country": "Aus","postcode": 2000}},"createdDate": "2018-11-12","items": [{"product": {"id": 123,"name": "Nike Shoes","description": "Mens shoes","price": "100","sku": "1234"},"quantity": 3}],"totalOrderCost": "300.00","totalOrderTax": "30.00" }詳細的訂單響應應包含客戶,地址,產品和訂單總成本的詳細信息。 為了獲取此信息,訂購服務將需要從產品服務和客戶服務獲取詳細信息。
從Order Service中的ProductService獲取產品詳細信息
為了獲取Order Service中的產品服務詳細信息,我們需要一個正在運行的產品服務,以及一個orderController客戶端,以對ProductService進行http GET調用。 對于httpClient,我們將使用Netflix提供的OpenFeign客戶端庫,它可以作為spring-cloud starter的一部分使用,因此讓我們在build.gradle文件中添加該依賴項:
現在,我們已經添加了依賴項,我們將使用@FeignClient為此服務創建一個名為“ ProductServiceProxy”的代理接口:
@FeignClient(name = "product-service", url = "localhost:8001") public interface ProductServiceProxy {@GetMapping("/products/{id}")Product getProduct(@PathVariable("id") Long id); } 我們已經在界面中添加了注釋@FeignClient,并配置了產品服務的名稱和URL。
我們還需要通過在主類中添加另一個注釋來為我們的應用程序啟用Feign客戶端:
最后,我們需要調用在本地主機端口8001上運行的產品服務,以使用訂單中提供的產品ID獲取產品詳細信息,并填充訂單詳細信息響應對象:
@GetMapping("/orders/{id}")public CustomerOrderDetails getOrders(@PathVariable("id") Long orderId) {final Order order = orderRepository.findById(orderId).orElse(null);if (order == null) {return null;}return toCustomerOrderDetails(order);}private CustomerOrderDetails toCustomerOrderDetails(Order order) {return CustomerOrderDetails.builder().orderId(order.getId()).createdDate(order.getCreatedDate()).externalReference(order.getExternalReference()).items(toItemList(order.getItems())).build();}private List<com.anirudhbhatnagar.orderService.dto.product.Item> toItemList(List<Item> items) {return items.stream().map(item -> toItemDto(item)).collect(Collectors.toList());}private com.anirudhbhatnagar.orderService.dto.product.Item toItemDto(Item item) {return com.anirudhbhatnagar.orderService.dto.product.Item.builder().product(productServiceProxy.getProduct(item.getProductId())).build();}如果您仔細看一下上面的代碼,
productServiceProxy.getProduct(item.getProductId())您將看到,一旦獲得獲取獲取給定orderId的訂單詳細信息的請求,我們首先將獲取保存在訂單服務數據庫中的訂單數據,然后使用每個項目或訂單中提供的productId,我們將調用productService并填充orderDetails響應對象。
測試一下
一旦orderService啟動并在端口8002上運行并且productService在端口8001上運行。我們可以測試我們的應用程序:確保有一些使用產品服務創建的產品,如先前的博客所述 。
記下您在產品服務中創建的productId,并使用相同的代碼創建新訂單:使用郵遞員在http:// localhost:8002 / orders上進行POST,請求如下:
這將創建一個新訂單,而不是在響應中查找訂單ID。 現在,使用以下訂單ID獲取訂單詳細信息:在http:// localhost / 8002 / orders / {order-id}上執行GET,這將返回以下響應:
{"orderId": 12,"externalReference": "1234567","customer": null,"createdDate": null,"items": [{"product": {"id": "1","name": "Nike","description": "Shoes","price": "100","sku": "1234"},"quantity": 2}],"totalOrderCost": "200" } 因此,在這里我們看到了訂單服務如何向產品服務發出請求并填充響應對象。 但是,我們仍然將客戶視為“ null”,因此,為了填充客戶詳細信息,我們需要從客戶服務獲取。 為了設置客戶服務,我們將執行以下操作:
1.以與我們使用Spring初始化程序進行產品或訂單服務類似的方式設置客戶服務。
2.在OrderService中設置代理客戶端服務 3.從Order Controller調用CustomerService,以在Order Details響應對象內填充客戶詳細信息。 如果一切正常,我們也應該查看客戶詳細信息。
當前,我們已經在訂單服務中對服務的URL進行了硬編碼,但是理想情況下需要動態發現它們。 因此,在下一部分中,我們將為3個微服務添加“服務發現”和“負載平衡”。
整個源代碼可以在這里引用。
翻譯自: https://www.javacodegeeks.com/2018/11/spring-microservices-docker-kubernetes-2.html
總結
以上是生活随笔為你收集整理的Spring Boot微服务,Docker和Kubernetes研讨会–第2部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓审核需要多久(安卓审核)
- 下一篇: Linux nfs挂载(nfs linu