文章目录
一,注册中心概述
1.1 注册中心解决了什么问题?
微服务是不同的服务分布在不同的主机上,服务跟服务之间可能存在调用关系,那么之前我们可能是通过硬编码写死服务地址的方式来调用其他服务,这样对于后期服务的新增,服务的重新部署都有很朵不便利的地方,所以注册中心解决的就是这样一个问题
1.2 微服务的注册中心
注册中心是微服务架构中的通讯录,记录了服务和服务地址的映射关系,在分布式架构中,服务都会注册到这里,当服务需要调用其他服务时,就通过注册中心寻找服务地址,当新增一个服务时,也会将服务地址注册到注册中心
简单调用过程:
所以注册中心的一大作用就是提供服务的注册和服务的发现,新增进来的服务在启动后将自己的服务地址注册到注册中心,服务调用者在调用服务时,发现自身服务地址缓存不存在需要的服务时就会向注册中心去通过服务名获取所有的服务地址并且缓存,获取了服务地址后就请求指定地址。
其实说到底,注册中心就是一个服务名和服务地址相关联的中心
服务的实例都必须注册到注册中心
1.3 常见的注册中心
- zookeeper
- Eureka
- Consul
- Nacos
二,Eureka
2.1 Eureka基本组成
- Eureka注册中心
- 提供服务注册和服务发现
- 服务提供者
- 服务提供方,将自身服务的元数据注册到Eureka注册中心,供其他服务发现
- 服务发现者
- 服务消费者,从注册中心获取到服务提供者的地址,发起远程调用
2.2 Eureka服务治理机制
服务提供者:
- 服务注册:
- 启动的时候会发送rest请求将自身服务的元数据信息注册到注册中心上(元数据信息包括服务名,服务地址等)
- 服务续约:
- 注册好的服务通过心跳,每30s一次发给注册中心,来告诉注册中心,服务还存活着。
- 服务下线:
- 当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server, 告诉服务注册中心剔除自己的信息
服务消费者:
- 获得服务:服务消费者从注册中心中拉取服务清单,然后在发起远程调用
服务注册中心:
- 失效剔除:默认每隔一段时间(默认为60秒) 将当前清单中超时(默认为90秒)没有续约的服务剔除出去。
- 自我保护机制:EurekaServer 在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%(通常由于网络不稳定导致)。 Eureka Server会将当前的实例注册信息保护起来, 让这些实例不会过期,尽可能保护这些注册信息。
整体流程:
- eureka注册中心先启动
- eureka客户端后启动
- eureka客户端会将自身信息注册到eureka服务端
- 在进行服务调用时,eureka客户端会通过服务别名的方式去eureka服务端(注册中心)获取真实的服务调用地址
- 获取到地址后,eureka会将地址缓存在自身JVM缓存中(30s更新一次),并且通过httpclient去请求远程服务
2.3 搭建Eureka server
pom.xml
pom文件中导入eureka-server的依赖
<!-- eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
配置文件
server:
port: 7777
spring:
application:
name: eureka_server_7777
eureka:
instance:
hostname: localhost
client:
fetch-registry: false # false表示自己就是注册中心
register-with-eureka: false # false表示不向服务注册中心注册自己
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动类声明为Eureka服务中心
@SpringBootApplication
@EnableEurekaServer //
public class EurekaServer7777 {
public static void main(String[] args) {
SpringApplication.run(EurekaServer7777.class,args);
}
}
查看网页端图形管理界面
2.4 搭建Eureka client
引入依赖
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置文件修改
server:
port: 8102
spring:
application:
name: order8102
eureka:
client:
register-with-eureka: true # 向注册中心注册自己
fetch-registry: true # true表示自己不是注册中心
service-url:
defaultZone: http://localhost:7777/eureka/ # eureka服务端地址
启动类修改
@SpringBootApplication
@EnableEurekaClient //声明自己是eureka客户端
public class Order8102 {
public static void main(String[] args) {
SpringApplication.run(Order8102.class,args);
}
}
启动后查看图形管理界面
2.5 注册中心集群部署
上面搭建的其实是单机版的注册中心,单机版会存在一个高可用的问题,如果注册中心挂了,就形成了单点故障,从而导致整体的服务注册和服务发现不可用,造成整个系统的瘫痪
那解决方法就是搭建eureka服务端的集群,实现负载均衡和故障容错
集群搭建
eureka集群搭建的原理就是利用eureka无论是客户端还是服务端都会在启动时默认注册自己,成为一个服务,所以eureka server也是一个客户端,集群配置了多个eureka server 让他们相互注册,当服务提供者其中一个eureka server注册时,该eureka server就有拥有了该服务提供者的信息,也会将这个信息共享到其他的eureka server上。那么当其中一个eureka server挂掉之后,客户端会根据配置的service url去寻找下一个eureka server
配置地址映射,修改host文件
127.0.0.1 eureka7777.com
127.0.0.1 eureka7778.com
127.0.0.1 eureka7779.com
修改yaml,互相注册
server:
port: 7779
spring:
application:
name: eureka7779
eureka:
instance:
hostname: eureka7779.com
client:
fetch-registry: false # false表示自己就是注册中心
register-with-eureka: false # false表示不向服务注册中心注册自己
service-url:
defaultZone: http://eureka7777.com:7777/eureka/,http://eureka7778.com:7778/eureka/
到此服务端集群搭建完毕
客户端进入集群
修改下service url即可,配置上所有eureka server的地址
server:
port: 8101
spring:
application:
name: payment8101
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka7777.com:7777/eureka/, http://eureka7778.com:7778/eureka/, http://eureka7779.com:7779/eureka/
2.6 Eureka自我保护机制
自我保护机制主要是针对心跳包在出现网络分区的情况下大部分失败的情景,一旦进入保护模式,eureka server将会尝试保护其服务注册表中的信息,不在删除服务注册表中的数据。
出现这段话就是开启了自我保护机制