问题:系统会根据业务被拆分成了很多的微服务,微服务的信息如何管理?
Spring Cloud
中提供服务注册中心来管理微服务信息。
为什么要用注册中心?
1.
微服务数量众多,要进行远程调用就需要知道服务端的
ip
地址和端口,注册中心帮助我们管理这些服务的ip
和端口。
2.
微服务会实时上报自己的状态,注册中心统一管理这些微服务的状态,将存在问题的服务踢出服务列表,客户端获取到可用的服务进行调用。
Eureka
介绍
Spring Cloud Eureka
是对
Netflix
公司的
Eureka
的二次封装,它实现了服务治理的功能,
Spring Cloud Eureka 提供
Eureka Server
服务端与
Eureka Client
客户端 ,服务端即是
Eureka
服务注册中心,客户端完成微服务向Eureka
服务的注册与发现。
客户端同时也具备一个内置的使用轮询
(round-robin)
负载算法的负载均衡器。在微服务启动后,将会向 Eureka Server发送心跳
(
默认周期为
30
秒
)
。如果
Eureka Server
在多个心跳周期内没有接收到某个节点的心跳,EurekaServer
将会从服务注册表中把这个服务节点移除(默认
90
秒)
下图显示了
Eureka Server
与
Eureka Client
的关系
1. Eureka Server
是服务端,负责管理各个微服务注册和发现。
2.
在微服务上添加
Eureka Client
代码,就会访问到
Eureka Server
将此微服务注册在
Eureka Server
中,从而使服务消费方能够找到。
3.
微服务(服务消费者)需要调用另一个微服务(服务提供者)时,从
Eureka Server
中获取服务调用地址,进行远程调用。
搭建单机版
Eureka Server
服务注册中心
创建
microservice-cloud-05-eureka-6001
工程
配置
pom.xml
文件
配置
application.yml
文件
在
src/main/resources
下新建
application.yml
文件,配置如下:
创建主启动类
在启动类上添加
@EnableEurekaServer
注解,表示它是一个
Eureka Server
服务注册中心
功能测试
启动:
microservice-cloud-05-eureka-6001
访问:
http://localhost:6001/
,效果如下:
服务注册到
Eureka Server
服务注册中心
说明:
将服务提供者(
microservice-cloud-03-provider-product-8001
)注册到
Eureka Server
注册中心(
microservice_cloud-05-eureka-6001)
下面对
microservice-cloud-03-provider-product-8001
模块做对应的修改
配置
pom.xml
文件
完整配置
配置
application.yml
文件
完整配置
修改主启动类
在启动类上添加
@EnableEurekaClient
注解,表示它是一个
Eureka
的客户端,本服务启动后会自动注册进 Eureka Sever服务列表中
功能测试
先要启动
Eureka Server
:
microservice-cloud-05-eureka-6001
再启动
Eureka Client
:
microservice-cloud-03-provider-product-8001
访问:
http://localhost:6001/
商品提供者已经注册进
Eureka Server
中
微服务注册信息完善
指定实例
ID
问题:当前 状态中 含有主机名称
解决:修改
microservice-cloud-03-provider-product-8001
的
application.yml
文件
访问路径显示
IP
地址
问题:鼠标放在 实例
ID
上,显示的还是主机名,而不是显示
IP
地址
解决:修改
microservice-cloud-03-provider-product-8001
的
application.yml
文件
Eureka Server
自我保护机制
自我保护现象
如长时间没有访问、检测不到心跳,或者修改实例名称,
eureka
启动自我保护机制
下图红色提示信息:表示已启动了自我保护机制
在某时刻某一个微服务不可用了,
Eureka
不会立刻删除,依旧会对该微服务的信息进行保存
什么是自我保护机制
当
Eureka Server
在一定时间内(默认
90
秒)没有接收到某个微服务的心跳,
Eureka Server
会从服务列表将此服务实例注销。但是如果出现网络异常情况(微服务本身是正常的),微服务与Eureka Server
之间无法正常通信,以上行为可能变得非常危险了——
因为微服务本身其实是正常的,此时本不应该注销这个微服务。
Eureka Server
有一种
“
自我保护模式
”
来解决这个问题
——
当
Eureka Server
在短时间内丢失过多客户端时(可能发生了网络故障),此时Eureka Server
会进入自保护模式,一旦进入该模式,
Eureka Server
就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。当网络故障恢复后,该Eureka Server
会 自动退出自我保护模式。
所以, 自我保护模式是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的微服务和不健康的微服务都会保留),也不盲目注销任何健康的微服务。使用自我保护模式,可以让Eureka
集群更加的健壮、稳定。
自我保护配置
在开发阶段建议禁用自我保护模式,默认开启了
在
eureka server
中配置:
(microservice-cloud-05-eureka-6001)
搭建集群版
Eureka Server
服务注册中心
为了避免
Eureka Server
的失效,
Eureka Server
高可用环境需要部署两个及以上
Eureka Server
,它们互相向对方
注册。如果在本机启动两个
Eureka
需要 注意两个
Eureka Server
的端口要设置不一样,如下图:
1
、在实际使用时
Eureka Server
至少部署两台服务器,实现高可用。
2
、两台
Eureka Server
互相注册。
3
、微服务需要连接两台
Eureka Server
注册,当其中一台
Eureka
死掉也不会影响服务的注册与发现。
4
、微服务会定时向
Eureka Server
发送心跳,报告自己的状态。
5
、微服务从注册中心获取服务地址以
RESTful
方式发起远程调用
创建两个
Eureka Server
模块
创建
microservice
-
cloud
-
05
-
eureka
-
6002
,与
microservice
-
cloud
-
05
-
eureka
-
6001
创建方式类似
配置
pom.xml
将
6001
中的
pom.xml
依赖复制到
6002
模块中
主启动类
将
6001
中的主启动类 复制到
6002
模块中,并将类名重命名。
IP
与域名绑定
找到
C:\Windows\System32\drivers\etc
目录下的
hosts
文件
IP
与域名绑定进
hosts
文件
Eureka Server
组成高可用,两个
Eureka Server
互相向对方注册,这里需要通过域名访问,这里我们设置两个
Eureka Server
的域名分别为
eureka6001.com
、
eureka6002.com
。
配置
2
台
Eureka Server
服务端的
yml
文件
6001
服务端模块的
application.yml
6002 服务端模块 的
application.yml ,
注意修改端口号 6002
将服务提供者 注册到
2
台
Eureka Server
集群中
修改 microservice-cloud-03-provider-product-8001
中的
application.yml
文件,图示:
完整配置:
效果测试
1.
先启动
2
个
Eureka Server
集群
(6001
、
6002)
2.
访问:
http://eureka6001.com:6001/
http://eureka6002.com:6002/
再启动 服务提供者
microservice-cloud-03-provider-product-8001
当前架构效果:服务提供者 8001 已注册进 Eureka 集群中