服务注册中心Eureka

什么是服务注册中心?

所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。

image.png

SpringCloud支持的多种注册中心Eureka、Consul、Zookeeper、以及阿里巴巴推出Nacos。这些注册中心在本质上都是用来 管理服务的注册和发现以及服务状态的检查的。

服务注册中心的功能有以下几点:

  1. 可以对所有的微服务的信息进行存储,如微服务的名称、IP、端口等。
  2. 可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用。
  3. 可以对所有的微服务进行心跳检测,如发现某实例⻓时间无法访问,就会从服务注册表移除该实例。

Eureka

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务。SpringCloud将它集成在其子项目spring-cloud- netflix中, 以实现SpringCloud的服务注册和发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka在最新的2.x版本中已经停止维护了,从此成为了历史。不过1.x版本仍然可以使用。

开发EurekaServer

创建新的Module并引入依赖

在SpringCloud环境中创建一个新的SpringBoot项目,并继承父项目,并修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloud</artifactId>
        <groupId>com.moti</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-eureka-server</artifactId>

    <dependencies>
        <!--引入SpringBoot依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入Eureka-Server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>3.0.3</version>
        </dependency>
    </dependencies>
</project>
修改配置文件

修改application.properties为以下内容:

# 服务端口
server.port=8761
# 指定服务名称 唯一标识(不可以出现下划线)
spring.application.name=EurekaServer
# 指定服务注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
# 为避免运行项目报错,需关闭服务端立即注册,待服务端启动完成之后再进行注册操作
eureka.client.fetch-registry=false
# 关闭注册,单纯作为注册中心
eureka.client.register-with-eureka=false
启动类添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}
启动项目,访问localhost:8761

image.png

开发EurekaClient

EurekaClient其实就是SpringCloud中每一个组件,本示例就单纯创建一个空的组件并注册到注册中心。

创建新的Module并引入依赖

在SpringCloud环境中创建一个新的SpringBoot项目,并继承父项目,并修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloud</artifactId>
        <groupId>com.moti</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-eureka-client</artifactId>

    <dependencies>
        <!--引入SpringBoot依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入Eureka-Client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.0.3</version>
        </dependency>
    </dependencies>

</project>
修改配置文件

修改application.properties为以下内容:

# 服务端口
server.port=8989
# 指定服务名称 唯一标识(不可以出现下划线)
spring.application.name=EurekaClient
# Eureka注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
启动类添加@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}
启动项目,访问上文已经启动的Eureka服务端Web页面

image.png

可以看到我们刚启动的客户端已经成功的注册到了注册中心。

EurekaServer集群部署

需要按照上文创建EurekaServer的部署,再创建两个项目,配置端口分别为8762、8763。
之后需要修改三个服务端的配置文件内容:

# 指定服务注册中心的集群地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka

之后还需要修改每一个EurekaClient的配置,将自己注册到多个注册中心中

# 指定服务注册中心的集群地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka,http://localhost:8762/eureka,http://localhost:8763/eureka

之后启动三个服务端以及客户端,分别在浏览器访问9761、8762、8763端口,均可看到已经注册了一个EurekaClient组件。

Eureka的自我保护机制

有时候我们会在Eureka的前端页面看到这样一段红色警告,这是因为它开启了自我保护机制。

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

image.png

默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。

Eureka Server在运行期间会去统计心跳失败比例在15分钟之内是否低于85%,如果低于85%,Eureka Server会将这些实例保护起来,让这些实例不会过期。这种设计的哲学原理就是“宁可信其有不可信其无!”。自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

关闭自我保护机制

如有需要,可以在Eureka的服务端关闭自我保护机制,需要在配置文件中添加以下配置:

# 关闭自我保护  
eureka.server.enable-self-preservation=false
# 超时3s自动清除
eureka.server.eviction-interval-timer-in-ms=3000

之后还需要在每一个需要注册的客户端组件中添加以下配置:

# 用来修改eureka server默认接受心跳的最大时间 默认是90s
eureka.instance.lease-expiration-duration-in-seconds=10 
# 指定客户端多久向eureka server发送一次心跳 默 认是30s
eureka.instance.lease-renewal-interval-in-seconds=5 

尽管我们关闭了自我保护机制,但是还是会出现警告,只不过警告内容换了,因为官方并不建议我们关闭它。

THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值