zoukankan      html  css  js  c++  java
  • 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

      启动后:

  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/toby-xu/p/13757333.html
Copyright © 2011-2022 走看看