微服务基础框架搭建详解(三)—— 服务的发现与消费(客户端消费者的实现)

       经过上一章的实践微服务基础框架搭建详解(二)—— 高可用服务注册中心,我们已经成功搭建微服务框架中的核心组件——服务注册中心(包括单节点模式和高可用模式)。本章我们来尝试构建一个服务消费者,它的主要功能就是发现及消费服务,其中发现服务由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微服务实战》来实现的,如有什么问题可在评论区下留言,欢迎大家批评指正,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值