当前位置: 首页>后端>正文

Eureka注册中心入门

一、为什么要使用注册中心

  • 单体架构时代

    对于外部依赖的服务,我们一般都是把配置参数和接口放在配置文件中,需要的时候读取配置文件即可。但是如果服务方发生变更,那么所有引用这些服务的应用都需要更改,代价极大。

  • SOA架构时代

    服务被拆分为多个实例,这种情况下,一般有两种方式:

    • 要么在客户端配置多个实例的地址,由客户端自己去负载均衡地访问这些IP;但是缺点也很明显,还是存在服务实例更改时,需要调用方去更改配置,而且客户端调用方要自己实现负载均衡,代价较大,同时也暴露了服务方的细节给外部,不符合封装的设计原则;
    • 服务方提供统一的域名给外部,调用方客户端只要维护域名配置即可,后续服务方实例变更时,自己更改映射关系即可,如此客户端就不用修改配置或者实现负载了。
  • 微服务架构时代

    随着容器化的部署方式流行,服务实例的IP并不是固定的,那么就会出现服务方需要频繁改动域名和IP的映射关系,因此需要想办法将这个步骤自动化。注册中心作为独立组件便由此应运而生。

二、简单入门示例

Eureka分为服务端和客户端,我们先来一个入门例子,直观地感受它。

2.1 服务端

从start.spring.io上创建并下载一个工程,需要web组件、Eureka Server组件 ,名称为eureka-server,实例图如下:

Eureka注册中心入门,第1张
一键生成Eureka服务端工程

然后在配置文件application.properties中增加如下的服务端配置信息:

server.port=8761

eureka.instance.hostname=127.0.0.1
# 是否使用IP地址注册,否则instance-id显示主机名称
eureka.instance.prefer-ip-address=true
# 定制instance-id显示的名称为IP地址+端口
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
# defaultZone 设置eureka服务器所在的地址,查询服务和注册服务都需要依赖这个地址
eureka.client.service-url.defaultZone= http://${eureka.instance.hostname}:${server.port}/eureka/
# registerWithEureka表示是否注册自身到eureka服务器,当前这个应用就是eureka服务器,没必要注册自身,否则启动报错
eureka.client.registerWithEureka=false
# fetchRegistry表示是否从eureka服务器获取注册信息, 同上
eureka.client.fetchRegistry=false

修改启动类,增加@EnableEurekaServer注解。

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

启动服务端,无异常,访问localhost:8761就可以看到控制台了。

Eureka注册中心入门,第2张
Eureka服务端控制台

2.2 客户端

客户端和服务端也是类似的,不过需要的组件从Eureka Server改为Eureka Client。

Eureka注册中心入门,第3张
一键生成Eureka客户端工程

然后在配置文件application.properties中增加如下的客户端配置信息:

server.port=8088

# 当前应用名称
spring.application.name=eureka-client
# eureka注册中心地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

修改启动类,增加@EnableEurekaClient注解(不加该注解也可以成功注册到Eureka服务端,因为只要引入client依赖,就默认开启了这个注解)。

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

启动客户端,无异常,访问localhost:8761就可以看到控制台上的注册实例就多了一个。

Eureka注册中心入门,第4张
Eureka服务端控制台2

到这,我们就完成了一个Eureka服务端和客户端的入门实例了。

三、工作原理浅析

3.1 服务端

  • 服务注册,提供接口供服务实例调用来注册服务信息;
  • 服务查询,提供接口供服务实例调用来获取服务注册表信息;
  • 服务剔除,当超过一定阈值时间没有收到某个服务的心跳续约,就会将该服务实例剔除;
  • 服务下线,接收到客户端回调后,对服务实例下线;
  • 自我保护,当超过一定阈值比例的服务实例都没有心跳时,不会再剔除服务实例信息,直至恢复心跳后再退出保护机制,如此保护服务端的注册信息。

3.2 客户端

  • 服务注册,调用服务端注册自己的服务实例;
  • 服务查询,调用服务端获取可用的服务实例注册表,并更新到自己的本地注册表缓存中;
  • 服务续约,和服务端保持心跳,证明自己仍然可用;
  • 服务下线,下线时通过回调服务端告知自己下线;
  • 服务缓存,当服务端不可用的时候,可先使用客户端缓存下来的注册表信息;
  • 失败重试,当访问某个服务端失败后,会重试请求其它服务端;
  • 负载均衡,乱序随机访问所有服务端中的一个;使用Ribbon访问服务实例;
  • 远程调用,配合Ribbon和Fein对远程服务进行请求访问;

四、集群搭建

集群的搭建网上有很多现成的教程,此处就不赘述了,可以参考:

eureka集群快速搭建

需要注意的要点就是:

  • 如果是本机实验,那么不同服务端的hostname一定要不同;
  • 不同服务端的defauleZone配置也是不同的;

五、集群工作原理

  • CAP理论中,Eureka认为AP优于CP,无法保证所有服务节点中注册信息的强一致性,但是高可用;
  • 区别于master/slave架构,eureka集群所有节点都是peer to peer架构,所有节点都可以对外提供读写能力;
  • 集群节点之间相互注册,互相守望,实现高可用;

https://www.xamrdz.com/backend/37g1933338.html

相关文章: