步骤

新建父项目

首先,创建一个SpringBoot项目,该项目只用来做聚合,不用打包成一个Jar包,因此在pom.xml中添加:

  1. <packaging>pom</packaging>

建立两个子项目

然后,在该父项目下新建子Module,Order和Stock,建立Maven项目即可,因为子项目可以继承父项目的pom配置。因此不必建立Springboot项目了。

在Order和Stock的pom.xml中添加依赖, 为了便于测试两个子模块间的互相调用:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. </dependency>
  6. </dependencies>

然后,在两个子Module下分别新建两个Controller:
在order下新建OrderController:

  1. package com.lang.order.controller;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. @RequestMapping("/order")
  6. public class OrderController {
  7. @RequestMapping("/add")
  8. public String add() {
  9. System.out.println("下单成功");
  10. return "Hello World";
  11. }
  12. }

给Order配置端口 , 在resources下新建application.yml并配置:

  1. server:
  2. port: 8010

同样的,在stock这个Module下做类似的操作:
新建Controller:

  1. package com.lang.stock.controller;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. @RequestMapping("/stock")
  6. public class StockController {
  7. @RequestMapping("/reduce")
  8. public String reduce() {
  9. System.out.println("减少库存");
  10. return "扣减库存";
  11. }
  12. }

配置端口:

  1. server:
  2. port: 8011

新建启动类

在order下新建OrderApplication:

  1. package com.lang.order;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.boot.web.client.RestTemplateBuilder;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.web.client.RestTemplate;
  7. @SpringBootApplication
  8. public class OrderApplication {
  9. public static void main(String[] args) {
  10. SpringApplication.run(OrderApplication.class, args);
  11. }
  12. @Bean
  13. public RestTemplate restTemplate(RestTemplateBuilder builder) {
  14. RestTemplate restTemplate = builder.build();
  15. return restTemplate;
  16. }
  17. }

这里注册了RestTemplate这个Bean,以便于做远程调用的使用。

修改OrderController, 去调用Stock里的接口:

  1. @RequestMapping("/add")
  2. public String add() {
  3. System.out.println("下单成功");
  4. String msg = restTemplate.getForObject("http://localhost:8011/stock/reduce", String.class);
  5. return "Hello World" + msg;
  6. }

然后,在stock下新建StockApplication:

  1. package com.lang.stock;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class StockApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(StockApplication.class, args);
  8. }
  9. }

启动两个项目并测试

  1. 启动两个项目
  2. 访问http://localhost:8010/order/add

image.png
可以看到,order模块成功调用了stock模块里的接口。

以上架构的问题

如果采用如上的分布式架构,那么在项目中就需要维护多个不同子模块的调用地址,非常麻烦。

  1. ...
  2. String msg = restTemplate.getForObject("http://localhost:8011/stock/reduce", String.class);
  3. ...

要想解决这个问题,就可以使用注册中心。那么就可以直接使用SpringCloudAlibaba的架构