在第一篇文章里,我们创建了Eureka服务注册中心(商场),文章地址:Spring Cloud微服务架构——Eureka注册中心
在第二篇文章里,我们创建了Eureka服务提供者(海底捞),并且已经注册到注册中心(入驻到了商场),文章地址:Spring Cloud微服务架构——Eureka服务注册
本篇文章,将介绍服务发现并消费。
服务发现与消费
举个例子,周末出门逛商场,来到商场大门口看到门前的广告牌上有海底捞的广告,正好这时候也饿了,随即就去海底捞吃饭了。这个“看到广告牌上有海底捞的广告”的动作就称为服务发现。这个“去海底捞吃饭”的动作就称为服务消费。在这里,顾客扮演了服务消费者的角色,商场扮演了注册中心的角色,海底捞扮演了服务提供者的角色。可以参考下面的图来理解此场景。
创建服务消费者
与之前的文章相同步骤快速构建Spring Boot工程。
- 创建完毕后,修改pom文件如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.jqcode</groupId>
<artifactId>eureka-consumer</artifactId>
<version>0.0.1</version>
<name>eureka-consumer</name>
<description>eureka-consumer</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- 启动类添加@EnableDiscoveryClient注解,并构建RestTemplate的Bean实例。
@EnableDiscoveryClient // 添加应用服务发现的能力
@SpringBootApplication
public class EurekaConsumerApplication {
@Bean // 构建RestTemplate Bean实例
@LoadBalanced // 开启客户端的负载均衡
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}
}
- 创建服务消费者类
@RestController
public class ConsumerController {
// 服务端列表,此处的FOOD-SERVICE为服务提供者在Eureka注册中心注册的服务名
private static final String SERVICE_URL = "http://FOOD-SERVICE/eat?customerName=小白";
@Autowired
private RestTemplate restTemplate; // 通过RestTemplate进行RPC远程调用
@RequestMapping(value = "/consume", method = RequestMethod.GET)
public String consume() {
return restTemplate.getForEntity(SERVICE_URL, String.class).getBody();
}
}
在这里,可以看到服务地址是http://FOOD-SERVICE/eat?customerName=小白,这里是通过服务名进行调用的,因为在服务注册清单中,服务名与对应服务实例元信息是绑定在一起的,我们通过服务名直接调用就行了。
再看启动类,可能有人会对@LoadBalanced注解比较好奇,此注解可以让我们通过服务名调用,如果不加此注解又通过服务名去调用会报找不到服务的错误,这样的话就只能通过ip:port的形式去调用了,这就脱离了服务注册中心的概念,相当于点对点的直接调用,没什么意义,所以大家还是把这个注解加上。
可以参考此篇文章对@LoadBalanced的解释:@LoadBalanced注解
- 修改application.properties配置文件
#消费者服务启动端口
server.port=9100
#消费者服务名称
spring.application.name=consumer
#Eureka注册中心服务地址
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka
- 启动项目,访问地址:http://localhost:9100/consume
至此,我们就完成了从服务注册清单中发现服务并进行服务消费!