• SpringCloud(H版)学习---服务注册中心


    一、概述

      

       1、服务治理:SpringCloud封装了NetFlix公司开发的Eureka模块来实现服务治理。在传统的RPC框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,可以实现服务调用、负载均衡、容错等,实现服务的发现与注册。

      2、服务注册与发现:

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

              

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

      (3)Zookeeper则采用临时节点的方式,临时节点的声明周期和客户端绑定,一旦客户端会话失效,那么这个客户端创建的所有的节点都会被移除,也是服务注册的原理所在。

         (4) Consul服务注册与发现原理:基于Raft协议,牺牲高可用性来保证数据强一致性,Leader/Follower模式,参考:https://blog.csdn.net/u013982921/article/details/93622716

    二、Eureka服务注册与发现

    1、Eureka组件

      包含2个组件:Eureka Server和Eureka Client

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

      Eureka Client通过注册中心访问。是一个Java客户端,用于简化Eureka Client的交互,客户端同时也具备一个内置的、使用轮询(round-ribbon)负载算法的负载均衡器。在应用启动后,将会向EurekaServer发送心跳(默认周期为30s)。如果Eureka Server在多个心跳周期内没有接受到某个节点的心跳,Eureka Server将会从服务注册表中将这个服务点移除(默认90s)。

    2、Eureka集群原理

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

    3、EurekaServer端搭建

      注意:EurekaServer端应该避免单点故障

      参考之前搭建的Eureka高可用集群:SpringCloud全家桶学习之服务注册与发现及Eureka高可用集群搭建(二)

      启动2个Eureka互相注册为中心,查看服务注册中心已注册服务如下:

    4、服务发现

      相关注解:主类添加@EnableDiscoveryClient,对于注册进Eureka里面的微服务,可以通过服务发现来获得该服务的信息。使用方式很简单注解注入DiscoveryClient使用

    5、Eureka的自我保护机制

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

       总结一句话某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该微服务的信息进行保存,属于CAP里面的AP分支。

      为什么会产生自我保护机制?为了防止EurekaClient可以正常运行,但是与EurekaServer网络不通的情况下,EurekaServer不会立刻将EurekaClient服务剔除。

      自我保护模式:默认情况下,如果EurekaServer在一定时间内没有接收到某个服务实例的心跳,EurekaServer将会注销该实例(默认时间为90s)。但是当网络分区故障发生(延迟、卡顿、拥挤时),微服务与EurekaServer之间无法正常通信,以上行为就变得非常危险了----因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护机制”来解决这个问题-----当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么节点就会进入自我保护模式。  

       综上,自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留)也不盲目注销任何异常的微服务。使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

      禁用自我保护机制

        ①EurekaServer:修改eureka.server.enable-self-preservation=true(默认为true)改为false;eureka.server.eviction-interval-timer-in-ms=2000(表示2s没接收到心跳则剔除微服务)

        ②EurekaClient:eureka.client.lease-renewal-interval-in-seconds=30(客户端发送心跳间隔,默认30s),eureka.client.lease-expiration-duration-in-seconds=90(Eureka服务端在收到最后一次心跳后等待时间上限,默认90s,超时将剔除微服务)

    6、Eureka停更

      Github地址:https://github.com/Netflix/eureka/wiki,Eureka已停更,但不停用。

    三、Zookeeper服务注册与发现

       虽然Eureka已停更,现SpringCloud也支持Zookeeper作为注册中心,使用起来也比较简单,下面就操练一把

    1、配置文件修改并添加注解@EnableDiscoveryClient

    #消费端
    server:
      port: 80
    spring:
      application:
        # 服务别名
        name: cloud-consumer-order
      cloud:
        zookeeper:
          # 注册到zookeeper地址
          connect-string: localhost:2181
    
    
    #提供端
    server:
      # 8004表示注册到zookeeper服务器的支付服务提供者端口号
      port: 8004
    spring:
      application:
        # 服务别名---注册zookeeper到注册中心的名称
        name: cloud-provider-payment
      cloud:
        zookeeper:
          # 默认localhost:2181
          connect-string: localhost:2181
    application.yml

    2、Zookeeper服务端查看节点

      如下所示,该服务注册进Zookeeper临时节点的信息

     四、Consul服务注册与发现

       官方地址:https://www.consul.io/intro/index.html(Go语言编写)

      Consul是一套开源的分布式服务发现和配置管理系统,由HashCorp公司用Go语言开发。提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需求单独使用,也可以一起使用构建全方位的服务网络,总之Consul提供了一种完整的服务网络解决方案。

      下载地址:https://www.consul.io/downloads.html

      安装参考:https://learn.hashicorp.com/consul/getting-started/install

      中文文档:https://www.springcloud.cc/spring-cloud-consul.html

    1、进入Consul Web界面

      开发模式启动:consul agent -dev,浏览器访问:http://localhost:8500/即可进入Consul界面

     2、消费者与提供者分别配置Consul

    主启动类分别添加@EnableDiscoveryClient

    #消费者
    server:
      port: 80
    spring:
      application:
        name: cloud-consumer-order
      cloud:
        consul:
          # consul注册中心地址
          host: localhost
          port: 8500
          discovery:
            hostname: 127.0.0.1
            service-name: ${spring.application.name}
    
    
    #提供者
    
    server:
      # consul服务端口
      port: 8006
    spring:
      application:
        name: cloud-provider-payment
      cloud:
        consul:
          # consul注册中心地址
          host: localhost
          port: 8500
          discovery:
            hostname: 127.0.0.1
            service-name: ${spring.application.name}
    application.yml

    3、Consul Web查看微服务

    五、Eureka、Zookeeper与Consul异同点

    (1)AP架构(例Eureka)

      当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。

      结论违背了一致性C的要求,只满足可用性和分区容错即AP

     (2)CP架构

      当网路分区出现后,为了保证一致性,就必须拒绝请求,否则无法保证一致性。

      结论违背了可用性A的要求,只满足一致性和分区容错即CP

      

     六、CAP简介

      理论:C代表强一致性、A代表可用性、P代表分区容错性。由于是分布式系统,所以P必须满足,要么AP、要么CP。

     CAP核心:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足C原则和满足AP原则:

      (1)CA:单点集群,满足一致性、可用性,通常在扩展性上不太强大

      (2)CP:满足一致性、分区容错性,通常性能不是特别高

      (3)AP:满足可用性、分区容错性,通常对一致性要求低一些

    Github地址:https://github.com/Simple-Coder/cloud2020

  • 相关阅读:
    C++前置声明的几种方式
    C++中看上去有些奇怪的惯用法:int和bool之间的转换
    在线文档生成工具 mkdocs 使用方法
    对Java前四章的感受
    类与对象的学习之路
    201671010133 201620172 《java程序设计》 初学java!
    神奇的位运算及其简单应用
    mysql 和 mongo db 语法对比
    phpMyAdmin 配置
    mongoDB 基础指令
  • 原文地址:https://www.cnblogs.com/rmxd/p/12547231.html
Copyright © 2020-2023  润新知