该服务非常简单,它使用 RestTemplate 调用用户微服务的 API,从而查询指定 id 的用户信息。我们通过上面的经验已经知道了如何搭建开发脚手架,此处我们省略一些重复的步骤:
* 创建一个 Maven 项目 microservice-consumer-movie
~~~bash
mvn archetype:generate -DgroupId=com.shiyanlou -DartifactId=microservice-consumer-movie -DarchetypeArtifactId=maven-archetype-quickstart
~~~
引入依赖:
~~~xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.shiyanlou</groupId>
<artifactId>microservice-consumer-movie</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>microservice-consumer-movie</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入H2数据库,一种内嵌的数据库,语法类似MySQL -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- 引入spring cloud的依赖,不能少,主要用来管理Spring Cloud生态各组件的版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
~~~
和用户服务不同的是,新增了一个`spring-boot-starter-web`依赖。
* 在`com.shiyanlou`下创建实体类`User.java`:
~~~java
package com.shiyanlou;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String username;
private String name;
private Integer age;
private BigDecimal balance;
}
~~~
* 创建启动类`App.java`:
~~~java
package com.shiyanlou;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
~~~
其中,我们注入了一个`RestTemplate`bean。
* 在`com.shiyanlou`下创建`MovieController.java`:
~~~java
package com.shiyanlou;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RequestMapping("/movies")
@RestController
public class MovieController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/users/{id}")
public User findById(@PathVariable Long id){
User user=this.restTemplate.getForObject("http://localhost:8000/users/{id}",User.class,id);
return user;
}
}
~~~
由上面代码可知,Controller 提供了一个 GET`/movies/users/{id}`接口,然后使用 RestTemplate 去调用用户微服务的`/users/{id}`接口。
* 编写配置文件`application.yml`:
~~~yaml
server:
port: 8010
spring:
application:
name: microservice-consumer-movie
logging:
level:
root: INFO
# 配置日志级别,让hibernate打印出执行的SQL参数
org.hibernate: INFO
org.hibernate.type.descriptor.sql.BasicBinder: TRACE
org.hibernate.type.descriptor.sql.BasicExtractor: TRACE
~~~
由于,之前机器上面可能运行着用户服务,占用了`8000`端口,这里配置使用`8010`端口。
* 最终目录结构如下:

* 通过 maven 构建并运行该程序:
~~~bash
mvn spring-boot:run
~~~
不出意外将会出现如下信息:
~~~
ourceHttpRequestHandler]
2019-03-12 23:27:59.387 INFO 18006 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2019-03-12 23:27:59.389 INFO 18006 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Bean with name 'dataSource' has been autodetected for JMX exposure
2019-03-12 23:27:59.399 INFO 18006 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Located MBean 'dataSource': registering with JMX server as MBean [com.zaxxer.hikari:name=dataSource,type=HikariDataSource]
2019-03-12 23:27:59.459 INFO 18006 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8010 (http) with context path ''
2019-03-12 23:27:59.470 INFO 18006 --- [ main] c.m.MicroserviceConsumerMovieApplication : Started MicroserviceConsumerMovieApplication in 6.655 seconds (JVM running for 12.139)
~~~
* 尝试访问电影微服务:
~~~bash
curl http://localhost:8010/movies/users/1
~~~
得到响应如下:
~~~json
{
"id": 1,
"username": "account1",
"name": "张三",
"age": 20,
"balance": 100.0
}
~~~
至此,我们完成了服务提供者用户微服务和服务消费者电影微服务的编写。并理解了分布式系统中消费者和提供者之间的通信方式。你学会了吗?
- 微服务开发框架 SpringCloud
- 单体应用
- 如何解决单体应用架构中存在的问题
- 如何实现微服务架构以及技术选型
- Spring Cloud 特点
- 开始使用 Spring Cloud 实战微服务
- 快速搭建开发脚手架
- 编写服务提供者-用户微服务
- 编写服务消费者【电影微服务】
- 整合 Spring Boot Actuator
- 开始整合
- 微服务注册与发现
- 编写服务发现服务
- 注册微服务至 Eureka Server
- 更新服务提供者 (用户微服务)
- 更新服务消费者 (电影微服务)
- 查看注册结果
- Ribbon 客户端负载均衡
- Ribbon 简介
- 引入 Ribbon
- Ribbon 入门
- Feign 声明式 REST 调用
- 改造项目
- Hystrix 容错处理
- 实现容错的手段
- Hystrix 简介
- 开始使用
- 测试
- Zuul 网关
- 网关是什么
- Spring Cloud Zuul 介绍
- Zuul 入门使用
- 网关测试
- Spring Cloud Config 配置管理
- 配置中心的作用
- Spring Cloud Config 简介
- Spring Cloud Config 使用
- Sleuth 与 Zipkin 结合图形化展示
- 分布式追踪相关基础概念
- Spring Cloud Sleuth 介绍及使用
- Zipin 简介
- Docker 入门
- 云原生概念
- Docker 容器介绍
- Docker 常用命令
- 微服务运行在 Docker 之上
- Dockerfile 及其常见指令介绍
- 改造 Eureka Server 微服务
- Docker Compose 编排微服务
- 安装 Compose
- Compose 快速入门
- Compose 编排 SpringCloud微服务
- 将 Eureka 等微服务运行在 Docker 容器中
- Docker-Compose 编排文件的编写
- 通过 Docker Compose 启动、停止
- Compose编排Spring Cloud微服务2
- Docker-Compose 来部署一个双节点的 Eureka 集群
