SpringCloud学习之Eureka、Zookeeper、Consul注册中心

SpringCloud介绍

Spring cloud是一个基于Spring Boot实现的服务治理工具包,在微服务架构中用于管理和协调服务的
微服务:是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的RESTful API)。每个服务都围绕着基本业务进行构建,并且能够被独立的部署到生成环境。
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

在这里插入图片描述
SpringCloud采用了英国伦敦地铁站的名称来命名,并且由地铁站名称字母A-Z依次类推的形式发布迭代版本。SpringCloud的发布内容积累到临界点或者一个重大BUG被解决后,会发布一个“service releases”版本,简称“SRX”版本。

SpringCloud和SpringBoot版本选择:https://spring.io/projects/spring-cloud#overview
更细致的版本对应:https://start.spring.io/actuator/info
访问的页面返回是json串,找个在线json工具转换一下就可以看到对应的版本,转换后的json有点长,下图只是截取的SpringCloud对应的SpringBoot的版本
在这里插入图片描述
SpringCloud各个组件功能:在这里插入图片描述
可能看Spring官网都是英文看不懂或者看不明白,下面附上中文链接:https://www.bookstack.cn/read/spring-cloud-docs/docs-user-guide-eureka.md

关于Spring各种组件的停更/升级/替换:Spring Cloud其实就是一套规范,而Spring Cloud Netflix、Spring Cloud Alibaba才是SpringCloud规范的实现
在这里插入图片描述

Eureka(服务注册中心)

SpringCloud Eureka是SpringCloud Netflix服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能。

Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是极为重要的,有了服务发现与注册,只需要使用服务标识符就可以访问到服务,而不需要修改服务调用的配置文件。功能类似于Dubbo的注册中心,比如Zookeeper。

Eureka既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用java编写,所以Eureka主要适用于通过java实现的分布式系统,或是JVM兼容语言构建的系统。Eureka的服务端提供了较为完善的REST API,所以Eureka也支持将非java语言实现的服务纳入到Eureka服务治理体系中来,只需要其他语言平台自己实现Eureka的客户端程序。

Eureka包含两个组件:Eureka ServerEureka Client

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

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

Eureka在Spring官方已经停止更新了,但还可以使用,不过有许多可以替代Eureka的组件,比如Zookeeper、Consul、Nacos

EurekServer单机

pom依赖:

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

启动类:

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

yml配置文件:

server:
  port: 7001

eureka:
  instance:
    hostname: localhost  #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己
    fetch-registry: false #fasle表示自己就是服务注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:  #如果是集群这里写其他集群的地址,这里是单机写自己的地址
      defaultZone:  http://${eureka.instance.hostname}:${server.port}/eureka/

启动访问localhost:7001即可

EurekaClient注册单机EurekaServer

pom依赖

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

启动类:

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

yml配置文件:

server:
  port: 8001
spring:
  application:
    name: cloud-payment-service

eureka:
  client:
    register-with-eureka: true    #表示是否将自己注册进EurekaSever,默认为true
    fetch-registry: true        #是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    service-url:	#注册进名字叫localhost端口为7001EuerkaServer里
      defaultZone:  http://localhost:7001/eureka
  instance:
    instance-id: payment8001    #在EurekaClient上显示的Server名称
    prefer-ip-address: true     #点击EurekaClient上的服务名,访问显示ip

访问localhost:7001
在这里插入图片描述

EurekaServer集群搭建(三台)

三台机器大部分相同,下面只写不同的yml文件
第一台机器7001yml配置文件:

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com  #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己
    fetch-registry: false #fasle表示自己就是服务注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:  #另外两台的地址
      defaultZone:  http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

第二台机器7002yml配置文件:

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com  #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己
    fetch-registry: false #fasle表示自己就是服务注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:  #另外两台的地址
      defaultZone:  http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/

第三台机器7003yml配置文件:

server:
  port: 7003

eureka:
  instance:
    hostname: eureka7003.com  #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己
    fetch-registry: false #fasle表示自己就是服务注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:  #另外两台的地址
      defaultZone:  http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

分别启动即可,结果如下图,这里是访问7001的截图:
在这里插入图片描述

服务发现 Discovery

1.在启动类上加@EnableDiscoveryClient注解
2.在Controller中加个测试方法

    import org.springframework.cloud.client.discovery.DiscoveryClient;
    @Autowired
    private DiscoveryClient discoveryClient;//这里有两个DiscoveryClient,一个是Eureka下的一个是spring下的,这里导包小心导错

	@GetMapping(value = "payment/discovery")
    public Object discovery(){
        //获取EurekaServer上都有哪些服务
        List<String> services = discoveryClient.getServices();
        for (String s : services) {
            log.info("服务Server:"+s);
        }
        //CLOUD-PAYMENT-SERVICE:注册到Eureka上的Client服务名
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info("服务名:"+instance.getServiceId()+";ip:"+instance.getHost()+";端口:"+instance.getPort()+";url:"+instance.getUri());
        }

        return this.discoveryClient;
    }

EurekaServer如下:
在这里插入图片描述
Controller方法中输出结果如下:
在这里插入图片描述

Eureka自我保护机制

先回顾一下分布式环境中经常提及的一个东西 - CAP

C - consistency 强一致性
A - availability  可用性
P - partition tolerance 分区容错性

CAP核心理论:一个分布式系统不可能同时很好的满足一致性,可用性,和分区容错性三个需求

CA - 单点集群,满足一致性,可用性,通常在可拓展性上不太强大
CP - 满足一致性,分区容错性的系统,通常性能不是特别的高
AP - 满足可用性,分区容错性,通过对数据一致性要求低一些。
分布式系统考虑到集群的拓展,只能选择CP 或者 AP 

Eureka在设计上遵循AP原则

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

在自我保护模式中,Eureka Server 会保护服务注册表中的信息,不再注销任何服务实例。
它的设计哲学就是宁可保留错误的服务注册信息,也不盲目注销任何可能健康的服务实例。

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

Eureka默认是开启自我保护机制的
EurekaServer端:

eureka.server.enable-self-preservation=true		#false是关闭自我保护机制
eureka.server.eviction-interval-timer-in-ms=5000	#eureka server清理无效节点的时间间隔,默认60000毫秒,即60

EurekaClient端:

eureka.client.registry-fetch-interval-seconds=5		#表示EurekaClient端向服务端(EurekaServer)发送心跳的时间间隔,单位为秒,默认30S
eureka.instance.lease-expiration-duration-in-seconds=15		#EurekaServer端在收到最后一次心跳后等待时间上限,单位为秒.默认90,超时将移除Client
eureka.instance.lease-renewal-interval-in-seconds=5		#每个多久主动心跳一次  单位为秒,默认30

Eureka停止更新:https://github.com/Netflix/eureka/wiki

Zookeeper服务注册中心(用的相对比较少)

pom依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
    <version>版本</version>
</dependency>

注意:依赖的版本不要比zookeeper的版本高,不然会报错
yml配置文件:

server:
  port: 8003
spring:
  application:
    name: cloud-provider-payment    #注册到zookeeper上的服务名称
  cloud:
    zookeeper:
      connect-string: #zookeeper地址加端口号,多个用英文逗号分隔
#数据库连接配置和其他配置省略

启动类:

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

此时启动Zookeeper和启动类 就可以看到Zookeeper下注册进的服务
zookeeper具备的服务节点是临时的

Consul

Consul 是一套开源的分布式发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发,
提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以更具需要单独使用, 也可以一起使用构建全方位的服务网格总之 Consul 提供了一宗完整的服务网格解决方案。
它具有很多优点, 包括: 基于 raft 协议,比较简洁; 支持健康检查,同时支持 HTTP 和DNS 协议支持跨数据中心的WAN 集群 提供图形化界面,跨平台,支持 Linux 、Max 、Windows

Consul下载地址安装步骤与 spring-cloud 整合参考

Windows版单机搭建

Windows版下载后直接解压,只有一个exe文件
进入解压路径:cmd窗口查看consul版本:consul --version
在这里插入图片描述
开发模式运行consul:consul agent -dev 出现Consul agent running说明运行成功
在这里插入图片描述
访问localhost:8500
在这里插入图片描述

服务注册进单机Consul

pom依赖:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  <version>2.2.2.RELEASE</version>
</dependency>

yml配置:

server:
  port: 8004

spring:
  application:
    name: payment-service
  #Consul注册中心地址
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        service-name: ${spring.application.name}

consul的其他一些配置

