目录
3.1 使用SpringCloud官网的IO创建Eureka Server项目
3.3、在启动类中添加注解@EnableEurekaServer
一、什么是服务注册发现
我们先来看下什么是服务注册与服务发现?
服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。
服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。
可以理解为:
//服务注册
NameServer->register(newServer);
//服务发现
NameServer->getAllServer();
二、Eureka简介
Eureka是Netflix公司开发的服务注册与发现框架,SpringCloud将Eureka集成到子项目Spring-Cloud-Netflix中实现服务注册与发现功能,
2.1 Eureka的工作原理
SpringCloud框架下的服务注与发现框架Eureka包含两个组件,分别是Eureka Server和Eureka Client
- Eureka Server:服务注册发现服务器,也称为服务注册中心,各个服务启动后,会在Eureka Server中进行注册,这样Eureka Server 的服务注册表中将会存储所有可用服务节点的信息。
- Eureka Client :也称为服务,作为一个Java客户端,用于简化与Eureka Server的交互。Eureka Client内置一个使用轮询负载算法的负载均衡器。服务启动后,Eureka Client 将会向Eureka Server发送心跳更新服务,如果Eureka Server 在多个心跳周期内(默认90秒)没有接收到某个服务的心跳,Eureka Server 就将会从服务注册表中把这些服务节点移除
为了方便我们去理解,如图例所示:
如图例所示,Eureka Client注册在Eureka Server ,Eureka Client 中的服务是通过REST方法调用的。并且Eureka Client还具有缓存功能,它能够从Eureka Server 查询到当前注册的服务信息并缓存在本地。这样即使Eureka Server宕机,Eureka Client也依然可以利用缓存中的信息调用服务。
2.2 服务消费者与服务提供者
Eureka Client存在两种角色,分别是服务消费者和服务提供者
- 服务消费者:用于获取Eureka Server注册的服务清单,并且该服务清单默认每隔30秒更新一侧。服务消费者获取到服务清单后,能够根据自己的需求决定调用哪个服务,默认采用轮询方式调用,从而实现Eureka Client的负载均衡。
- 服务提供者:Eureka Client 启动后,服务提供者会通过REST请求将自己注册在Eureka Server中,并维护一个心跳进行 服务续约,告诉Eureka Server自己还”存在,防止被Eureka Sever 将该服务从服务列表中剔除。
服务提供者和服务消费者都会将自己的信息通过REST的形式提交给Eureka Server 服务消费者注册后,还会获取一份服务注册列表,其中包含了所有向Eureka Server注册的服务信息。服务消费者就会根据服务提供者的IP地址,通过HTTP远程调用服务提供者的服务。
注:服务提供者和消费者,即一个服务既可以是提供者也可以是消费者。
三、搭建Eureka服务端
3.1 使用SpringCloud官网的IO创建Eureka Server项目
点击下方的GENERTATE,得到一个下载好的以.zip结尾的压缩包
3.2 解压,导入IDEA
创建完后的工程的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.7.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.6</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>
3.3、在启动类中添加注解@EnableEurekaServer
添加@EnableEurekaServer这句注解
3.4 修改文件后缀名,配置eureka信息
eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。将application.approperties文件修改为application.yml为文件,并添加下列信息
server:
port: 7000 #配置端口号
spring:
application:
name: eureka-server #指定用户名
eureka:
client:
fetch-registry: false #是否向eureka server注册
fetch-with-eureka: false #是否从eureka server中拉取信息
service-url:
defaultZone: http://localhost:${server.port}/eureka #可以使用${}获取yml中配置的值
instance:
hostname: localhost
3.5、Eureka server启动测试
通过启动类进行启动,项目一切正常的情况下会控制台开头显示如下信息:
此时通过打开浏览器访问htttp://localhost:7000是有界面的,显示如下:
测试成功!!!
四、搭建Eureka客户端
当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。Eureka客户端有服务消费者和服务提供者两种,因此应该创建两个
4.1 创建过程同server类似
同样的方法创建provider和consumer
注意自己使用的jdk版本,并且一定要用maven创建 ,Spring boot越低越好,但一定同Eureka server相匹配!
创建完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.7.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.6</spring-cloud.version>
</properties>
<dependencies>
<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>${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>
4.2 添加注解(同Eureka server)
向启动类中添加注解@EnableEurekaClient
4.3 修改文件后缀名,配置eureka信息
同Eureka Server修改文件后缀名,由于客户端包含消费者和提供者,所以应添加如下信息:
Eureka-consumer配置
server:
port: 7002
spring:
application:
name: eureka-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:7000/eureka
instance:
prefer-ip-address: true
hostname: localhost #???
Eureka-provider配置
server:
port: 7006
spring:
application:
name: eureka-provider
eureka:
client:
service-url:
defaultZone: http://localhost:7000/eureka
instance:
hostname: localhost
五、启动实例
上次的测试只是验证Eureka server端是否配置成功,这次是总的验证
分别启动Eureka Server ,Eureka Client(服务提供者,服务消费者)
访问http://localhost:7000,效果如下:
由图可见多了consumer和provider两个,实例启动成功!
六、搭建Eureka高可用集群
之所以进行eureka集群的搭建,在于我们平时的生产环境中,很难保证单节点的eureka服务能提供百分百不间断的服务,如果eureka无响应了,整个项目应用都会出现问题,因此要保证eureka随时都能提供服务的情况下,最好的方式就是采用eureka的集群模式,也就是搭建eureka的高可用,在eureka的集群模式下,多个eureka server之间可以同步注册服务,因此,在一个eureka宕掉的情况下,仍然可以提供服务注册和服务发现的能力,从而达到注册中心的高可用。
Eureka高可用集群图解如下:
6.1 修改hosts文件,添加主机映射
hosts文件位置:C:\Windows\System32\drivers\etc\hosts
127.0.0.1 server1
127.0.0.1 server2
6.2 Eureka Server 的高可用
参见上述eureka服务端的搭建,生成两个Eureka Server项目,将它们的项目名称分别命名为demo-server ,demo-server-another,其中application.yml文件配置如下:
demo-server:
server:
port: 7000 #配置端口号
spring:
application:
name: eureka-server #指定用户名
eureka:
client:
fetch-registry: false #是否向eureka注册
fetch-with-eureka: false
service-url:
defaultZone: http://server2:7006/eureka
instance:
hostname: server1
eureka-server-another:
server:
port: 7006 #配置端口号
spring:
application:
name: eureka-server-another #指定用户名
eureka:
client:
fetch-registry: false #是否向eureka注册
fetch-with-eureka: false
service-url:
defaultZone: http://server1:7000/eureka
instance:
hostname: server2
6.3 Eureka Client
参见上述eureka客户端的搭建,生成三个Eureka Client,将它们的项目名称分别命名为eureka-provider ,eureka-provider-another,eureka-consumer 其中application.yml文件的配置如下:
Eureka-provider
server:
port: 7002 #配置端口号
spring:
application:
name: eureka-provider #指定用户名
eureka:
client:
fetch-registry: false #是否向eureka注册
fetch-with-eureka: false
service-url:
defaultZone: http://localhost:7000/eureka
Eureka-provider-another
server:
port: 7007 #配置端口号
spring:
application:
name: eureka-provider-another #指定用户名
eureka:
client:
fetch-registry: false #是否向eureka注册
fetch-with-eureka: false
service-url:
defaultZone: http://localhost:7006/eureka
Eureka-consumer
server:
port: 7008 #配置端口号
spring:
application:
name: eureka-consumer #指定用户名
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone:
http://server1:7000/eureka,http://server2:7006/eureka
6.4 启动集群测试
依次启动Eureka Server,两个服务提供者,一个服务消费者,无论访问哪个Eureka Server注册实例都是一样,其效果如下:
测试成功 !!!