• Spring Cloud系列(二):Eureka应用详解


    一、注册中心

      1、注册中心演变过程

       2、注册中心必备功能

      ① 服务的上线

      ② 服务的下线

      ③ 服务的剔除

      ④ 服务的查询

      ⑤ 注册中心HA

      ⑥ 注册中心节点数据同步

      ⑦ 服务信息的存储,比如mysql,redis,zookeeper,内存map等

      3、RPC远程调用过程

      ① 负载均衡策略:随机,轮询,一致性Hash等;

      ② 容错机制:失败重试,失败自动切换等;

      ③ 透明代理: 调用远程方法跟调用本地的方法一样;

      ④ 协议: 双方约定好的协议,比如http协议,dubbo协议等;

      ⑤ 协议编解码:按照指定的协议进行编解码;

      ⑤ 序列化反序列化:网络传输的都是流,分字节流和字符流,所以需要对传输的数据做序列化,接收的流做反序列化;

      ⑥ 网络传输: 知道对方的ip+port就可以建立网络连接也就是socket连接,然后可以发起网络请求和接收对应的响应;

      ⑦ 线程池:io线程负责io连接,读取事件,等读取完成后交给线程池去处理相应的业务,类似netty的reactor模型;

    二、Eureka详解

      1、Eureka核心的Rest Api接口列表

    请求名称 请求方式 HTTP地址 请求描述
    注册服务 POST /eureka/apps/{appID} 传递JSON或者XML格式的参数内容,HTTP code为204表示成功
    删除服务 DELETE /eureka/apps/{appID}/{instanceID}  HTTP code为200时表示成功
    发起心跳  PUT  /eureka/apps/{appID}/{instanceID}  HTTP code为200时表示成功
     查询服务  GET  /eureka/apps  HTTP code为200时表示成功,返回XML/JSON数据
     查询指定appID的服务列表  GET  /eureka/apps/{appID}  HTTP code为200时表示成功,返回XML/JSON数据
     查询指定appID&instanceID的服务  GET  /eureka/apps/{appID}/{instanceID}  获取指定appID以及instanceID的服务信息,HTTP code为200时表示成功,返回XML/JSON数据
     查询指定instanceID服务列表  GET  /eureka/apps/instances/{instanceID}  获取指定instanceID的服务信息,HTTP code为200时表示成功,返回XML/JSON数据
     变更服务状态  PUT  /eureka/apps/{appID}/{instanceID}/status?value=DOWN  服务上线、服务下线等状态改变,HTTP code为200时表示成功

       2、Eureka服务端和客户端

      2.1 搭建Eureka服务端

      第一步:加依赖

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

      第二步:加注解

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

      第三步:编写配置文件

    server:
      #Eureka服务端应用的端口默认是8761
      port: 8761
    eureka:
      client:
        #表示是否将自己注册到EurekaServer,默认为true,由于当前应用就是EurekaServer,故而设为false
        registerWithEureka: false
        #表示是否从EurekaServer获取注册信息,默认为true,因为这是一个单点的EurekaServer,不需要同步其他的EurekaServer节点的数据
        fetchRegistry: false
        #注册地址
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/

      2.2 搭建Eureka客户端

      第一步:加依赖

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

      第二步:加注解

    /**
     * spring-cloud F版本可不写 @EnableDiscoveryClient
     * @desc: 用户服务启动
     * @author: toby
     */
    @SpringBootApplication
    public class UserApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserApplication.class, args);
        }
    }

      第三步:编写配置文件

    #eureka
    eureka:
      client:
        #注册到Eureka服务端的地址
        serviceUrl:
          defaultZone: http://localhost:8761/eureka
      instance:
        #点击具体的微服务,右下角是否显示ip
        prefer-ip-address: true

       第四步:使用RestTemplate调用,需要加@LoadBalanced注解

     /**
         * 负载均衡加上@LoadBalanced
         * @return
         */
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }

      当然实际项目中都是采用FeignClient来调用的。

      启动Eureka服务端和客户端:

       3、Eureka部署架构

      3.1 架构图

      3.2 Region

    区域 编码
    亚太(东京) ap-northeast-1
    亚太(新加坡) ap-southeast-1
    亚太(悉尼) ap-southeast-2
    欧洲(爱尔兰) eu-west-1
    南美(圣保罗) sa-east-1
    美东(北佛杰尼亚) us-east-1
    美西(北加利佛尼亚) us-west-1
    美西(俄勒冈) us-west-2

       3.3 核心功能

      ① 服务注册(Register):Eureka Client会通过发送REST请求向Eureka Server注册自己的服务,提供自身IP、端口、微服务名称等信息。Eureka Server接收到注册请求后,就会把这些信息存储在一个双层的Map中。

      ② 服务续约(Renew):在服务注册后,Eureka Client会维护一个心跳来持续通知Eureka Server,说明服务一直处于可用状态,防止被剔除。Eureka Client在默认的情况下会每隔30秒(eureka.instance.leaseRenewallIntervalInSeconds)发送一次心跳来进行服务续约。

      ③ 服务同步(Replicate):Eureka Server集群中多个Eureka Server之间会互相进行注册,不同Eureka Server之间会进行服务同步,用来保证Eureka Server集群内的所有实例中的数据一致性(从这个架构来看,Eureka Server所有实例所处的角色都是对等的,没有类似Zookeeper、选举过程,也不存在主从,所有的节点都是主节点。Eureka官方将Eureka Server集群中的所有实例称为"对等体(peer)")。

      ④ 获取服务(Get Registry):服务消费者(Eureka Client)在启动的时候,会发送一个REST请求给Eureka Server,获取上面注册的服务清单,并且缓存在Eureka Client本地,默认缓存30秒(eureka.client.registryFetchIntervalSeconds)。同时,为了性能考虑,Eureka Server也会维护一份只读的服务清单缓存,该缓存每隔30秒更新一次。

      ⑤ 服务调用(Make Remote Call):服务消费者在获取到服务清单后,就可以根据清单中的服务列表信息,查找到其他服务的地址,从而进行远程调用。

      ⑥ 服务下线(Cancel):当Eureka Client需要关闭或重启时,就不希望在这个时间段内再有请求进来,所以,就需要提前先发送REST请求给Eureka Server,告诉Eureka Server自己要下线了,Eureka Server在收到请求后,就会把该服务状态置为下线(DOWN),并把该下线事件传播出去。

      ⑦ 服务剔除(Evict):服务实例可能会因为网络故障等原因导致不能提供服务,而此时该实例也没有发送请求给Eureka Server来进行服务下线,所以,还需要有服务剔除的机制。Eureka Server在启动的时候会创建一个定时任务,每隔一段时间(默认60秒),从当前服务清单中把超时没有续约(默认90秒,eureka.instance.leaseExpirationDurationInSeconds )的服务剔除。

      ⑧ 自我保护:既然Eureka Server会定时剔除超时没有续约的服务,那就有可能出现一种场景,网络一段时间内发生了异常,所有的服务都没能够进行续约,Eureka Server就把所有的服务都剔除了,这样显然不太合理。所以,就有了自我保护机制,当短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server.enableself-preservation: false)

    三、Eureka高可用

      启动eureka-8761,eureka-8762 2个服务

      1、eureka-8761配置文件如下:

    spring:
      application:
        name: eureka-ha
    server:
      #Eureka服务端应用的端口默认是8761
      port: 8761
    eureka:
      client:
        #表示是否将自己注册到EurekaServer,表示8761的服务端需要向8762注册自己
        registerWithEureka: true
        #表示是否从EurekaServer获取注册信息,默认为true,需要从8762获取数据
        fetchRegistry: true
        #注册地址
        serviceUrl:
          defaultZone: http://localhost:8762/eureka/

      2、eureka-8762配置文件如下:

    spring:
      application:
        name: eureka-ha
    server:
      #Eureka服务端应用的端口默认是8761
      port: 8762
    eureka:
      client:
        #表示是否将自己注册到EurekaServer,表示8762的服务端需要向8761注册自己
        registerWithEureka: true
        #表示是否从EurekaServer获取注册信息,默认为true,需要从8761获取数据
        fetchRegistry: true
        #注册地址
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/

      3、eureka-client需要向2个注册中心注册服务(其实写一个就可以,因为eureka集群中的实例之前会同步数据)

    #eureka
    eureka:
      client:
        #注册到Eureka服务端的地址
        serviceUrl:
          defaultZone: http://localhost:8761/eureka,http://localhost:8762/eureka

      启动后:

  • 相关阅读:
    MySQL数据库初识
    Python中面向对象初识到进阶
    python 函数进阶
    Python 函数的初识
    Python的发展与应用
    什么是产品经理 以及职责
    I/O----复制文本文件
    获取次日日期(主要两种方法)
    vector以及array和数组
    编辑软件注释快捷键
  • 原文地址:https://www.cnblogs.com/toby-xu/p/13757333.html
Copyright © 2020-2023  润新知