步骤
新建父项目
首先,创建一个SpringBoot项目,该项目只用来做聚合,不用打包成一个Jar包,因此在pom.xml中添加:
<packaging>pom</packaging>
建立两个子项目
然后,在该父项目下新建子Module,Order和Stock,建立Maven项目即可,因为子项目可以继承父项目的pom配置。因此不必建立Springboot项目了。
在Order和Stock的pom.xml中添加依赖, 为了便于测试两个子模块间的互相调用:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
然后,在两个子Module下分别新建两个Controller:
在order下新建OrderController:
package com.lang.order.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/order")
public class OrderController {
@RequestMapping("/add")
public String add() {
System.out.println("下单成功");
return "Hello World";
}
}
给Order配置端口 , 在resources下新建application.yml并配置:
server:
port: 8010
同样的,在stock这个Module下做类似的操作:
新建Controller:
package com.lang.stock.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/stock")
public class StockController {
@RequestMapping("/reduce")
public String reduce() {
System.out.println("减少库存");
return "扣减库存";
}
}
配置端口:
server:
port: 8011
新建启动类
在order下新建OrderApplication:
package com.lang.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
RestTemplate restTemplate = builder.build();
return restTemplate;
}
}
这里注册了RestTemplate这个Bean,以便于做远程调用的使用。
修改OrderController, 去调用Stock里的接口:
@RequestMapping("/add")
public String add() {
System.out.println("下单成功");
String msg = restTemplate.getForObject("http://localhost:8011/stock/reduce", String.class);
return "Hello World" + msg;
}
然后,在stock下新建StockApplication:
package com.lang.stock;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class StockApplication {
public static void main(String[] args) {
SpringApplication.run(StockApplication.class, args);
}
}
启动两个项目并测试
- 启动两个项目
- 访问
http://localhost:8010/order/add
可以看到,order模块成功调用了stock模块里的接口。
以上架构的问题
如果采用如上的分布式架构,那么在项目中就需要维护多个不同子模块的调用地址,非常麻烦。
...
String msg = restTemplate.getForObject("http://localhost:8011/stock/reduce", String.class);
...
要想解决这个问题,就可以使用注册中心。那么就可以直接使用SpringCloudAlibaba的架构