经过上一章的实践微服务基础框架搭建详解(二)—— 高可用服务注册中心,我们已经成功搭建微服务框架中的核心组件——服务注册中心(包括单节点模式和高可用模式)。本章我们来尝试构建一个服务消费者,它的主要功能就是发现及消费服务,其中发现服务由Eureka客户端完成,而消费服务则由Ribbon完成。
Ribbon是一个基于HTTP和TCP的客服端负载均衡器,它可以通过客户端中配置的ribbonServerList服务端实例列表去轮询访问以达到均衡负载的作用,它的主要工作是在Eureka服务发现的基础上,实现一套对服务实例的选择策略,从而实现对服务的消费。
下面我们来构建一个简单的例子,了解在Eureka的服务治理体系下如何实现服务的发现与消费(客户端的负载于均衡):
(1)启动上一章所编写的高可用服务端,即修改application.properties文件的spring.profiles.active属性分别为peer1和peer2,并且启动,正常时访问http://localhost:1111/时,会出现下图结果:
(2)启动上一章所编写的服务提供端,主要是修改application.properties文件server.port属性的值,分别设置为2001和2002端口值,启动项目,避免项目冲突。然后刷新http://localhost:1111/时,会出现下图结果:
(3)新建一个项目来实现服务消费者,取名为eureka-consumer-01。
①修改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 https://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.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gdput</groupId>
<artifactId>eureka-consumer-01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-consumer-01</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</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<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>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>
注:此处的SpringBoot版本和Eureka版本刚好是对应的,如果需要修改,请对照本系列第一章的连接进行版本修改。
②在EurekaConsumer01Application.java中添加@EnableEurekaClient注解。同时,在该主类中创建RestTemplate的Spring Bean的实例,并且通过@LoadBalanced注解开启客户端负载均衡。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
添加在如下图的位置:
③创建一个消费者类ConsumerController。在该类中通过主应用类中创建的RestTemplate来实现对eureka-client服务提供的/hello接口进行调用,代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/ribbon-consumer",method = RequestMethod.GET)
public String helloConsumer() {
return restTemplate.getForEntity("http://eureka-client/hello", String.class).getBody();
}
}
从上面可以看到,此处访问的服务名为eureka-client,而不是一个具体的地址,在服务治理框架中,这是一个非常重要的特性。
④修改eureka-consumer-01的properties文件。具体配置信息如下:
#可以自定义,但是一定要避免端口值冲突
server.port=9000
spring.application.name=eureka-consumer-01
#指定eureka客户端注册中心地址
eureka.client.service-url.defaultZone=http://peer2:1112/eureka/,http://peer1:1111/eureka/
注:在配置eureka.client.service-url.defaultZone属性时,需要与eureka-client的配置信息一致,不然发现不了该服务。
⑤启动eureka-consumer-01项目。我们可以在面板上看到现在所实现的eureka-consumer-01服务,如下图所示:
⑥接着我们可以访问http://localhost:9000/ribbon-consumer这个地址,页面会打印出“Hello World!”,如下所示:
然后我们切换到eureka-consumer-01控制台,可以看到下图所示信息,这些信息是客户端维护的eureka-client的服务列表情况,其中包括了各个实例的位置,对各个实例的请求总数量,第一次连接信息,上一次连接信息,总的请求失败数量等。
同时,我们重复刷新http://localhost:9000/ribbon-consumer,可以在eureka-client中看到两个客户端的控制台交替输入/hello的打印信息,因此可以判断当前的eureka-consumer-01对eureka-client的调用是否是负载均衡的。
最后,我们可以尝试关闭其中一个服务端peer2,来测试第二章编写的高可用服务注册中心是否有效,如下图所示,peer2的服务已经关闭:
此时我们再来访问http://localhost:9000/ribbon-consumer,发现还是可以访问,这意味着两个服务端的其中一个如果关闭,还可以继续使用另外一个服务端,从而达到高可用性的功能。
该文章为笔者参考《SpringCloud微服务实战》来实现的,如有什么问题可在评论区下留言,欢迎大家批评指正,谢谢。