5. maven子工程microservice-order-consumer模块搭建
接下来我们搭建 maven 子工程中的订单服务消费模块 、microservice-order-consumer
,新建子模块的方法和上面两个子 模块一模一样,在命名的时候命名为microservice-order-consumer
即可。完成之后,来看一下该模块中的 pom 文件。
<?xml version="1.0" encoding="UTF-8"?> <project ...> <parent> <artifactId>microservice</artifactId> <groupId>com.itcodai</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../microservice/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>microservice-order-consumer</artifactId> <packaging>jar</packaging> <!-- 当前Module需要用到的依赖,按自己需求添加,版本号在父类已经定义了,这里不需要再次定义 --> <dependencies> <!-- 引入自己定义的 microservice-common 通用包,可以使用common模块中的Order类 --> <dependency> <groupId>com.itcodai</groupId> <artifactId>microservice-common</artifactId> <version>${project.version}</version> </dependency> <!-- spring boot web 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> </project>
因为microservice-order-consumer
模块主要是用来调用microservice-order-provider
模块提供的订单信息,所以在microservice-order-consumer
模块中我们不需要引入 mybatis 和 mysql 相关的依赖,因为不用操作数据库。当然了,在实际项目中,根据具体需求,如果需要操作其他表,那么还是要引入持久层依赖的。
在微服务都是以 HTTP 接口的形式暴露自身服务的,因此在调用远程服务时就必须使用 HTTP 客户端。Spring Boot 中使用的是 RestTemplate,首先,我们写一个配置类,将 RestTemplate 作为一个 Bean 交给 Spring 来管理。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class RestTmplateConfig { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } }
有了 RestTemplate,接下来我们可以在 Controller 中注入该 RestTemplate 来调用 microservice-order-provider
提供的服务了,如下。
@RestController @RequestMapping("/consumer/order") public class OrderConsumerController { // 订单服务提供者模块的 url 前缀 private static final String ORDER_PROVIDER_URL_PREFIX = "http://localhost:8001"; @Resource private RestTemplate restTemplate; @GetMapping("/get/{id}") public TOrder getOrder(@PathVariable Long id) { return restTemplate.getForObject(ORDER_PROVIDER_URL_PREFIX + "/provider/order/get/" + id, TOrder.class); } @SuppressWarnings("unchecked") @GetMapping("/get/list") public List<TOrder> getAll() { return restTemplate.getForObject(ORDER_PROVIDER_URL_PREFIX + "/provider/order/get/list", List.class); } }
我们来讲解一下 RestTemplate 的使用,在 Controller 中,我们定义了一个订单服务提供者的 url 前缀,这是microservice-order-provider
的服务地址,因为我们等会要远程调用这个服务。restTemplate.getForObject
方法是 GET 请求方法,它有两个参数。
* url:请求地址。
* ResponseBean.class:HTTP 相应被转换成的对象类型。
对于实体类或者 List 均可以接收,同样地,还有处理 POST 请求的方法 restTemplate.postForObject,该方法有三个参数,如下。
* url:请求地址。
* requestMap:请求参数,封装到map中。
* ResponseBean.class:HTTP响应被转换成的对象类型。
那么整个流程即:订单消费模块不直接请求数据库,而是通过 http 远程调用订单提供模块的服务来获取订单信息。也就是说,在微服务里,每个服务只关注自身的逻辑和实现,不用管其他服务的实现,需要获取某个服务的数据时,只要调用该服务提供的接口即可获取相应的数据。实现了每个服务专注于自身的逻辑,服务之间解耦合。
我们来测试一下,启动microservice-order-provider
和microservice-order-consumer
两个服务,在浏览器中输入 localhost:8080/consumer/order/get/list,如果浏览器中能查到数据库中的两条记录,说明服务调用成功。
[{"id":1,"name":"跟武哥一起学 Spring Boot","price":39.99,"dbSource":"microservice01"},{"id":2,"name":"跟武哥一起学 Spring cloud","price":39.99,"dbSource":"microservice01"}]
到此为止,基于 maven 分布式的微服务架构就搭建好了,实际项目中可以直接拿这个来扩展。