SpringCloud-Eureka

239 阅读4分钟

Eureka简介

简介

  • Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

  • Eureka包含两个组件:Eureka ServerEureka Client

  • Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

  • Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

  • 在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。(自我保护机制)

  • Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性

三大角色

Eureka Server:提供服务的注册与发现

Service Provider:服务生产方,将自身服务注册到Eureka中,从而使服务消费方能狗找到

Service Consumer:服务消费方,从Eureka中获取注册服务列表,从而找到消费服务

Eureka服务搭建

该环境延续了上一篇Blog的Rest的环境,所以我们的Eureka环境是在Rest环境下接着搭建

Eureka

  1. 创建一个新的模块springcloud-eureka-7001,导入Eureka的依赖
<!-- eureka -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
  1. 编写application.yml配置
server:
  port: 7001

#eureka配置
eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    register-with-eureka: false # 表示是否向eureka注册自己
    fetch-registry: false # false:设置自己为注册中心
    service-url: #监控页面
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  1. 编写主启动类
package springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer //eureka服务端启动类
public class EurekaServer {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServer.class,args);
    }
}

  1. 访问http://localhost:7001/ 进行测试

image.png

服务提供者

  1. 导入依赖
<!-- eureka -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
  1. application.yml配置eureka
eureka:
  client:
    service-url: 
      defaultZone: http://localhost:7001/eureka/
  1. 主启动类开启服务端,添加@EnableEurekaClient
  2. 启动测试,eureka也要启动!!!(如果之前启动了eureka的,要先重新启动eureka,再启动服务提供者)

image.png 5. 我们还可以修改eureka中,服务提供者的描述信息,在application.yml中配置

eureka:
  instance:
    instance-id: provider-detail-message # 配置描述信息

image.png

  • 如果突然停电了,或者你的服务崩了,(模拟一下场景就是你把服务提供者先关了),这时候,服务提供者还在eureka里面嘛?

image.png

我们发现服务提供者还在,这就涉及到了eureka的自我保护机制

  • 虽然这服务提供者已经崩了,但是eureka还是会保存它的信息的,我们可以查看一下它的监控信息

image.png

到底要怎么查看呢,我们需要增加一些配置

  1. 添加完善监控信息的依赖
<!-- actuator完善监控信息 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. application.yml配置监控信息
info:
  app.name: springcloud-provider
  company.name: apach

image.png

  1. 启动服务提供者

image.png

  • 当然了,我们还可以去获取一下这些服务的信息
  1. 编写DeptController.java,获取这些服务的信息
    @Autowired
    private DiscoveryClient client;
    //注册进来的微服务,获取信息
    @GetMapping("/message")
    public Object discovery(){
        //获取微服务
        List<String> services = client.getServices();
        System.out.println("获取的微服务"+services);

        //得到具体的微服务,通过微服务的id
        List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER");

        for (ServiceInstance instance : instances) {
            System.out.println(instance.getHost());
            System.out.println(instance.getInstanceId());
            System.out.println(instance.getPort());
            System.out.println(instance.getUri());
            System.out.println(instance.getServiceId());
        }
        return client;
    }
  1. 在主启动类加上@EnableDiscoveryClient
  2. 启动测试

image.png

image.png

Eureka VS Zookeeper

CAP是什么?

  • C (Consistency) 强一致性
  • A (Availability) 可用性
  • P (Partition tolerance) 分区容错性

CAP理论的核心

一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,只能三选二

根据CAP原理,将NoSQL数据库分成了满足CA原则,满足CP原则和满足AP原则三大类

  • CA:单点集群,满足一致性,可用性的系统,通常可扩展性较差
  • CP:满足一致性,分区容错的系统,通常性能不是特别高
  • AP:满足可用性,分区容错的系统,通常可能对一致性要求低一些

其中 Eureka 保证的是 AP —> 满足可用性,分区容错的系统,通常可能对一致性要求低一些

Zookeeper 保证的是 CP —> 满足一致性,分区容错的系统,通常性能不是特别高

这也是我们选择Eureka的原因~~~