【微服务SpringCloud】:Eureka 注册中心

1、什么是 Eureka?

我们在之前了解过注册中心,Eureka 就是注册中心的一种。

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

在这里插入图片描述
Eureka由3个角色组成:

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

2、Eureka 的两个组件

2.1、Eureka Server

Eureka Server 组件提供服务注册服务。当各个微服务节点通过配置启动后,会在Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中将会存储所有可用服务节点的信息。

而 Eureka Server 本身也是一个SpringBoot 项目,且没有任何业务逻辑。Eureka Server 的创建如下:

  • 引入坐标:引入 Eureka Server 所需要的依赖

    <dependency>
     	<groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
  • 添加配置文件:添加有关 Eureka Server

    #这个表示 Eureka 服务中心运行的端口号。
    server:
      port: 9999
    
    spring:
      application:
        name: eureka-server
        
    eureka:
      instance:
    	hostname: localhost
      client: 
    	#表示是否向注册中心注册自己。false 表示不注册。默认为 true
    	register-with-eureka: false
    	#表示是否从Eureka中获取注册信息。false 表示不获取.默认为 true
    	fetch-registry: false
    	#表示客户端与Eureka服务端进行交互的地址
    	serviceUrl:
     	  defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    
  • 修改启动类:在启动类上添加注解@EnableEurekaServer

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
    }
    

在完成上述步骤之后,通过浏览器访问localhost:9999,如果出现如下显示表示 Eureka 的服务中心搭建成功:在这里插入图片描述

2.2、Eureka Client

Eureka Client 通过注册中心进行访问。Eureka Client 本身是一个服务,然后通过配置将其注册到注册中心上。服务提供方和服务服务提供方都需要实现 Eureka Client 。具体配置如下:

  • 引入坐标:引入 Eureka Client所需要的依赖
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>
    
  • 修改配置文件:添加与 Eureka 有关的配置
    server:
      port: 9001
    
    spring:
      application:
        name: cloud-order-service
    eureka:
      instance:
        hostname: localhost
        #使用ip地址注册
        prefer-ip-address: true
        #使用自定义注册
       	instance-id:  ${spring.cloud.client.ip-address}:${server.port} 
      client:
     	#表示是否向注册中心注册自己。true 表示注册。
    	register-with-eureka: true
    	#表示是否从Eureka中获取注册信息。true 表示获取。默认为 true
    	fetch-registry: true
        serviceUrl:
           defaultZone: http://localhost:9999/eureka
    
  • 修改启动类:在启动类上添加注解@EnableEurekaClient@EnableDiscoveryClient。在版本比较新的 SpringCloud 中,可以省略注解。
    @SpringBootApplication
    @EnableDiscoveryClient
    //@EnableEurekaClient
    public class EurekaClientApplication {
    }
    

在完成上述步骤之后,通过浏览器访问localhost:9999,如果出现如下显示表示服务已经注册到了 Eureka 的服务中心:

在这里插入图片描述

2.3、Eureka 元数据

Eureka中的元数据是指当服务注册到服务中心之后,服务的主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。

Eureka的元数据有两种:标准元数据和自定义元数据。

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

只有在去调用注册进 Eureka 里面的微服务,才会使用到元数据。Eureka 将元数据都存放在由 SpringCloud 提供了一个工具类DiscoveryClient中,具体使用如下:

 	/**
     * 注入DiscoveryClient :
     * springcloud提供的获取原数组的工具类
     * 调用方法获取服务的元数据信息
     */
    @Autowired
    private DiscoveryClient discoveryClient;
    
	public void findById() {
        //调用discoveryClient方法
        //已调用服务名称获取所有的元数据
        //参数为注册在服务中心的服务名
        List<ServiceInstance> instances = discoveryClient.getInstances("service-product5");
        //获取唯一的一个元数据
        ServiceInstance instance = instances.get(0);      
    }

下图中是一个服务包含的所有元数据,其中也包含自定义的元数据:
在这里插入图片描述
在获取到元数据之后,我们就可以使用 Spring 中提供的 RestTemplate类 远程调用服务。使用RestTemplate类之前必须要在启动类中将RestTemplate类注入到 IOC 容器中:

@SpringBootApplication
@EnableEurekaClient
public class OrderMain
{
    public static void main(String[] args)
    {
        SpringApplication.run(OrderMain8001.class,args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

然后再具体的业务类中进行调用:

@RestController
public class OrderController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/user/{id}")
    public String user(@PathVariable("id") Integer id) {
        List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");
        ServiceInstance instance = instances.get(0);
        String result = restTemplate.getForObject(instance.getUri()+ "/具体访问路径", String.class);
        return result;
    }
}

3、Eureka 自我保护

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

Eureka Server在运行期间,但是当网络分区故障发生(延时、卡顿、拥挤),微服务与 Eureka Server 会之间无法正常通信,导致微服务移除过多时。会判断心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况,Eureka Server会进入自我保护,将当前的实例注册信息保护起来,同时提示这个警告。

一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。完自我保护机制开启后,并不会马上呈现到web上,而是默认需等待 5 分钟后会看到下面的提示信息:

在这里插入图片描述
Eureka 的自我保护机制是默认开启,可以通过eureka.server.enable-self-preservation配置项对自动保护进行设置,false 表示关闭保护机制

其他设置:

  • 设置Eureka客户端向服务端发送心跳的时间间隔:lease-renewal-interval-in-seconds: 1,默认是 30 秒
  • 设置Eureka服务端在收到最后一次心跳后等待时间上限:lease-expiration-duration-in-seconds: 2,默认是 90 秒
  • 设置自我保护机制开启后,呈现到web页面上的时间:eureka.server.wait-time-in-ms-when-sync-empty:60,默认是 5分钟

4、Eureka 高可用集群

Eureka Client会定时连接Eureka Server,获取注册表中的信息并缓存到本地。微服务在消费远程API时总是使用本地缓存中的数据。所以即使Eureka Server发生宕机,也不会影响到服务之间的调用。但是当Eureka Server发生宕机,且某个服务发生改变时,就可能会影响到微服务的调用,甚至影响到整个应用系统的高可用,因此通常会搭建一个高可用的Eureka注册中心集群

想要搭建 Eureka Server 高可用集群,就必须创建多个 Eureka Server,这些 Eureka Server 只在配置上有略微差别:

#第一个Eureka Server配置文件
server:
  port: 9999
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      #注意这里是第二个Eureka Server的地址
      defaultZone: http://127.0.0.1:9998/eureka/
#第二个Eureka Server配置文件
server:
  port: 9998
spring:
  application:
    name: eureka-server
eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      #注意这里是第一个Eureka Server的地址
      defaultZone: http://127.0.0.1:9999/eureka/

在搭建 Eureka 集群时,需要注意的是,defaultZone属性的属性值不是该 Eureka Server 的地址,而是集群内除开它本身的地址。

在这里插入图片描述

需要在将服务注册到Eureka Server集群中,需要修改 Eureka Client 的配置文件:

server:
  port: 9001

spring:
  application:
    name: eureka-client

eureka:
  instance:
    hostname: localhost
  client:
	register-with-eureka: true
	fetch-registry: true
    serviceUrl:
       defaultZone: http://localhost:9999/eureka,http://localhost:9998/eureka

5、总结

在学习了 Eureka 之后,可以发现其实 Eureka 大多数功能都是通过配置文件进行配置的,所以我们需要重点去了解 Eureka 的配置项(配置详解传送门)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值