NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
该服务非常简单,它使用 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`端口。 * 最终目录结构如下: ![](https://img.kancloud.cn/eb/2c/eb2c725de8400dfbb730535caa0dabcf_352x288.png) * 通过 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 } ~~~ 至此,我们完成了服务提供者用户微服务和服务消费者电影微服务的编写。并理解了分布式系统中消费者和提供者之间的通信方式。你学会了吗?