“微服务”用于描述软件体系结构设计,其中许多松散耦合的组件独立运行,但最终作为单个应用程序一起工作。服务通常关注于业务领域或业务实体的特定方面,它们通常使用网络进行通信。
这篇文章是一篇实践性的介绍性指南,介绍如何使用springboot和Netflix开发的软件来构建微服务,以回答这些问题。
Spring Cloud和Netflix OSS
Netflix成为最早采用微服务的公司之一,早在“微服务”一词获得任何吸引力之前,Netflix就已经将其单一的应用程序转变为一种水平可扩展的分布式体系结构。
多年来,作为Netflix开源软件中心(Netflix OSS)项目的一部分,Netflix已经开放了许多工具(他们继续在内部使用)。其中许多工具已经被Spring团队作为Spring Cloud项目的一部分采用,SpringCloud项目提供了一些工具来帮助开发人员在构建分布式系统时使用一些常见的模式。
示例项目
让我们设想一个简单的在线商店场景,在那里客户可以下订单。我们已经可以确定一些我们需要的服务-客户服务和订单服务。我们将一步一步地把每一个都建立起来。
注意:在这个演示中,我们将坚持使用Gradle和springboot2.2.0的Java项目。如果您愿意,可以随意使用Maven或其他受支持的语言。
客户服务
我们从 start.spring.io(https://start.spring.io/) 创建我们的客户服务项目。这通常是任何新的Spring启动应用程序的最佳起点。如果你看过springdeveloper倡导者和Java冠军joshlong的演讲,我建议你去看,你就会明白为什么这是互联网上第二好的地方!
创建一个带有customer-service的项目,只指定springweb作为依赖项,然后点击Generate下载它。下载并提取后,我们将创建一个 Customer
类用作域对象:
public class Customer { private final int id; private final String name; public Customer(final int id, final String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } }
然后,我们将添加一个 CustomerController
类,该类将公开几个端点,以允许我们按ID查看所有客户和单个客户:
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import java.util.Arrays; import java.util.List; @RestController public class CustomerController { private List<Customer> customers = Arrays.asList( new Customer(1, "Joe Bloggs"), new Customer(2, "Jane Doe")); @GetMapping public List<Customer> getAllCustomers() { return customers; } @GetMapping("/{id}") public Customer getCustomerById(@PathVariable int id) { return customers.stream() .filter(customer -> customer.getId() == id) .findFirst() .orElseThrow(IllegalArgumentException::new); } }