什么服务注册中心

所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。

image-20200709124952525.png

  1. # 1.服务注册中心
  2. - 可以对所有的微服务的信息进行存储,如微服务的名称、IP、端口等
  3. - 可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用
  4. - 可以对所有的微服务进行心跳检测,如发现某实例长时间无法访问,就会从服务注册表移除该实例。

常用的注册中心

springcloud支持的多种注册中心Eureka、Consul、Zookeeper、以及阿里巴巴推出Nacos。这些注册中心在本质上都是用来管理服务的注册和发现以及服务状态的检查的。

1.Eureka

# 0.简介
- https://github.com/Netflix/eureka/wiki
- Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务。SpringCloud将它集成在其子项目spring-cloud-netflix中,        以实现SpringCloud的服务注册和发现功能。
    Eureka包含两个组件:Eureka Server和Eureka Client。

开发Eureka Server
# 1.创建项目并引入eureka server依赖
<!--引入 eureka server-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

image-20200709160918779.png

# 2.编写配置application.properties
server.port=8761                                                                            #执行服务端口
spring.application.name=eurekaserver                                     #指定服务名称 唯一标识
eureka.client.service-url.defaultZone=http://localhost:8761/eureka  #指定服务注册中心的地址
# 3.开启Eureka Server,入口类加入注解
@SpringBootApplication
@EnableEurekaServer
public class Eurekaserver8761Application {
    public static void main(String[] args) {
        SpringApplication.run(Eurekaserver8761Application.class, args);
    }
}

image-20200709162043210.png

# 4.访问Eureka的服务注册页面
- http://localhost:8761/eureka

image-20200709161916871.png

# 5.虽然能看到管理界面为什么项目启动控制台报错?

image-20200709162307608.png

- 出现上述问题原因:eureka组件包含 eurekaserver 和 eurekaclient。server是一个服务注册中心,用来接受客户端的注册。client的特性会让当前启动的服务把自己作为eureka的客户端进行服务中心的注册,当项目启动时服务注册中心还没有创建好,所以找我不到服务的客户端组件就直接报错了,当启动成功服务注册中心创建好了,日后client也能进行注册,就不再报错啦!
# 6.关闭Eureka自己注册自己
server.port=8761
spring.application.name=eurekaserver
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
eureka.client.register-with-eureka=false    #不再将自己同时作为客户端进行注册  
eureka.client.fetch-registry=false                  #关闭作为客户端时从eureka server获取服务信息

image-20200709163511121.png

# 7.再次启动,当前应用就是一个单纯Eureka Server,控制器也不再报错

image-20200709163630273.png

开发Eureka Client
# 1.创建项目并引入eureka client依赖
<!--引入eureka client-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

image-20200709164110003.png

# 2.编写配置application.properties
server.port=8888                                                                        #服务端口号
spring.application.name=eurekaclient8888                        #服务名称唯一标识
eureka.client.service-url.defaultZone=http://localhost:8761/eureka #eureka注册中心地址

image-20200709164404396.png

# 3.开启eureka客户端加入注解
@SpringBootApplication
@EnableEurekaClient
public class Eurekaclient8888Application {
    public static void main(String[] args) {
        SpringApplication.run(Eurekaclient8888Application.class, args);
    }
}

image-20200709164505482.png

# 4.启动之前的8761的服务注册中心,在启动eureka客户端服务

image-20200709164622017.png

# 5.查看eureka server的服务注册情况

image-20200709164729870.png

eureka自我保护机制
# 0.服务频繁启动时 EurekaServer出现错误
- EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

image-20200709171532408.png

# 1.自我保护机制
- 官网地址: https://github.com/Netflix/eureka/wiki/Server-Self-Preservation-Mode
- 默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。这种设计的哲学原理就是"宁可信其有不可信其无!"。自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

# 2.在eureka server端关闭自我保护机制
eureka.server.enable-self-preservation=false  #关闭自我保护
eureka.server.eviction-interval-timer-in-ms=3000 #超时3s自动清除

image-20200709231727148.png