spring.cloud.consul.host:配置consul地址
spring.cloud.consul.port:配置consul端口
spring.cloud.consul.discovery.enabled:启用服务发现
spring.cloud.consul.discovery.register:启用服务注册
spring.cloud.consul.discovery.deregister:服务停止时取消注册
spring.cloud.consul.discovery.prefer-ip-address:表示注册时使用IP而不是hostname
spring.cloud.consul.discovery.health-check-interval:健康检查频率
spring.cloud.consul.discovery.health-check-path:健康检查路径
spring.cloud.consul.discovery.health-check-critical-timeout:健康检查失败多长时间后,取消注册
spring.cloud.consul.discovery.instance-id:服务注册标识

主启动类:

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

这样服务就注册进consul了

Eureka、Zookeeper、Consul的异同点

组件名语言CAP服务健康检查对外暴露接口SpringCloud集成
EurekaJavaAP可配支持HTTP已集成
ConsulGoCP支持HTTP/DNS已集成
ZookeeperJavaCP支持客户端已集成
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SpringCloud微服务课程说明 1 网站架构演变过程 1 传统架构 1 分布式架构 1 SOA架构 1 微服务架构 2 微服务架构产生的原因 2 漫谈微服务架构 2 什么是微服务 2 微服务架构特征 3 微服务架构如何拆分 3 微服务架构与SOA架构区别 3 SpringCloud微服务框架 3 为什么选择SpringCloud 4 SpringCloud简介 4 服务治理SpringCloud Eureka 5 什么是服务治理 5 服务注册与发现 5 搭建注册中心 6 常用注册中心框架 6 注册中心环境搭建 6 注册服务提供者 8 服务消费者 11 高可用注册中心 14 Eureka高可用原理 14 Eureka集群环境搭建 14 Eureka详解 17 使用Eureka闭源了闭源了怎么办? 21 使用Consul来替换Eureka 21 使用Zookeeper来替换Eureka 25 Consistency(一致性), 数据一致更新,所有数据变动都是同步的 Availability(可用性), 好的响应性能 Partition tolerance(分区容忍性) 可靠性 28 客户端负载均衡器 29 客户端负载均衡器 29 Ribbon与Nginx区别 29 RestTemplate 31 请求类型 31 负载均衡器源码分析 33 负载均衡器重试机制 33 服务保护机制SpringCloud Hystrix 33 微服务高可用技术 33 服务降级、熔断、限流概念 34 服务学崩效应 34 服务降级 34 服务熔断 35 服务隔离 35 服务限流 36 Hystrix简单介绍 36 Hystrix环境搭建 37 Maven依赖信息 37 开启Hystrix断路器 37 服务降级处理 38 Hystrix仪表盘 39 Turbine集群监控 39 声明式服务调用SpringCloud Feign 39 feign介绍 39 环境搭建 40 Maven依赖信息 40 feign客户端接口 40 feign继承特性 41 创建springcloud-2.0-parent 42 Ribbon配置 45 配置Feign客户端超时时间 45 Api网关服务SrpingCloud Zuul 45 网关分类 46 网关设计 46 网关框架 48 网关作用 49 网关与过滤器区别 49 Nginx与Zuul的区别 49 Zuul网关 49 动态网关 53 网关集群 55 分布式配置中心SrpingCloud config 57 SpringCloud分布式配置中心 57 Config架构 58 Git环境搭建 58 服务端详解 58 Maven依赖信息 58 application.yml配置 59 项目启动 60 客户端详解 60 Maven依赖信息 60 bootstrap.yml 61 读取配置文件 62 动态刷新数据 62 actuator端点刷新数据 63 Maven依赖信息 63 Bootstrap.xml新增 63 include: "*" 63 生效前提 63 private String itmayieduInfo; 63 当配置更改时,标有@RefreshScope的Bean将得到特殊处理来生效配置 64 手动刷新接口 64 分布式服务跟踪SpringCloud sleuth 64 什么是Sleuth 64 环境搭建 64 构建server-zipkin 64 会员服务 65 订单服务 65 Swagger2API接口管理 65 课题引入 65 传统的API文档编写存在以下几个痛点: 66 Swagger具有以下优点 66 Swagg er 2.0 集成配置 66 Maven依赖信息 66 SwaggerConfig 68 Zull整合Swagger管理微服务所有API 68 会员和订单引入Maven依赖 68 ZuulGateway网关 69

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值