Eureka学习笔记

Eureka服务注册与实现

一. Eureka基础知识

1. 什么是服务治理

  • 封装了Netfix公司的Eureka模块来实现服务治理

  • 多个消费者与多个服务提供者之间的相互调用,需要一个管理机制

  • 可以实现服务调用,负载均衡,容错等,实现服务发现与注册

2. 什么是服务注册与发现

  • Eureka采用了CS的设计架构,Eureka Server作为服务注册功能的服务器,是服务注册中心
  • 系统中其他微服务,使用Eureka的客户端连接到Eureka Server
  • 维护人员可以提供Eureka Server 来监控系统中各个微服务是否正常运行

Eureka学习笔记_第1张图片

  • 有一个注册中心,当服务器启动时,会将当前自己服务器的信息,以别名的方式注册到注册中心上
  • 另一方以改别名的方式去注册中心上获取到时机的服务通讯地址
  • 服务治理概念
    • 使用注册中心管理每个服务与服务之间的一个依赖关系
    • 在任何rpc远程框架中,都会有一个注册中心

3. Eureka的两个组件

  • Eureka Server提供服务注册服务
    • 各个微服务节点通过配置启动后,会在Eureka Server中进行注册
    • 服务注册表中会存储所有可用服务节点的信息,可在界面直观看到
  • Eureka Client通过注册中心访问
    • 是一个Java客户端,客户端同时具备一个内置的,使用轮询负载算法的负载均衡器
    • 应用启动后,会向Eureka Server发送心跳(默认30秒),如果在Eureka Server在多个心跳周期内没有接收到某个节点的心跳,会从服务注册表中将这个节点移除
    • (超过一定时间不交费,就会把你清了)

二. 单机Eureka构建步骤

  • IDEA生成Eureka Server端服务注册中心类似于物业公司
  • Eureka Client端 cloud-provider-payment8001 将注册禁Eureka Server成为服务提供者;类似于商城对外提供授课服务
  • Eureka Client端 cloud-consumer-order80 将注册禁Eureka Server成为服务消费者;类似于来购物消费的人

在这里插入图片描述

三. 集群Eureka构建

1. 集群原理说明

  • 先启动Eureka注册中心
  • 启动服务提供者
  • 启动后会将自身学习注册进中心
  • 消费者在需要调用接口时,使用服务别名去注册中心获取时机的RPC远程调用地址
  • 消费者获得调用地址后,底层实际是利用HttpClient技术实现远程调用
  • 消费者获得服务地址后会缓存在本地JVM中,默认30秒更新一次调用地址

Eureka学习笔记_第2张图片

  • 微服务RPC远程服务调用最核心的是高可用

    • 如果注册中心只有一个,如果出故障了,会导致整个服务环境不可用
    • 搭建Eureka注册中心集群,实现负载均衡+故障容错
  • 集群的原理

Eureka学习笔记_第3张图片

2. 注册中心集群环境

  • 需要修改hosts文件
    Eureka学习笔记_第4张图片

  • 修改注册中心yml配置

    • 注册中心需要相互注册

Eureka学习笔记_第5张图片

  • 修改微服务的yml

Eureka学习笔记_第6张图片

3. 提供者模块集群

  • 复制一个新的模块

    • 改一下端口号即可

    • Eureka学习笔记_第7张图片

    • 控制层改一下方便得知是调用的是哪个提供者模块

    • Eureka学习笔记_第8张图片

  • 消费者模块配置类开启负载均衡机制

    • 调用时地址不可写死

    • Eureka学习笔记_第9张图片

    • @LoadBalanced 注解

    • Eureka学习笔记_第10张图片

  • 负载均衡效果达到,端口交替出现

Eureka学习笔记_第11张图片

四. actuator微服务信息完善

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

    • yml文件中添加

    *Eureka学习笔记_第12张图片

  • 设置访问信息有IP提示

    • yml文件中添加即可

    • instance:
        instance-id: payment8002
        prefer-ip-address: true   # 访问路径可以显示IP地址
      

五. 服务发现Discovery

  • 对于注册进Eureka里面的微服务,可以通过Discovery来获取改服务的信息

Eureka学习笔记_第13张图片

六. Eureka自我保护

1. 故障现象

  • 一旦进入保护模式,不会删除服务注册表中的数据

