1.Eureka基础知识

2.单机Eureka构建步骤

3.集群Eureka构建步骤

4.actuator微服务信息完善

5.Eureka自我保护

6.Eureka的停更说明

7.Eureka停更了怎么办

1.Eureka基础知识

1.1)eureka是什么

单体架构时代:
在我们刚刚开始学习JAVA开发的时候,所有的功能都会被放在一个spring项目里面,每次项目迭代,发布服务,都会让整个应用不可用,而且随着项目越来越大启动也越来越,而且开发团队在开发周期中要实现的功能越来越多,当原来的单体应用运行维护几年之后,一个小而简单的应用会长成一个庞然大物。

一旦一个应用越做越大,整个团队的开发,持续部署,技术升级,可靠性等都会降低。此时,微服务架构就出现了,他就是为了来解决掉上述的问题的。

微服务架构时代:
通过将一个巨大的单体应用拆分,根据功能模块拆分成一个个小的服务各自发布,各自升级,出问题了只需要修理自己那一部分的服务就行了,可靠性,开发效率也会提升。

image.png

1.2)什么是服务注册中心
当一个服务被拆分成了多个服务,此时服务就会有调用者被调用者两种角色,那么调用者如何正确地调用到自己想要的服务,此时就需要一个服务注册中心来维护这些全部的服务。

Eureka Server作为服务注册中心,其它系统中的服务,使用eureka的客户端连接到Eureka Server并保持心跳连接,这样维护人员就可以通过Eureka server来监控系统中各个服务是否正确运行。

有了注册中心,当服务启动的时候,会把当前服务器的信息,比如服务名,通讯ip地址等以别名的方式注册到注册中心上,其它服务(消费者|生产者),以注册表的形式获取到注册中心上的所有服务地址,然后再进行调用。所以注册中心就是微服务调用的核心。

image.png

1.3)Eureka两组件

Eureka包含两个组件:Eureka Server和Eureka Client

Eureka Server提供注册服务
各个微服务节点通过配置成功启动后,就会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面里直观地看到。

Eureka Client通过注册中心提供访问调用
Eureka Client用于简化和Eureka server的交互,客户端同时也内置轮询等负载均衡算法,来通过一定的策略访问服务提供者。在应用启动后,将会向Eureka Server发送心跳(默认30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务移除(默认90秒)。

2.单机Eureka构建步骤

我们先创建一个springWeb项目:
image.png

修改一下pom文件

<?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.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>eureka-8001</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eureka-8001</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- eureka的依赖 -->
        <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>
     <!-- spring cloud的依赖 -->
    <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>

关于springCloud和springBoot版本的选择,我们可以登录官网https://spring.io/projects/sp...

image.png

因为我们springBoot是2.6.x版本,那么对应的springCloud选择2021.0.x版本就行了。

也可以访问https://start.spring.io/actua...,有更详细的结果。

yml文件:

server:
  port: 8001

eureka:
  instance:
    hostname: eureka1 #eureka服务端的实例名称
  client:
    #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用)
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #true要从其它eureka中获取注册表信息
    #false表示自己端就是注册中心,不需要去注册表中检索服务
    fetch-registry: false

启动类注解加上@EnableEurekaServer

@SpringBootApplication
@EnableEurekaServer
public class DemoApplication {

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

}

此时再启动服务,eureka就完成启动了!

image.png

image.png

当注册中心启动的时候,别的服务来注册,总体流程是这样的:
1)先启动服务注册中心
2)启动服务提供者,消费者服务
3)服务提供者,消费者服务启动后会把自身信息以别名的方式注册进eureka
4)消费者服务在需要调用接口的时候,使用服务别名去注册中心获取远程rpc调用地址
5)消费者获得地址后,底层是利用httpClint技术实现远程调用
6)消费者或者服务地址后,缓存在本地jvm中,默认隔30秒更新一次服务调用地址。

3.集群Eureka构建步骤

我们仔细思考一下,现在所有服务都依赖于我们的注册中心,都需要服务注册中心进行调度和治理,如果服务注册中心出现故障,就会导致整个微服务环境不可用,所以注册中心也得保证高可用,得是集群模式的,我们来搭建一个试试。

其实搭建eureka集群很简答,先改一下yml文件:

eureka-8001服务:

server:
  port: 8001

eureka:
  instance:
    hostname: eureka1 #eureka服务端的实例名称
  client:
    #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用)
    #false表示不向注册中心注册自己
    register-with-eureka: true
    #true要从其它eureka中获取注册表信息
    #false表示自己端就是注册中心,不需要去注册表中检索服务
    fetch-registry: true
    service-url:
      #集群指向其它eureka,有几个注册中心,就写几个eureka
      defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/
