Spring Boot微服务-基于Spring Cloud Netflix Eureka的服务注册表

x33g5p2x  于2022-10-12 转载在 Spring  
字(7.4k)|赞(0)|评价(0)|浏览(364)

在本教程中,我们将学习如何在Spring boot微服务项目中使用Spring Cloud Netflix Eureka创建Service Registry。

Service Registry和Discovery概述

在微服务项目中,Service Registry和Discovery扮演着重要角色,因为我们很可能运行多个服务实例,并且我们需要一种机制来调用其他服务,而无需硬编码其主机名或端口号。除此之外,在云环境中,服务实例可能随时出现和消失。因此,我们需要一些自动服务注册和发现机制。

Spring Cloud通过提供Spring Clound Netflix Eureka项目来创建Service Registry and Discovery,从而解决了这个问题

在本教程中,我们将学习如何将SpringCloud Netflix Eureka用于Service Registry and Discovery。

我们将做什么?

我们可以使用Netflix Eureka Server创建服务注册表,并将我们的微服务(department-service和e1d1e)设置为Eureka客户端,这样一旦启动微服务,它就会使用逻辑服务ID自动向Eureka服务器注册。然后,其他微服务(也是Eureka客户机)可以使用服务ID来调用REST端点。

Spring Cloud使得使用负载平衡RestTemplate:创建Service Registry和发现其他服务变得非常容易

@Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

1.在IntelliJ IDEA中创建和设置Spring启动项目

让我们使用Netflix Eureka创建一个Service Registry,它只是一个带有Eureka Server启动器的SpringBoot应用程序。

<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>

让我们使用spring initializr创建一个Spring启动项目。
使用spring initializr创建弹簧引导应用程序时,请参阅以下屏幕截图以输入详细信息:

单击Generate按钮以zip文件的形式下载Spring引导项目。解压缩zip文件并在IntelliJIDEA中导入Spring引导项目。
这是彩球。供您参考的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.7.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>net.javaguide</groupId>
	<artifactId>service-registry</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>service-registry</name>
	<description>service-registry</description>
	<properties>
		<java.version>17</java.version>
		<spring-cloud.version>2021.0.4</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</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>

</project>

2.添加@EnableEurekaServer注解

我们需要添加@EnableEurekaServer注解,使SpringBoot应用程序成为基于Eureka服务器的Service Registry。

package net.javaguides.serviceregistry;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class ServiceRegistryApplication {

	public static void main(String[] args) {
		SpringApplication.run(ServiceRegistryApplication.class, args);
	}

}

3.禁用Eureka服务器作为Eureka客户端

默认情况下,每个Eureka服务器也是一个Eureka客户端,需要至少一个服务URL来定位对等方。由于我们将有一个Eureka服务器节点(独立模式),我们将通过在application.properties文件中配置以下属性来禁用此客户端行为。

spring.application.name=service-registry
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

4.启动Eureka服务器(演示)

Netflix Eureka Service提供用户界面,我们可以在其中查看有关注册服务的所有详细信息。
现在运行ServiceRegistryApplication并访问http://localhost:8761,它将显示类似于下面屏幕截图的UI。

5.将部门服务微服务注册为Eureka客户端

参考本教程创建部门服务和用户服务微服务:Spring Boot microservices Communication Example using RestTemplate。
让我们将此department-service作为Eureka客户端并向Eureka服务器注册。
将Eureka Discovery启动器添加到department-service

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

另外,添加Spring云依赖项:

<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>

将版本添加为属性:

<properties>
	<java.version>17</java.version>
	<spring-cloud.version>2021.0.4</spring-cloud.version>
</properties

类路径上有spring-cloud-starter-netflix-eureka-client,我们只需要在application.properties中配置eureka.client.service-url.defaultZone属性,以便自动向Eureka Server注册。

spring.application.name=DEPARTMENT-SERVICE
eureka.instance.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

当服务注册到Eureka Server时,它会在特定的时间间隔内持续发送心跳信号。如果Eureka服务器没有收到来自任何服务实例的心跳信号,它将假定服务实例已关闭并将其从池中取出。

6.运行部门服务Eureka客户端(演示)

完成此配置后,启动department-service并访问http://localhost:8761
您应该看到department-service已使用SERVICE ID注册为DEPARTMENT-SERVICE。您还可以注意到状态为UP(1),这意味着服务已启动并正在运行,department-service的一个实例正在运行。

7.将用户服务微服务注册为Eureka客户端

参考本教程创建部门服务和用户服务微服务:Spring Boot microservices Communication Example using RestTemplate。
让我们将此user-service作为Eureka客户端并向Eureka服务器注册。
将Eureka Discovery启动器添加到user-service

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

另外,添加Spring云依赖项:

<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>

将版本添加为属性:

<properties>
	<java.version>17</java.version>
	<spring-cloud.version>2021.0.4</spring-cloud.version>
</properties


类路径上有spring-cloud-starter-netflix-eureka-client,我们只需要在application.properties中配置eureka.client.service-url.defaultZone属性,以便自动向Eureka服务器注册。

spring.application.name=USER-SERVICE
eureka.instance.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

8.运行用户服务Eureka Client(Demo)

完成此配置后,启动用户服务并访问http://localhost:8761。您应该看到user-service已向SE注册

您还可以注意到状态为UP(1),这意味着服务已启动并正在运行,user-service的一个实例正在运行。

部门服务的多个实例

让我们使用以下命令在另一个端口上启动department-service的另一个实例。

java -jar -Dserver.port=8082 department-service-0.0.1-SNAPSHOT.jar


假设我们想从user-service调用department-service REST端点。我们可以使用RestTemplate来调用REST端点,但有2个实例正在运行。
我们可以使用@LoadBalanced注解将RestTemplate注册为Springbean:

@Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }


带有@LoadBalanced注解的RestTemplate将在内部使用Ribbon LoadBalancer解析ServiceID并使用一个可用服务器调用REST端点。
更改UserServiceImpl类中的URL:

ResponseEntity<DepartmentDto> responseEntity = restTemplate
                .getForEntity("http://DEPARTMENT-SERVICE/api/departments/" + user.getDepartmentId(),
                DepartmentDto.class);


有了这种自动服务注册和发现机制,我们无需担心运行了多少实例,它们的主机名和端口等是什么

结论

在本教程中,我们学习了如何在Spring启动微服务项目中使用Spring Cloud Netflix Eureka创建Service Registry。

相关文章