深入解析:服务注册 / 服务发现 - Eureka
目录
背景
问题出现
解决:
注册中心
CAP 理论
注册中心
Eureka 介绍
搭建 Eureka Server
服务注册
服务发现
背景
问题出现
上篇中,我们借助 RestTemplate 接口实现远程调用的时候,URL 的写死的。
当更换机器,URL 就需要发生变更,随之而来的就是各个项目的配置文件也都需要发生变化。
解决:
通过微服务开发中,能够采用类似 114 查号台的执行。
当服务启动 / 变更的时候,向注册中心报道,注册中心记录应用和 IP 的关系。
调用方调用的时候,先去注册中心获取服务方的 IP,再去服务方进行调用。
注册中心
注册中心,用于维护一个列表,那个机器上线了,那个机器宕机,这些信息都会自动更新到服务列表上,客户端拿到该列表,直接进行服务调用即可。
注册中心主要有三种角色:
服务提供者(Server):一次业务中,提供给接口给其他微服务。
服务消费者(Client):一次业务中,调用其他微服务供应的接口。
服务注册中心(Registry):用于保存 Server的注册信息,当 Server 节点发生变化的时候,Resigtry 会同步进行变更。服务与注册中心使用一定的机制来进行通信。如果注册中心和某服务长时间无通信,就会注销该实例。
三者之间的关系与工作内容允许用两个概念解释:
服务注册:服务提供者在启动的时候,向 Resgitry 注册自身服务,并向 Resgistry 定期发送心跳,汇报存活状态。
服务发现:服务消费者从注册中心查询到服务提供者的信息,并通过该地址调用服务提供者的接口。
注意:服务提供者和服务消费者的定义是相对的。

CAP 理论
CAP 理论是分布式系统中最基础,也是最关键的理论。

C:一致性。CAP 理论中的一致性,指的是强一致性。所有节点在同一时间具有相同的材料。
A:可用性。保证每个请求都有响应。(响应结果可能错误)
P:分区容错性。当出现网络分区后,系统仍然能够对外提供服务。
一致性:
有如下数据库集群
数据库集群需要向客户端进行响应。
响应时机有如下两种:
1. 主库接收到请求,处理成功,此时材料并未完全同步到从库中。随着时间的推移,主库和从库的内容,最终会达到一个一致性。 ==》 此时为弱一致性
2. 主库接收到请求,并且所有从库数据同步成功成功。 ==》 强一致性
CAP 理论:一个分布式系统,不可能同时满足数据一致性,服务可用性,分区容错性这三个基本需求,最多只能同时满足两个。
在分布式系统中,系统之间的网络不可能 100% 健康,服务又必须对外保证。因此分区容错性不可避免,所有只能再在 C 和 A 中选择一个。也就是 CP 或者 AP 架构。


CP 架构:为了保证分布式系统对外的数据统一性,在第二位滑稽老铁读数据的时候,就不给他返回任何数据。
AP 架构:为例保证分布式系统的可用性,在第二位滑稽老铁读数据的时候,会给他返回 V0 版本的素材(即使这个数据已经错误了)
CAP 理论详情可参考文章:一文理解 CAP(大佬写的非常好~~~)
注册中心

Zookeeper 注册中心实现的是 CP,也就是保证数据一致性。
Eureka 注册中心实现的是 AP,也就是保证数据可用性。
Nacos 注册中心可用实现 AP 或 CP,默认完成 AP
在分布式环境中,即使拿到一个错误的资料,也胜过无法提供实例信息而造成请求失败要好(淘宝,京东实现的都是 AP 原则)
Eureka 介绍
Eureka 是 Netflix OSS 套件中关于服务注册和发现的解决方案。 SpringCloud 对 Eureka 进行了集成,并 作为优先推荐方案进行宣传,虽然目前 Eureka2.0 已经停止维护,新的微服务架构设计中,也不再建议运用,但是目前依然有大量公司的微服务框架使用 Eureka 作为注册中心。
Eureka 分为两部分:
Eureka Server:作为注册中心的服务端,为微服务应用提供服务注册,服务发现,健康检查等核心能力。
Eureka Client:作为服务提供者的客户端,当服务启动时,会主动向 Eureka Server 注册自身信息。Eureka Server 会存储这些信息,以供其他服务查询和调用。
搭建 Eureka Server
Eureka-server 是一个独立的微服务
创建一个 Eureka-server 自模块

引入 eureka-server 依赖

项目构建插件

完善启动类
Eureka-server 的启动类上面还要添加一个 @EnableEurekaServer 注解,开启 eureka 注册中心服务。

编写配置文件:

启动服务,访问注册中心:http://127.0.0.1:10010/
erueka-server 启动成功。
服务注册
接下来在 product-service 注册道 eureka-server 中
在 product-service 中的 pom 资料中,停入 eureka-client 依赖,注意这里是 eureka-client 依赖,而不是 server 依赖

完善配置文件,添加服务名称和 eureka 地址

此时先启动 eureka-server 的服务,再启动 product-service 服务,刷新,看到 product-service 已经注册到 eureka 上了
服务发现
接下来修改 order-service,在进行远程调用的时候,从 eureka-server 中拉取 product-service 的服务信息,完成服务发现。
同样的,在 order-service 中也需要引入 eureka-client 依赖,配备 eureka 地址


接下来就可以达成远程调用操作。
从 eureka-server 中获取到 product-service 的列表(注意,这里可能存在多个服务),从中选取一个进行调用

注意,DiscoveryClient 对象引入的时候,导入的包是接口:

此时启动服务,再刷新注册中心,发现 order-service 也注册到 eureka 上了

此时访问:http://127.0.0.1:8080/order/1
远程调用也成功了。
补充:Eureka 基于 AP 原则,保证可用性,Zookeeper 基于 CP 原则,保证数据一致性!
