一、前言
上篇博客中讲解了Spring Cloud微服务注册,本篇博客讲解使用RestTemplate对象实现服务的消费。
二、开发工具及相关版本号
开发工具 | 版本号 |
---|---|
idea | 2018.2.4 |
spring boot | 2.1.3 |
spring cloud | Greenwich.RELEASE |
java | 1.8 |
三、准备工作
按照上篇博客的流程,在新建一个微服务命名为micro-provider作为服务生产者。由生产者提供服务,消费者micro-consumer消费生产者提供的服务。
代码如下
- pom.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.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
- application.yml配置文件
spring:
application:
name: micro-provider
server:
port: 8112
eureka:
client:
serviceUrl:
defaultZone: http://admin:admin@localhost:8080/eureka/
- 启动类代码
package com.example.provider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
- 新建HelloController提供Rest接口服务
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/provider")
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "Hello, I'm provider";
}
}
四、服务消费
首先改造上篇博客中的micro-consumer服务,添加RestTemplate对象。
- 在启动类中配置RestTemplate对象,添加@LoadBalanced注解。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableEurekaClient
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 新建一个ConsumerController作为消费者,调用生产者的HelloController。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hello")
public String hello(){
//服务提供者的访问地址
//注意! 此处使用服务名代替了ip:port
String providerUrl = "http://micro-provider/hello";
String result = restTemplate.getForObject(providerUrl, String.class);
return result;
}
}
- 启动注册中心、服务消费者、服务生产者,访问注册中心。
如下图,可以看到两个服务均已注册到注册中心
- 访问消费者的hello接口
如下图,可以看到实际上返回的是生产者的数据。
五、注意
- 在配置RestTemplate Bean时一定记得加上@LoadBalanced注解,该注解会将服务名转换成ip:port的形式后在发送请求,并且在启动多个实例的时候会进行自动的负载均衡
- 在使用RestTemplate对象发送请求时,要使用微服务的服务名去请求接口,而不是ip:port的形式。
六、 小节
服务的消费就是这么简单,此时使用RestTemplate对象的方式去调用其他服务,其实使用这种方式并不是很方便,在请求的时候如果需要携带各种形式的参数则更麻烦了,实际上微服务的调用有更好的方式,在之后的博客中会陆续讲到。
博客中所有的代码都以上传到我的github上了,地址:俞兆鹏的github