基于Eureka搭建Springcloud微服务-3.使用Eureka作为注册中心

lingwh原创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注册中心,用来实现服务发现功能。

官方网站(GITHUB)

https://github.com/Netflix/eureka

官方网站(SPRING.IO)

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/
可以看到,在每个节点和都和其他两个节点相互注册,这代表集群搭建成功
上次编辑于: 2022/9/6 00:07:50
贡献者: lingwh
评论