在学习微服务的过程中,我们需要了解微服务的注册与发现,所以我们就需要用到Eureka来管理我们的微服务;
(1)首先,什么是Eureka?
Eureka,中文意思为“找到了!我发现了”,是Netflix开发的一个服务发现框架,本身是一个基于RestFul的服务,SpringCloud将其集成在其子项目Spring-cloud-netflix中以实现SpringCloud的服务发现能力;
(2)接下来我们通过一张图来了解微服务的整个运行机制:
从上图我们可以看到:服务提供者将自己注册到服务发现组件中,而服务消费者可以调用服务提供者,服务消费者与服务发现组件又通过“心跳”来维持二者之间的联系;
我们可以下结论为:
1、当微服务在启动时,会将自己的网络地址等信息注册到服务发现组件中,而服务发现组件来存储这些信息;而我们的Eureka server正充当了这一角色,它来为我们管理服务的发现与注册!
2、服务发现组件(即eureka server)里面有服务注册表能够存储下各个微服务(即eureka client)的端口以及网络号,故当一服务(eureka client A)要去访问Eureka client B就可以通过我们的euekaServer得到B的信息而进行访问
3、我们的服务发现组件(eureka server)会定时(一般认定为90s)检测注册到自己这里的微服务,若超时则会在服务注册表中移除该服务实例;
Eueka原理
1、以上我们已经说了eureka包含两个组件:分别是Eureka server和eureka client;
2、当各个微服务启动时,会向eurekaServer中注册自己的信息(包括IP、端口号、微服务名称);
3、微服务启动之后呢会定期的(默认30s)向注册中心发送心跳,表名自己还存活者;若超过90s未发送心跳则会在注册表中注销该实例
4、默认情况下,eureka Server也可以看作时eureka client,相互之间通过复制的方式来实现服务注册表中数据的同步;
5、Euraka client会缓存服务注册表中的信息,当Eureka server使所有节点都宕掉,我们eureka cliet依然能够通过缓存中的信息找到服务提供者并完成调用;
搭建单机版的注册中心
1、导入Eureka Server服务端依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-server
2、修改相应的application.yml配置文件
server:
port: 6001 # 服务端口
eureka:
instance:
hostname: localhost # eureka服务端的实例名称
client:
registerWithEureka: false # 服务注册,false表示不将自已注册到Eureka服务中
fetchRegistry: false # 服务发现,false表示自己不从Eureka服务中获取注册信息
serviceUrl: # Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自 己(如果不配置则默认本机8761端口)
defaultZone: http://
e
u
r
e
k
a
.
i
n
s
t
a
n
c
e
.
h
o
s
t
n
a
m
e
:
{eureka.instance.hostname}:
eureka.instance.hostname:{server.port}/eureka/
3、在主启动类上添加注解@EnableEurekaServer注解,表示其为一个服务注册中心;
注册服务到服务注册中心
1、添加eureka Client客户端的依赖
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
2、修改application.yml配置文件
eureka:
client:
registerWithEureka: true # 服务注册开关
fetchRegistry: true # 服务发现开关
serviceUrl: # 注册到哪一个Eureka Server服务注册中心,多个中间用逗号分隔
defaultZone: http://localhost:6001/eureka
注意:我们在这里可发现以上配置服务注册中心的application.yml
的时候为了防止把自己注册进去,registerWithEureka与fetchRegistry是关闭的状态;
3、在主启动类上加相应的注解@EnableEurekaClient
解决Eureka状态中含有主机名称的问题
eureka:
client:
registerWithEureka: true # 服务注册开关
fetchRegistry: true # 服务发现开关
serviceUrl: # 客户端(服务提供者)注册到哪一个Eureka Server服务注册中心,多个用逗号分隔
defaultZone: http://localhost:6001/eureka
instance:
instanceId:
s
p
r
i
n
g
.
a
p
p
l
i
c
a
t
i
o
n
.
n
a
m
e
:
{spring.application.name}:
spring.application.name:{server.port} # 指定实例ID,就不会显示主机名了
preferIpAddress: true #访问路径可以显示IP地址
搭建集群版的服务注册中心
为了避免Eureka server的失效,Eureka server高可用环境需要部署两个以上的注册中心,他们互相指向对方;若要是再本地启动两个Eureka需要注意两个的端口号需要设置成不一样;
特点:
(1)为了实现高可用,实际可部署至少两台注册中心服务器(Eureka sever)
(2) 两台Eureka server互相注册,当其中一台死掉也不会影响服务的注册与发现;
(3)微服务从注册中心获得服务地址通过RestFul方式发起远程调用;
(2)集群版注册中心配置大体上与单机版的注册中心相同,因为两个Eureka Server需要向对方注册,所以需要通过域名访问,故我们需要进行IP与域名进行绑定:
1、找到 C:\Windows\System32\drivers\etc 目录下的hosts文件
2、在进行yml配置的时候,注意都不应该把自己注册到Eureka服务中,那么如何来实现两台服务器互相注册呢?我们应该在pom文件的defaultZone给两台服务器写上互相的url;
3、这里我们需要修改服务客户端的pom文件,我们需要在配置文件pom中把服务提供者注册到两台Eureka server中,也就是在defaultZone那一栏写上两个地址;