一.什么是服务注册中心
所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册和服务发现,以及对服务健康状态的监控和管理功能。
- 可以对所有的微服务的信息进行存储,如微服务的名称、IP、端口等
- 可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用
- 可以对所有的微服务进行心跳检测,如发现某实例长时间无法访问,就会从服务注册表移除该实例。
二.常用服务注册中心
1. Eureka注册中心
#1. 简介
-
https://github.com/Netflix/eureka/wiki
- Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务。SpringCloud将它集成在其子项目spring-cloud-netflix中, 以实现SpringCloud的服务注册和发现功能。
-
Eureka包含两个组件:
Eureka Server
和
Eureka Client
。
Eureka Server 组件 : 服务注册中心组件 管理所有服务 支持所有服务注册。
Eureka Client 组件 : 分类服务 商品服务 订单服务(微服务)。
#2. 开发 Eureka Server
引入依赖
<!--引入 eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
编写配置文件
server:
port: 8761 #服务端口号
spring:
application:
name: EurekaServerApplicaiton #服务名称唯一标识
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka #eureka注册中心地址
开启Eureka Server,入口类加入注解
@SpringBootApplication
@EnableEurekaServer
public class Eurekaserver8761Application {
public static void main(String[] args) {
SpringApplication.run(Eurekaserver8761Application.class, args);
}
}
访问Eureka的服务注册页面
-
http://localhost:8761
虽然能看到管理界面为什么项目启动控制台报错?
-
出现上述问题原因: eureka组件包含 EurekaServer 和
EurekaClient。server是一个服务注册中心,用来接受客户端的注册。client的特性会让当前启动的服务把自己作为eureka的客户端进行服务中心的注册,当项目启动时服务注册中心还没有创建好,所以找
不到服务的客户端组件就直接报错了,当启动成功服务注册中心创建好了,日后client也能进行注册,就不再报错啦!
关闭Eureka自己注册自己
server:
port: 8761
spring:
application:
name: EurekaServerApplicaiton
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
register-with-eureka: false #不再将自己同时作为客户端进行注册
fetch-registry: false #关闭作为客户端时从eureka server获取服务信息
再次启动,当前应用就是一个单纯Eureka Server,控制器也不再报错
#3. 开发Eureka Client
创建项目并引入eureka client依赖
<!--引入eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
编写配置文件
server:
port: 8702
spring:
application:
name: EurekaClientApplication
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
开启eureka客户端加入注解
@SpringBootApplication
@EnableEurekaClient
public class Eurekaclient8888Application {
public static void main(String[] args) {
SpringApplication.run(Eurekaclient8888Application.class, args);
}
}
启动之前的8761的服务注册中心,在启动eureka客户端服务,查看eureka server的服务注册情况
#4. Eureka自我保护机制
服务频繁启动时 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.
自我保护机制
-
官网地址:
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集群更加的健壮、稳定的运行。
在eureka server端关闭自我保护机制
eureka.server.enable-self-preservation=false #关闭自我保护
eureka.server.eviction-interval-timer-in-ms=3000 #超时3s自动清除
微服务修改减短服务心跳的时间
eureka.instance.lease-expiration-duration-in-seconds=10 #用来修改eureka server默认接受心跳的最大时间 默认是90s
eureka.instance.lease-renewal-interval-in-seconds=5 #指定客户端多久向eureka server发送一次心跳 默认是30s
#5. Eureka停止更新
官方停止更新说明
-
https://github.com/Netflix/eureka/wiki
- 在1.x版本项目还是活跃的,但是在2.x版本中停止维护,出现问题后果自负!!!
2. Consul注册中心
#1. Consul简介
-
https://www.consul.io
- consul是一个可以提供服务发现,健康检查,多数据中心,Key/Value存储等功能的分布式服务框架,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,使用起来也较为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、Windows和Mac OS X);安装包仅包含一个可执行文件,方便部署。
#2. 下载安装(windows)
-
下载地址 :
https://www.consul.io/downloads
- 配置环境变量后运行 : consul agent -dev
-
访问consul的web服务端口,consul默认端口是8500 : http://localhost:8500
#3. 开发Consul客户端
创建项目并引入依赖
<!--引入consul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
编写配置文件
server:
port: 8705
spring:
application:
name: consul-client-aplication
cloud:
consul:
host: localhost #注册consul服务的主机
port: 8500 #注册consul服务的端口号
discovery:
register-health-check: true #开启consul服务的健康检查[推荐]
service-name: ${spring.application.name} #指定注册的服务名称 默认就是应用名
启动服务查看consul界面服务信息
开启consul健康监控
默认情况加consul监控健康是开启的,但是必须依赖健康监控依赖才能正确监控健康状态所以直接启动会显示错误,引入健康监控依赖之后服务正常。
<!-- 这个包是用做健康度监控的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
再次启动
3. 不同注册中心区别
#1 .Eureka特点
- Eureka中没有使用任何的数据强一致性算法保证不同集群间的Server的数据一致,仅通过数据拷贝的方式争取注册中心数据的最终一致性,虽然放弃数据强一致性但是换来了Server的可用性,降低了注册的代价,提高了集群运行的健壮性。
#2. Consul特点
- 基于Raft算法,Consul提供强一致性的注册中心服务,但是由于Leader节点承担了所有的处理工作,势必加大了注册和发现的代价,降低了服务的可用性。通过Gossip协议,Consul可以很好地监控Consul集群的运行,同时可以方便通知各类事件,如Leader选择发生、Server地址变更等。
#3. zookeeper特点
- 基于Zab协议,Zookeeper可以用于构建具备数据强一致性的服务注册与发现中心,而与此相对地牺牲了服务的可用性和提高了注册需要的时间。