文章目录

  • 一、Eureka 简介
  • 1.1 Eureka 概述
  • 1.2 Eureka组件
  • 二、Eureka 的使用
  • 2.1 Eureka Server 的搭建
  • 2.2 客户端服务注册
  • 2.3 actuator 微服务信息的完善
  • 2.4 服务发现 Discovery
  • 2.5 Eureka 的自我保护机制


一、Eureka 简介

1.1 Eureka 概述

服务治理

Spring Cloud封装了Netflix公司开发的Eureka模块来实现服务治理。

在传统的RPC远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。

服务注册与发现

Eureka采用了CS的设计架构,Eureka Server作为服务注册功能的服务器, 它是服务注册中心。而系统中的其他微服务,使用Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过Eureka Server来监控系统中各个微服务是否正常运行。

在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息比如服务地址通讯地址等以别名方式注册到注册中心上。另一方(消费者|服务提供者),以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用RPC远程调用框架核心设计思想:在于注册中心,因为使用注册中心管理每个服务与服务之间的一 个依赖关系(服务治理概念)。 在任何RPC远程框架中,都会有一个注册中心(存放服务地址相关信息)。

1.2 Eureka组件

Eureka架构图:

服务注册与发现java_Eureka


Eureka包含两个组件: Eureka ServerEureka Client

Eureka Server 提供服务注册服务

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

EurekaClient 通过注册中心进行访问

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

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

二、Eureka 的使用

2.1 Eureka Server 的搭建

接下来的测试,SpringCloud的版本都为Hoxton.SR1SpringBoot的版本为2.2.2.RELEASE

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

eureka2.x的版本选择spring-cloud-starter-netflix-eureka-server,而不是spring-cloud-starter-eureka

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

配置文件设置:

server:
  port: 7001

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    # false表示不向注册中心注册自己
    register-with-eureka: false
    # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      # 相互注册
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

主启动类上添加注解:@EnableEurekaServer;访问localhost:70001即访问Eureka的主页面;

2.2 客户端服务注册

①主启动类上添加@EnableEurekaClient

② 配置文件添加:

eureka:
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://localhost:7001/eureka/

启动项目后,可以看到服务已经在注册中心了:

服务注册与发现java_Spring Cloud_02

2.3 actuator 微服务信息的完善

添加依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

① 主机名称:服务名称修改

修改配置:

eureka:
  instance:
    instance-id: payment8001

效果:

服务注册与发现java_Spring Cloud_03


② 访问信息有 ip 信息提示

修改配置:

eureka:
  instance:
    prefer-ip-address: true

效果:

服务注册与发现java_Eureka_04

2.4 服务发现 Discovery

对于注册到Eureka里面的微服务,可以通过服务发现来获得该服务的信息

主启动类上添加注解:@EnableDiscoveryClient

测试代码:

@Slf4j
@RestController
@RequestMapping("/payment")
public class PaymentController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/discovery")
    public CommonResult<Object> discovery() {
        List<String> services = discoveryClient.getServices();
        services.forEach(log::info);
        List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");
        instances.forEach(instance -> {
            log.info("serviceId:" + instance.getServiceId() +" instanceId:" + instance.getInstanceId() +" scheme:" + instance.getScheme() +" metadata:" + instance.getMetadata() +" uri:" + instance.getUri());
        });
        return new CommonResult(200, "查询服务发现", this.discoveryClient);
    }

}

打印services信息:

服务注册与发现java_Eureka_05


返回结果:

服务注册与发现java_spring_06

2.5 Eureka 的自我保护机制

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

如果在Eureka Server的首页看到以下这段提示,则说明Eureka进入了保护模式:

服务注册与发现java_Spring Cloud_07


原因:某时刻某一个微服务不可用了,Eureka不会立即清理,依旧会对该微服务的信息进行保存,属于CAP里面的AP分支。使用eureka.server.enbale-self-preservation=false可以禁止自我保护

服务注册与发现java_Spring Cloud_08