Spring Boot微服务,Docker和Kubernetes研讨会–第2部分

在上一篇文章中,我们使用SpringBoot和Docker创建了第一个微服务“ ProductService”。 在这一部分中,我们将详细介绍如何使用Spring Cloud,netflix库,API网关来管理多个微服务。

假设对于我们的订单管理系统,最小关系可能是这样的:

Kubernetes研讨会

因此,让我们以构建“ 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文件中添加该依赖项:

implementation('org.springframework.cloud:spring-cloud-starter-openfeign')
dependencyManagement {imports {mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"}
}

现在,我们已经添加了依赖项,我们将使用@FeignClient为此服务创建一个名为“ ProductServiceProxy”的代理接口:

@FeignClient(name = "product-service", url = "localhost:8001")
public interface ProductServiceProxy {@GetMapping("/products/{id}")Product getProduct(@PathVariable("id") Long id);
}

我们已经在界面中添加了注释@FeignClient,并配置了产品服务的名称和URL。
我们还需要通过在主类中添加另一个注释来为我们的应用程序启用Feign客户端:

@SpringBootApplication
@EnableFeignClients
public class OrderServiceApplication {
......

最后,我们需要调用在本地主机端口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,请求如下:

{
"customerId" : "123",
"externalReference" : "1234567",
"items" : [{"productId" : 1,"quantity" : 2
}]
}

这将创建一个新订单,而不是在响应中查找订单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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/345095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【渝粤题库】陕西师范大学200301几何学作业(高起本)

《几何学》作业 一。填空题 1&#xff0e;若|||-|&#xff0c;则矢量&#xff0c;应满足的条件为&#xff08; &#xff09;&#xff1b; 2&#xff0e;两矢量&#xff0c;夹角为&#xff0c;则cos( )&#xff1b; 3&#xff0e;平面的法式化方程为&#xff08; &#xff09;&a…

java封装拦截请求_Retrofit,OkHttp拦截器,RxJava封装请求网络

Retrofit和Okhttp和RxJava的封装导入依赖compile io.reactivex.rxjava2:rxandroid:2.0.1compile io.reactivex.rxjava2:rxjava:2.1.7compile com.squareup.retrofit2:retrofit:2.0.0-beta4compile com.squareup.retrofit2:converter-gson:2.0.0-beta4compile com.squareup.retr…

【渝粤题库】陕西师范大学200671 电子技术基础

《电子技术基础》作业 一&#xff0e;电路如图所示&#xff1a; 请计算该电路的静态工作点Q&#xff1b; 请画出该电路的微变等效电路图&#xff1b; 请计算该电路的输入电阻Ri;输出电阻Ro; 二&#xff0e;电路如图所示&#xff0c;试判断&#xff1a; 1.该电路的反馈类型&…

【渝粤题库】陕西师范大学202051公共财政学作业(高起专)

《公共财政学》作业 一、填空题&#xff1a; &#xff11;&#xff0e;财政的基本职能是____________职能&#xff0c;职能&#xff0c;___________职能。 &#xff12;&#xff0e;按财政收入形式分类&#xff0c;是财政收入的主要来源。 &#xff13;&#xff0e;我国现行个人…

java空类型方法无参_类的无参方法

一.JavaDoc注释语法&#xff1a;/***author Flc*/author 标明开发该类模块的作者version 标明该类模块的版本see 参考转向&#xff0c;也就是相关主题param 对方法中某参数的说明return 对方法返回值的说明exception 对方法可能抛出的异常进行说明author 作者名version 版本号其…

jboss5.1安全性配置_使用Java EE安全性和JBoss AS 7.x保护JSF应用程序的安全

jboss5.1安全性配置企业应用程序的一个常见要求是在登录页面后面保护所有JSF页面。 有时&#xff0c;您甚至希望在应用程序内部具有保护区&#xff0c;只有拥有特定角色的用户才能访问这些保护区。 Java EE标准附带了实现受某些安全性约束保护的Web应用程序所需的所有方法。 在…

java comparator相等_详解Java中Comparable和Comparator接口的区别

详解Java中Comparable和Comparator接口的区别发布于 2020-7-20|复制链接摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一下Java中Comparable和Comparator接口的区别&#xff0c;两者都有比较的功能&#xff0c;那么究竟有什么区别呢&#xff0c;感兴趣的J…

Java 11:运行单文件程序和“ shebang”脚本

在Java 11中&#xff0c;对java启动器进行了增强&#xff0c;使其可以直接运行单文件源代码程序&#xff0c;而不必先对其进行编译。 例如&#xff0c;考虑以下仅添加其参数的类&#xff1a; import java.util.*; public class Add {public static void main(String[] args) …

update core.php 更新_PHP: 更新日志 - Manual

8.0.0The format character p has been added.Prior to this version, false was returned on failure.Prior to this version, false was returned on failure.These functions no longer return false on failure.callback 回调现在可以为空(nullable)。scale is now nullabl…

分布式事务 camel_使用Camel在Amazon上构建分布式工作流应用程序

分布式事务 camel带有SNS-SQS的管道 工作流由以动态条件确定的特定顺序执行的独立任务组成。 工作流通常代表业务流程&#xff0c;例如电子商务商店中的订单处理步骤。 Amazon Web Services提供了用于构建分布式和可伸缩工作流应用程序的各种工具。 构建此类应用程序的一种方法…

php登陆框_PHP 登录完成跳转上一访问页面

需求描述&#xff1a;访问网站页面时&#xff0c;有的页面需要授权才能访问&#xff0c;这时候就会要求用户登录&#xff0c;跳转到登录页面login.php&#xff0c;怎么实现登录后返回到刚才访问的页面。解决思路1&#xff1a;在跳转到登录页面之前要将当前访问页面的url保存到c…

比较Java REST文档框架

确定在记录REST API时选择哪种Java框架可能很麻烦。 在本博文中&#xff0c;我们将简要比较我们自己使用的REST Web服务的三种文档框架&#xff0c;以及它们如何与Spring框架&#xff08;这是Foreach最常使用的Java框架&#xff09;集成。 这些是RESTful API建模语言&#xff0…

php 获取文件最后几行,php获取文件的最后N行数据

本篇文章介绍的内容是php获取文件的最后N行数据&#xff0c;现在分享给大家&#xff0c;也可以给有需要的朋友一个参考GitHub源码代码是基于以下问题&#xff0c;给出的解决方案&#xff1a;用php写一个函数&#xff0c;获取一个文本文件最后$n行内容&#xff0c;要求尽可能效率…

jaVa游戏三国志英杰传,《三国志英杰传》到底是怎样的一款游戏

原标题&#xff1a;《三国志英杰传》到底是怎样的一款游戏介绍作为PC平台上经典的战棋策略类游戏&#xff0c;英杰传系列可谓把这一类型游戏在战略性和资源获取上的精髓发挥的淋漓尽致。系列初代的《三国志英杰传》诞生在1995年的DOS系统上&#xff0c;虽然我接触英杰传时已经是…

jvm 内存镜像_镜像镜像–使用反射在运行时查看JVM内部

jvm 内存镜像开发人员&#xff1a;Takipi会告诉您何时新代码在生产中中断– 了解更多 我们都习惯于在我们的日常工作中直接或通过利用反射的框架来运用反射。 它是Java和Scala编程的主要方面&#xff0c;它使我们使用的库可以与我们的代码进行交互&#xff0c;而无需对其进行硬…

【渝粤题库】广东开放大学 微信平台开发与应用 形成性考核 (2)

选择题 题目&#xff1a; 以下哪些功能是属于微信的&#xff1f; 题目&#xff1a; 认证过的订阅号的底部是否可以直接链接到外部链接&#xff1f; 题目&#xff1a; 下面哪些属于页面前端开发技术&#xff1f; 题目&#xff1a; 那种情况下的公众号可以申请微信支付&#xff1…

php微信小程序获取用户信息,微信小程序获取openid及用户信息的方法

本文主要介绍微信小程序如何获取openid及用户信息&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下&#xff0c;希望能帮助到大家。1. 获取openid1.1 获取code调用接口获取登录凭证(code)进而换取用户登录态信息&#xff0c;包括用户的唯一标识(openid…

【渝粤题库】广东开放大学 服务标准化 形成性考核

​&#x1f449;关注我,看答案&#x1f448; 选择题 题目&#xff1a;以下关于本课程终考的描述正确的是&#xff1f; 题目&#xff1a;以下哪种方式能判断已发布的形考是否都做了&#xff1f; 题目&#xff1a;作为专业方向课&#xff0c;本课程最后的总成绩应该达到多少才不影…

谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!

有没有想过圣诞老人如何为世界各地的孩子们送上节日礼物&#xff1f; 有20亿个孩子&#xff0c;每个孩子都有自己的愿望清单&#xff0c;他会在24小时内完成。 这意味着每个孩子平均需要43微秒&#xff0c;他需要检查每个孩子是否顽皮或好。 您无需再怀疑了。 我会透露这个秘密…

php时间格式函数,PHP函数之日期时间函数date()使用详解_php基础_脚本

$ttime();echo date("Y-m-d H:i:s",$t);第一个参数的格式分别表示:a - "am" 或是 "pm"A - "AM" 或是 "PM"d - 几日&#xff0c;二位数字&#xff0c;若不足二位则前面补零; 如: "01" 至 "31"D - 星期几…