在Spring5正式发布之后,值得一看它的当前版本。此外,我们将尝试将我们的反应式微服务放在Spring云生态系统中,该生态系统包含诸如Eureka的服务发现、Spring Cloud Commons@LoadBalanced的负载平衡以及使用Spring Cloud gateway的API gateway(也基于WebFlux和Netty)等元素。我们还将通过SpringDatareactiveMongo项目的示例来检查Spring对NoSQL数据库的响应式支持。
下图展示了示例系统的体系结构,该体系结构由两个微服务组成:discovery server、gateway和MongoDB数据库。源代码与往常一样可以在GitHub的SpringCloudWebFlux示例库中获得。
让我们描述创建上述系统的进一步步骤。
第一步. 使用SpringWebFlux构建反应式应用程序
要为项目启用库SpringWebFlux,我们应该在依赖项中包含 spring-boot-starter-webflux
。它包括一些依赖库,如Reactor或Netty服务器。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
REST控制器看起来非常类似于为同步web服务定义的控制器。唯一的区别在于返回对象的类型。我们返回的不是单个对象,而是 Mono
类的实例,我们返回的不是 list
类的实例,而是 Flux
类的实例。多亏了 SpringDataResponsiveMongo
,我们不必在存储库bean上调用所需的方法。
@RestController public class AccountController { private static final Logger LOGGER = LoggerFactory.getLogger(AccountController.class); @Autowired private AccountRepository repository; @GetMapping("/customer/{customer}") public Flux findByCustomer(@PathVariable("customer") String customerId) { LOGGER.info("findByCustomer: customerId={}", customerId); return repository.findByCustomerId(customerId); } @GetMapping public Flux findAll() { LOGGER.info("findAll"); return repository.findAll(); } @GetMapping("/{id}") public Mono findById(@PathVariable("id") String id) { LOGGER.info("findById: id={}", id); return repository.findById(id); } @PostMapping public Mono create(@RequestBody Account account) { LOGGER.info("create: {}", account); return repository.save(account); } }