在本教程中,我们将学习如何在Spring boot微服务项目中使用Spring Cloud Netflix Eureka创建Service Registry。
在微服务项目中,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();
}
让我们使用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>
我们需要添加@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);
}
}
默认情况下,每个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
Netflix Eureka Service提供用户界面,我们可以在其中查看有关注册服务的所有详细信息。
现在运行ServiceRegistryApplication
并访问http://localhost:8761,它将显示类似于下面屏幕截图的UI。
参考本教程创建部门服务和用户服务微服务: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服务器没有收到来自任何服务实例的心跳信号,它将假定服务实例已关闭并将其从池中取出。
完成此配置后,启动department-service
并访问http://localhost:8761
您应该看到department-service
已使用SERVICE ID注册为DEPARTMENT-SERVICE。您还可以注意到状态为UP(1),这意味着服务已启动并正在运行,department-service
的一个实例正在运行。
参考本教程创建部门服务和用户服务微服务: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/
型
完成此配置后,启动用户服务并访问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。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.javaguides.net/2022/10/spring-boot-microservices-spring-cloud-netflix-eureka-.html
内容来源于网络,如有侵权,请联系作者删除!