spring:
  application:
    name: eureka-8001

再复制一个项目,起名为eureka-8002,改一下pom文件中的名字,yml文件:

server:
  port: 8002

eureka:
  instance:
    hostname: eureka2 #eureka服务端的实例名称
  client:
    #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用)
    #false表示不向注册中心注册自己
    register-with-eureka: true
    #true要从其它eureka中获取注册表信息
    #false表示自己端就是注册中心,不需要去注册表中检索服务
    fetch-registry: true
    service-url:
      #集群指向其它eureka
      defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/
spring:
  application:
    name: eureka-8002

然后把两个服务启动一下,就可以看出服务注册中心已经启动且互相注册了

image.png

4.actuator微服务信息完善

虽然我们的集群已经启动成功,但是服务的status显示的却是localHost,是服务器的名称,我们在生产上部署,通过服务器的名字,很难看出这个服务部署在哪一台服务器上,我们一般是用ip+端口的形式进行展示,同时也更加容易维护。

eureka1的yml:

server:
  port: 8001

eureka:
  instance:
    hostname: eureka1 #eureka服务端的实例名称
    prefer-ip-address: true #访问路径可以显示IP地址
    instance-id: ${spring.cloud.client.ip-address}:${server.port}-eureka1 #访问路径的名称格式
  client:
    #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用)
    #false表示不向注册中心注册自己
    register-with-eureka: true
    #true要从其它eureka中获取注册表信息
    #false表示自己端就是注册中心,不需要去注册表中检索服务
    fetch-registry: true
    service-url:
      #集群指向其它eureka
      defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/
spring:
  application:
    name: eureka-8001

eureka2的yml:

server:
  port: 8002

eureka:
  instance:
    hostname: eureka2 #eureka服务端的实例名称
    prefer-ip-address: true #访问路径可以显示IP地址
    instance-id: ${spring.cloud.client.ip-address}:${server.port}-eureka2 #访问路径的名称格式
  client:
    register-with-eureka: true     #false表示不向注册中心注册自己。
    fetch-registry: true     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #集群指向其它eureka
      defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/
spring:
  application:
    name: eureka-8002

image.png

这样显示就友好地多了。

5.Eureka自我保护

首先我们看一下,什么是eureka的自我保护
在默认的情况下,如果Eureka 在一定的时间内没有接受到某个微服务实例的心跳Eureka就会注销该实例(默认90秒),当网络震荡发生的时候(延时,卡顿,拥挤等等),服务与eureka无法正常通信,虽然微服务本身是健康的,但是服务却会被eureka从注册表中移除,虽然此时这个服务不应该被注册。Eureka通过"自我保护机制",来解决这个问题,当eureka节点在短时间内丢失节点(可能是网络震荡),那么这个节点就会进入自我保护模式。

在自我保护模式中,Eureka会保护服务注册表中的所有信息,不再注销任何服务实例。

它的设计哲学就是宁可保留错误的服务注册信息,也不会盲目注销任何可能的健康的服务实例。

综上,自我保护模式是一种应对网络异常的安全保护措施,它的架构哲学是宁可保留所有的微服务,也不会盲目地注销任何健康的微服务(健康的和不健康的都会被保留),可以让eureka维护的服务更加地稳定,本质上是一种AP的思想

如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式,也就是说,eureka自我保护默认是开启的:
image.png

server:
  port: 8001

eureka:
  instance:
    hostname: eureka1 #eureka服务端的实例名称
    prefer-ip-address: true #访问路径可以显示IP地址
    instance-id: ${spring.cloud.client.ip-address}:${server.port}-eureka1 #访问路径的名称格式
  client:
    #true表示自己同时也是eureka client,会向注册中心注册自己(集群模式会用)
    #false表示不向注册中心注册自己
    register-with-eureka: true
    #true要从其它eureka中获取注册表信息
    #false表示自己端就是注册中心,不需要去注册表中检索服务
    fetch-registry: true
    service-url:
      #集群指向其它eureka
      defaultZone: http://127.0.0.1:8001/eureka/,http://127.0.0.1:8002/eureka/
  server:
    enable-self-preservation: false #关闭自我保护
    eviction-interval-timer-in-ms: 5000 #超时时间为5秒
spring:
  application:
    name: eureka-8001

image.png

此时就关闭了自我保护。

6.Eureka的停更说明
上面我们说了这么多eureka的事情,但是eureka的2.x版本这个组件已经停止更新了。

image.png

7.Eureka停更了怎么办

eureka停止更新了,其实不用慌张,还会有替代的产品,比如zk,consul,nacos等等,我们会在后续的博客进行讲解。


苏凌峰
76 声望42 粉丝

你的迷惑在于想得太多而书读的太少。