# 3.微服务修改减短服务心跳的时间
eureka.instance.lease-expiration-duration-in-seconds=10 #用来修改eureka server默认接受心跳的最大时间 默认是90s
eureka.instance.lease-renewal-interval-in-seconds=5     #指定客户端多久向eureka server发送一次心跳 默认是30s
# 4.尽管如此关闭自我保护机制还是会出现警告
- THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
- `官方并不建议在生产情况下关闭

image-20200709232933894.png

eureka 停止更新
# 1.官方停止更新说明
- https://github.com/Netflix/eureka/wiki
- 在1.x版本项目还是活跃的,但是在2.x版本中停止维护,出现问题后果自负!!!

image-20200709233215860.png

2.Consul

# 0.consul 简介
- https://www.consul.io
- consul是一个可以提供服务发现,健康检查,多数据中心,Key/Value存储等功能的分布式服务框架,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,使用起来也较为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、Windows和Mac OS X);安装包仅包含一个可执行文件,方便部署。

安装consul
# 1.下载consul
- https://www.consul.io/downloads

image-20200710103539186.png

image-20200710104357091.png

# 2.安装consul
- 官方安装视频地址: https://learn.hashicorp.com/consul/getting-started/install.html
- 1.解压之后发现consul只有一个脚本文件

image-20200710105007805.png

# 3.根据解压缩目录配置环境变量
- 根据安装目录进行环境变量配置 [这里是macos和linux系统配置]

image-20200710105305439.png

# 4.查看consul环境变量是否配置成功,执行命令出现如下信息代表成功
- consul -v

image-20200710105449741.png

# 5.启动consul服务
- consul agent -dev

image-20200710105654356.png

# 6.访问consul的web服务端口
- http://localhost:8500
    `consul默认服务端口是8500

image-20200710105912943.png

开发consul 客户端即微服务
# 1.创建项目并引入consul客户端依赖
 <!--引入consul依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
# 2.编写properties配置
server:
  port: 8081

spring:
  application:
    name: CONSUL-CLIENT

  cloud:
    consul:
      host: localhost        #注册consul服务的主机
      port: 8500                #注册consul服务的端口号
      discovery:
        service-name: ${spring.application.name}    #指定注册的服务名称 默认就是应用名
# 3.启动服务查看consul界面服务信息

image-20200713135359150.png

consul 开启健康监控检查
# 1.开启consul健康监控
- 默认情况consul监控健康是开启的,但是必须依赖健康监控依赖才能正确监控健康状态所以直接启动会显示错误,引入健康监控依赖之后服务正常
<!-- 这个包是用做健康度监控的-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

image-20200713140146813.png

consul 关闭健康监控检查
server:
  port: 8081

spring:
  application:
    name: CONSUL-CLIENT

  cloud:
    consul:
      host: localhost        #注册consul服务的主机
      port: 8500                #注册consul服务的端口号
      discovery:
        service-name: ${spring.application.name}    #指定注册的服务名称 默认就是应用名
        register-health-check: false #关闭consu了服务的健康检查[不推荐]

image-20200710121728014.png

不同注册中心区别

# 1.CAP定理
- CAP定理:CAP定理又称CAP原则,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
    `一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
    `可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
    `分区容忍性(P),就是高可用性,一个节点崩了,并不影响其它的节点(100个节点,挂了几个,不影响服务,越多机器越好)

# 2.Eureka特点
- Eureka中没有使用任何的数据强一致性算法保证不同集群间的Server的数据一致,仅通过数据拷贝的方式争取注册中心数据的最终一致性,虽然放弃数据强一致性但是换来了Server的可用性,降低了注册的代价,提高了集群运行的健壮性。

# 3.Consul特点
- 基于Raft算法,Consul提供强一致性的注册中心服务,但是由于Leader节点承担了所有的处理工作,势必加大了注册和发现的代价,降低了服务的可用性。通过Gossip协议,Consul可以很好地监控Consul集群的运行,同时可以方便通知各类事件,如Leader选择发生、Server地址变更等。

# 4.zookeeper特点
- 基于Zab协议,Zookeeper可以用于构建具备数据强一致性的服务注册与发现中心,而与此相对地牺牲了服务的可用性和提高了注册需要的时间。

image-20200710135837525.png