Eureka学习笔记_第14张图片

  • 某时刻有一个微服务不可用了,Eureka不会立即清理,依旧会对该微服务的信息进行保存
  • 属于CAP里面的AP分支
    • 保证高可用

2. 为什么会产生自我保护机制

  • 宁可放过一个,绝不可错杀一千;使得Eureka集群更加健壮,稳定

  • 在Eureka Client与Eureka Server网络不通的情况下,Eureka Server不会立刻将其踢出

3. 什么是自我保护模式

  • 当Eureka Server节点在短时间内丢失过多客户端时,则会进入自我保护模式
  • 微服务本身是没毛病的,只是由于网络分区故障导致无法正常通信

4. 禁止自我保护功能

  • 自我保护机制默认开启

    • 注册中心配置

      • server:
          # 关闭自我保护机制,保证不可用服务被及时踢出
          enable-self-preservation: false
          # 间隔时间
          eviction-interval-timer-in-ms: 2000
        
    • 提供者微服务配置

      • instance:
          instance-id: payment8001
          prefer-ip-address: true   # 访问路径可以显示IP地址
          # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认30)
          lease-expiration-duration-in-seconds: 1
          # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认90)超时踢出服务
          lease-renewal-interval-in-seconds: 2
        
  • 如果提供者发送宕机,则注册中心立马踢出该提供者(灭绝师太模式)
    Eureka学习笔记_第15张图片

七. Zookeeper代替Eureka

1. 注册中心Zookeeper

  • 是一个分布式协调工具,可以实现注册中心功能
  • 关闭Liunx服务器防火墙后启动Zookeeper服务器
  • Zookeeper服务器取代Eureka服务器,zk作为服务注册中心

2. 将提供者注册进Zookeeper

  • 依赖(注意依赖版本不要小于虚拟机或者服务器上的版本)

    <!--SpringBoot整合Zookeeper客户端-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
        <exclusions>
            <!--先排除自带的zookeeper3.5.3-->
            <exclusion>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--添加zookeeper3.4.9版本-->
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.5.7</version>
        <exclusions>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  • yml文件

    server:
      port: 8004
    
    spring:
      application:
        # 服务别名---注册zookeeper到注册中心的名称
        name: cloud-provider-payment
      cloud:
        zookeeper:
          # 默认localhost:2181
          connect-string: 121.19.209.178:2181
    
  • 主启动类(开启@EnableDiscoveryClient)

    @SpringBootApplication
    @EnableDiscoveryClient  // 该注解用于向使用consul或者zookeeper作为注册中心时注册服务
    public class PaymentMain8004 {
    
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8004.class,args);
        }
    
    }
    
  • 控制层

    @RestController
    public class PaymentController {
    
        @Value("${server.port}")
        private String serverPort;
    
        /**
         * http://localhost:8004/payment/zk
         *
         * @return
         */
        @RequestMapping(value = "payment/zk")
        public String paymentZk() {
            return "SpringCloud with zookeeper:" + serverPort + "\t" + UUID.randomUUID().toString();
        }
    
    }
    

3. 将消费者注册进Zookeeper

  • yml及pom文件与提供者大概一致

  • 配置类

    • 使用RestTemplate使用远程调用
    @Configuration
    public class ApplicationContextBean {
    
        @Beanjava
        @LoadBalanced
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    
    }
    
  • 控制层

    @RestController
    @Slf4j
    public class OrderZkController {
    
        public static final String INVOKE_URL = "http://cloud-provider-payment";
    
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping(value = "consumer/payment/zk")
        public String paymentInfo() {
            String result = restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);
            return result;
        }java
    
    }
    

4. 服务节点是临时节点还是持久节点

  • 是临时节点

    • 当你服务停止之后,并不会立刻踢你,zookeeper会在一定时间范围里给你发心跳包,如果发着发着没有回音,则踢出

      @GetMapping(value = “consumer/payment/zk”)
      public String paymentInfo() {
      String result = restTemplate.getForObject(INVOKE_URL + “/payment/zk”, String.class);
      return result;
      }java

    }

    
    

4. 服务节点是临时节点还是持久节点

  • 是临时节点

    • 当你服务停止之后,并不会立刻踢你,zookeeper会在一定时间范围里给你发心跳包,如果发着发着没有回音,则踢出

    • 比Eureka更加干脆

你可能感兴趣的:(微服务,分布式,zookeeper,java)