SpringCloud Eureka注册中心

Eureka的基础知识

Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflix中, 实现SpringCloud的服务发现功能。


上图简要描述了Eureka的基本架构由3个角色组成:

  • 1、Eureka Server
    提供服务注册和发现
  • 2、Service Provider
    服务提供方、将自身服务注册到Eureka,从而使服务消费者能够找到
  • 3、Service Consumer
    服务消费方、从Eureka获取注册服务列表、从而能够消费服务

搭建Eureka注册中心

1、创建shop_eureka_server模块 引入坐标

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

2、添加配置文件

server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false #是否将自己注册到Eureka服务中
    fetch-registry: false #是否从Eureka中获取注册信息 
    service-url: #客户端与Eureka服务端进行交互的地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3、配置启动类
在cn.nzblog下创建启动类EurekaApplication

@SpringBootApplication
@EnableEurekaServer //激活Eureka Server
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

打开浏览器访问http://localhost:8761即可进入EurekaServer内置的管理控制台

注册服务到注册中心

这里演示商品服务注册到注册中心配置,其他微服务注册步骤相同,引入依赖
1、在shop_service_product 的pom文件中添加eureka client的相关坐标依赖

<!--eureka-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、配置Application文件
在工程的 application.yml 中添加Eureka Server的主机地址

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    prefer-ip-address: true #使用ip注册

3、添加服务注册注解
在ProductApplication启动类上添加@EnableDiscoveryClient或@EnableEurekaClient注解

@SpringBootApplication
@EntityScan("cn.nzblog.entity")
@EnableDiscoveryClient
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class,args);
    }
}
从Spring Cloud Edgware版本开始, @EnableDiscoveryClient@EnableEurekaClient 可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。

Eureka的自我保护机制

微服务第一次注册成功之后,每30秒会发送一次心跳将服务的实例信息注册到注册中心。
通知 Eureka Server 该实例仍然存在。如果超过90秒没有发送更新,则服务器将从注册信息中将此服务移除。

Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况 (在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会 将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server 之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的 信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)

验证完自我保护机制开启后,并不会马上呈现到web上,而是默认需等待 5 分钟(可以通过 eureka.server.wait-time-in-ms-when-sync-empty 配置),即 5 分钟后你会看到下面的提示信息:

关闭自我保护机制
通过设置 eureka.enableSelfPreservation=false 来关闭自我保护功能。

Eureka中的元数据

Eureka的元数据有两种:标准元数据和自定义元数据。
标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注 册表中,用于服务之间的调用。
自定义元数据:可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式。这 些元数据可以在远程客户端中访问。

在程序中可以使用DiscoveryClient 获取指定微服务的所有元数据信息

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class RestTemplateTest {

    @Autowired
    private DiscoveryClient discoveryClient;

    @Test
    public void test(){
        List<ServiceInstance> instances = discoveryClient.getInstances("shop-service-product");
        for (ServiceInstance instance : instances) {
            System.out.println(instance.getHost()+":"+instance.getPort());
        }
    }
}

Eureka高可用集群搭建

单点部署的Eureka Server。Eureka Client会定时连接 Eureka Server,获取注册表中的信息并缓存到本地。微服务在消费远程API时总是使用本地缓存中的数据。因此一般来说,即使Eureka Server发生宕机,也不会影响到服务之间的调用
但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Server中的缓存若不被刷新,就可能会影 响到微服务的调用,甚至影响到整个应用系统的高可用。所以在生产环境中,通常会部署一个高可用 的Eureka Server集群。

Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增 量地同步信息,从而确保所有节点数据一致

1、YML配置文件修改
修改 shop_eureka_server 工程中的yml配置文件

spring:
  application:
    name: shop-eureka-server
---
spring:
  profiles: eureka1
server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8762/eureka/
---
spring:
  profiles: eureka2
server:
  port: 8762
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8761/eureka/

在配置文件中通过连字符---将文件分为三个部分,第一部分为应用名称,第二部分和第三部分是根据不同的profiles进行启动,可以在IDEA启动时进行激活配置

IDEA配置示例图
IDEA配置示例图

复制一份在ActiveProfiles位置修改为eureka2,然后保存依次启动两个注册中心
然后打开注册中心就可以看到shop-eureka-server已经有两个节点了

在Eureka Server的管控台中,显示的服务实例名称默认情况下是微服务定义的名称和端口,为了更好 的对所有服务进行定位,微服务注册到Eureka Server的时候可以手动配置示例IDeureka.instance.instance-id: ${spring.cloud.client.ip-address}:${server.port}可以以IP:端口的形式在注册中心显示

2、服务注册到Eureka集群
将微服务注册到Eureka Server集群和单节点注册几乎没区别,多写一个节点就行用,隔开

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/

Eureka中常见问题

1、服务注册慢
默认情况下,服务注册到Eureka Server的过程较慢。SpringCloud官方文档中给出了详细的原因


大致含义:服务的注册涉及到心跳,默认心跳间隔为30s。在实例、服务器、客户端都在本地缓存中具 有相同的元数据之前,服务不可用于客户端发现(所以可能需要3次心跳)。可以通过配置 eureka.instance.leaseRenewalIntervalInSeconds (心跳频率)加快客户端连接到其他服务的过 程。在生产中,最好坚持使用默认值,因为在服务器内部有一些计算,他们对续约做出假设。

2、服务节点剔除问题
EurekaServer端配置

  • 关闭自我保护server.enable-self-preservation: false
  • 设置剔除无效节点间隔时间server.eviction-interval-timer-in-ms: 4000单位毫秒

Eureka Client端配置

  • 开启健康检查eureka.client.healthcheck: true
  • 设置续约时间eureka.instance.lease-expiration-duration-in-seconds: 10
  • 发送心跳续约间隔eureka.instance.lease-renewal-interval-in-seconds: 5

添加新评论

评论列表