基于Eureka搭建Springcloud微服务-3.使用Eureka作为注册中心
原创2020年5月4日大约 7 分钟约 2174 字
3.使用Eureka作为注册中心
3.1.章节内容概述
本章节涉及主要内容有:
3.1.章节内容概述
3.2.章节内容大纲
3.3.Eureka注册中心简介
3.4.搭建单节点版EUREKA注册中心
3.5.搭建集群(高可用)版EUREKA注册中心
具体每个小节中包含的内容可使通过下面的章节内容大纲进行查看。
3.2.章节内容大纲
3.3.Eureka注册中心简介
Eureka是Netflix公司开发的服务发现框架,Spring Cloud对它提供了支持,将它集成在了自己spring-cloud-netflix子项目中,用来实现Spring Cloud的服务发现功能,核心功能是为实现服务发现提供了基础支持。本次将搭建一个单节点版的Eureka注册中心和一个集群(高可用)版的Eureka注册中心,用来实现服务发现功能。
https://github.com/Netflix/eureka
https://spring.io/projects/spring-cloud-netflix
EUREKA架构图
Eureka的基础组件
服务提供者(Service Provide): 服务提供端将自身服务注册到Eureka,从而使服务消费端能够找到
服务消费者(Service Consumer): 服务消费端从Eureka获取注册服务列表,从而能够消费服务
服务中介(Eureka Server): 是服务提供者和服务消费者之间的桥梁,服务提供者可以把自己注册到服务中介那里,而服务消费者如需要消费一些服务(使用一些功能)就可以在服务中介中寻找注册在服务中介的服务提供者。
Eureka的提供了哪些功能?
服务注册(Service Register)
当Eureka客户端向Eureka Server注册时,它提供自身的元数据,比如IP地址、端口,运行状况指示符URL等
服务续约(Service Renew)
Eureka客户会每隔30秒(默认情况下)发送一次心跳来续约。通过续约来告知 Eureka Server该Eureka客户仍然存在,没有出现问题。正常情况下,如果 Eureka Server在90秒没有收到Eureka客户的续约,它会将实例从其注册表中删除
获取注册列表信息(Service Fetch Registries)
Eureka 客户端从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信息查找其他服务,从而进行远程调用。该注册列表信息定期(每30 秒钟)更新一次。每次返回注册列表信息可能与Eureka客户端的缓存信息不同,Eureka客户端自动处理。如果由于某种原因导致注册列表信息不能及时匹配,Eureka 客户端则会重新获取整个注册表信息。Eureka 服务器缓存注册列表信息,整个注册表以及每个应用程序的信息进行了压缩,压缩内容和没有压缩的内容完全相同。Eureka客户端和Eureka服务器可以使用JSON/XML格式进行通讯。在默认的情况下 Eureka客户端使用压缩JSON 格式来获取注册列表的信息。
服务下线(Service Cancel)
Eureka 客户端在程序关闭时向 Eureka 服务器发送取消请求。发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:DiscoveryManager.getInstance().shutdownComponent();
服务剔除(Service Eviction)
在默认的情况下,当Eureka客户端连续90秒(3个续约周期)没有向Eureka服务器发送服务续约,即心跳,Eureka 服务器会将该服务实例从服务注册列表删除,即服务剔除。
3.4.搭建单节点版EUREKA注册中心
3.4.1.章节内容简介
搭建一个单节点版的Eureka注册中心
3.4.2.模块简介
单节点版Eureka注册中心,启动端口: 7001
3.4.3.模块目录结构
springcloud-register-center-single-node7001
|-- src
| •-- main
| |-- java
| | •-- org
| | •-- openatom
| | •-- springcloud
| | •-- RegisterCcenterSingleNode7001.java
| •-- resources
| •-- application.yml
•-- pom.xml
3.4.4.创建模块
在父工程(springcloud-eureka)中创建一个名为springcloud-register-center-single-node7001的maven模块,注意:当前模块创建成功后,在父工程pom.xml中<modules></modules>中会自动生成有关当前模块的信息
3.4.5.编写模块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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-eureka</artifactId>
<groupId>org.openatom</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-register-center-single-node7001</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入公共的工程-->
<dependency>
<groupId>org.openatom</groupId>
<artifactId>springcloud-api-commons</artifactId>
</dependency>
</dependencies>
<!--热部署需要加这个-->
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
<!--打包多环境-->
<resources>
<resource>
<directory>src/main/resources/</directory>
<includes>
<!--不区分环境:直接加载application.yml配置文件-->
<include>application.yml</include>
</includes>
</resource>
</resources>
</build>
</project>
3.4.6.编写模块application.yml
server:
port: 7001 #访问端口
spring:
application:
name: SPRINGCLOUD-REGISTER-CENTER-SINGLE-NODE7001 #注意:服务名不要出现_
devtools: #热部署开关
restart:
enabled: true
eureka:
instance:
hostname: localhost
client:
register-with-eureka: true #不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,我的职责就是维护实例,不需要去检索服务
service-url:
defaultZone: http://localhost:7001/eureka
server:
enable-self-preservation: true #是否开启自我保护,true:服务失效不直接剔除,false:服务失效直接剔除
eviction-interval-timer-in-ms: 2000 #默认发送心跳的时间间隔,单位为ms
3.4.7.编写模块主启动类
package org.openatom.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class RegisterCcenterSingleNode7001 {
public static void main(String[] args) {
SpringApplication.run(RegisterCcenterSingleNode7001.class,args);
}
}
3.4.8.测试模块
在浏览器中访问
http://localhost:7001/
看到如下界面代表搭建成功
3.5.搭建集群(高可用)版EUREKA注册中心
3.5.1.章节内容简介
本章节会展示如何搭建一个集群(高可用)版的Eureka注册中心,共有三个节点,Eureka注册中心集群的原理是多个Eureka Server之间相互注册,从而组成一个集群。
3.5.2.搭建Eureka集群中第一个节点
模块简介
集群(高可用)版Eureka注册中心中第一个节点,启动端口: 7002
模块目录结构
springcloud-register-center-cluster-node7002
|-- src
| •-- main
| |-- java
| | •-- org
| | •-- openatom
| | •-- springcloud
| | •-- RegisterCcenterClusterNode7002.java
| •-- resources
| •-- application.yml
•-- pom.xml
创建模块
在父工程(springcloud-eureka)中创建一个名为springcloud-register-center-cluster-node7002的maven模块,注意:当前模块创建成功后,在父工程pom.xml中<modules></modules>中会自动生成有关当前模块的信息
编写模块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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-eureka</artifactId>
<groupId>org.openatom</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-register-center-cluster-node7002</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入公共的工程-->
<dependency>
<groupId>org.openatom</groupId>
<artifactId>springcloud-api-commons</artifactId>
</dependency>
</dependencies>
<!--热部署需要加这个-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
<!--打包多环境-->
<resources>
<resource>
<directory>src/main/resources/</directory>
<includes>
<!--不区分环境:直接加载application.yml配置文件-->
<include>application.yml</include>
</includes>
</resource>
</resources>
</build>
</project>
编写模块application.yml
server:
port: 7002 #访问端口
spring:
application:
name: SPRINGCLOUD-REGISTER-CENTER-CLUSTER-NODE7002 #注意:服务名不要出现_
devtools: #热部署工具
restart:
enabled: true
eureka:
instance:
hostname: eureka7002
client:
register-with-eureka: false #不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,我的职责就是维护实例,不需要去检索服务
service-url: #把当前eureka7003注册到其他两个注册中心eureka7002、eureka7004中
defaultZone: http://eureka7003:7003/eureka,http://eureka7004:7004/eureka
server:
enable-self-preservation: false #是否开启自我保护,true:服务失效不直接剔除,false:服务失效直接剔除
eviction-interval-timer-in-ms: 2000 #默认发送心跳的时间间隔,单位为ms
编写模块主启动类
package org.openatom.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class RegisterCcenterClusterNode7002 {
public static void main(String[] args) {
SpringApplication.run(RegisterCcenterClusterNode7002.class,args);
}
}
3.5.3.搭建Eureka集群中第二个节点
模块简介
集群(高可用)版Eureka注册中心中第二个节点,启动端口: 7003
模块目录结构
springcloud-register-center-cluster-node7003
|-- src
| •-- main
| |-- java
| | •-- org
| | •-- openatom
| | •-- springcloud
| | •-- RegisterCcenterClusterNode7003.java
| •-- resources
| •-- application.yml
•-- pom.xml
创建模块
在父工程(springcloud-eureka)中创建一个名为springcloud-register-center-cluster-node7003的maven模块,注意:当前模块创建成功后,在父工程pom.xml中<modules></modules>中会自动生成有关当前模块的信息
编写模块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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-eureka</artifactId>
<groupId>org.openatom</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-register-center-cluster-node7003</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入公共的工程-->
<dependency>
<groupId>org.openatom</groupId>
<artifactId>springcloud-api-commons</artifactId>
</dependency>
</dependencies>
<!--热部署需要加这个-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
<!--打包多环境-->
<resources>
<resource>
<directory>src/main/resources/</directory>
<includes>
<!--不区分环境:直接加载application.yml配置文件-->
<include>application.yml</include>
</includes>
</resource>
</resources>
</build>
</project>
编写模块application.yml
server:
port: 7003 #访问端口
spring:
application:
name: SPRINGCLOUD-REGISTER-CENTER-CLUSTER-NODE7003 #注意:服务名不要出现_
devtools: #热部署工具
restart:
enabled: true
eureka:
instance:
hostname: eureka7003
client:
register-with-eureka: false #不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,我的职责就是维护实例,不需要去检索服务
service-url: #把当前eureka7003注册到其他两个注册中心eureka7002、eureka7004中
defaultZone: http://eureka7002:7002/eureka,http://eureka7004:7004/eureka
server:
enable-self-preservation: false #是否开启自我保护,true:服务失效不直接剔除,false:服务失效直接剔除
eviction-interval-timer-in-ms: 2000 #默认发送心跳的时间间隔,单位为ms
编写模块主启动类
package org.openatom.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class RegisterCcenterClusterNode7003 {
public static void main(String[] args) {
SpringApplication.run(RegisterCcenterClusterNode7003.class,args);
}
}
3.5.4.搭建Eureka集群中第三个节点
模块简介
集群(高可用)版Eureka注册中心中第三个节点,启动端口: 7004
模块目录结构
springcloud-register-center-cluster-node7004
|-- src
| •-- main
| |-- java
| | •-- org
| | •-- openatom
| | •-- springcloud
| | •-- RegisterCcenterClusterNode7004.java
| •-- resources
| •-- application.yml
•-- pom.xml
创建模块
在父工程(springcloud-eureka)中创建一个名为springcloud-register-center-cluster-node7004的maven模块,注意:当前模块创建成功后,在父工程pom.xml中<modules></modules>中会自动生成有关当前模块的信息
编写模块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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-eureka</artifactId>
<groupId>org.openatom</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-register-center-cluster-node7004</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--引入公共的工程-->
<dependency>
<groupId>org.openatom</groupId>
<artifactId>springcloud-api-commons</artifactId>
</dependency>
</dependencies>
<!--热部署需要加这个-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
<!--打包多环境-->
<resources>
<resource>
<directory>src/main/resources/</directory>
<includes>
<!--不区分环境:直接加载application.yml配置文件-->
<include>application.yml</include>
</includes>
</resource>
</resources>
</build>
</project>
编写模块application.yml
server:
port: 7004 #访问端口
spring:
application:
name: SPRINGCLOUD-REGISTER-CENTER-CLUSTER-NODE7004 #注意:服务名不要出现_
devtools: #热部署工具
restart:
enabled: true
eureka:
instance:
hostname: eureka7004
client:
register-with-eureka: false #不向注册中心注册自己
fetch-registry: false #表示自己就是注册中心,我的职责就是维护实例,不需要去检索服务
service-url: #把当前eureka7004注册到其他两个注册中心eureka7002、eureka7003中
defaultZone: http://eureka7002:7002/eureka,http://eureka7003:7003/eureka
server:
enable-self-preservation: false #是否开启自我保护,true:服务失效不直接剔除,false:服务失效直接剔除
eviction-interval-timer-in-ms: 10000 #默认发送心跳的时间间隔,单位为ms
编写模块主启动类
package org.openatom.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class RegisterCcenterClusterNode7004 {
public static void main(String[] args) {
SpringApplication.run(RegisterCcenterClusterNode7004.class,args);
}
}
3.5.5.配置host
修改host文件,C:\Windows\System32\drivers\etc\host
添加如下内容:
127.0.0.1 eureka7002
127.0.0.1 eureka7003
127.0.0.1 eureka7004
3.5.6.测试集群模块
测试集群中的第一个节点(7002),浏览器访问
http://eureka7002:7002/
测试集群中的第二个节点(7003),浏览器访问
http://eureka7003:7003/
测试集群中的第三个节点(7004),浏览器访问
http://eureka7004:7004/
可以看到,在每个节点和都和其他两个节点相互注册,这代表集群搭建成功
评论