暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

02 Spring Cloud 注册中心Eureka​

含江君 2020-12-14
252

02 Spring Cloud 注册中心Eureka

含江君www.jiatp.cn

个人一手博客,欢迎访问

1 前言

传统单体应用中,所有的业务都集中到一个项目中,当用户从浏览器发起请求时,直接由前端发送给后端,后端调用业务逻辑然后给前端给出响应,完成一次调用,整个调用过程就是一条直线,不需要服务之间的的中转,因而没必要引入注册中心。


随着项目的不断增大会进行系统的拆分,如一个电商项目可以拆分为订单模块、物流模块、支付模块、cms模块。

当用户发起请求时就需要各个模块之间协同合作不可避免,每个服务之间也进行调用,这时我们的架构也会发生相应该改变。


在这里大家可以看到,模块之间的调用,变得越来越复杂,而且模块之间还存在强耦合,如A要调用B,那就要些B的地址,意味B的部署位置要固定,如果B进行进群化部署那么A也要发生改变。


2 Eureka基本

Eureka是Netflix提供的服务注册中心,Eureka基于REST服务的注册与发现,Eureka是SpringCloud是核心组件之一,SpringCloud封装了Eureka,在Eureka基础上优化了配置,提供了可见的页面,可以方便查看到服务的注册情况和服务注册中心集群的运行情况。

  • 理解服务治理:

Springcloud封装了Netflix的开发的Eureka模块来实现服务治理,在传统的Rpc远程调用框架中,管理每个服务与服务之间的关系比较复杂,所以使用服务治理服务之间依赖关系,可以实现服务调用、负载均衡、容错等、实现服务注册与发现。

  • 理解服务注册与发现:

       Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来 实现服务注册和发现。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。SpringCloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。

Eureka分为两部分:

1、Eureka Server提供服务注册服务 ,各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到

2、EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)



3 Eureka单机搭建

Eureka本身是Java开发,Springcloud使用SpringBoot技术对Eureka进行封装,只需要引入依赖spring-cloud-starter-netflix-eureka-server就可以成功启动Eureka。

创建springboot项目,创建添加Eureka依赖


项目创建成功之后在启动类添加注解@EnableEurekaServer

接下来在application.properties配置基本信息,然后启动服务。

# 给当前服务起一个名字
spring.application.name=eureka-demo

#设置端口
server.port=1111

#默认Eureka也是i个微服务,当它是一个注册中心时候,有两层身份 1、注册中心 2、普通服务 当前服务会把自己服务注册
# fasle 表示不注册自己
eureka.client.register-with-eureka=false

# 表示是否从注册中心获取服务
eureka.client.fetch-registry=false
127.0.0.1 eureka-a  eureka-b
# 给当前服务起一个名字
spring.application.name=eureka-01

#设置端口
server.port=1111

#eureka 服务端的实例名称
eureka.instance.hostname=eureka-01

#默认Eureka也是i个微服务,当它是一个注册中心时候,有两层身份 1、注册中心 2、普通服务 当前服务会把自己服务注册
# fasle 表示不注册自己
eureka.client.register-with-eureka=true

# 表示是否从注册中心获取服务
eureka.client.fetch-registry=true

# A服务要注册到B B服务注册到A上
eureka.client.service-url.defaultZone=http://eureka-b:1112/eureka

# 给当前服务起一个名字
spring.application.name=eureka-02

#设置端口
server.port=1112

#eureka 服务端的实例名称
eureka.instance.hostname=eureka-02

#默认Eureka也是i个微服务,当它是一个注册中心时候,有两层身份 1、注册中心 2、普通服务 当前服务会把自己服务注册
# fasle 表示不注册自己
eureka.client.register-with-eureka=true

# 表示是否从注册中心获取服务
eureka.client.fetch-registry=true

# 相互守望 守望相助
eureka.client.service-url.defaultZone=http://eureka-a:1111/eureka
eureka.instance.lease-expiration-duration-in-seconds=90  #服务的实效时间
eureka.instance.lease-renewal-interval-in-seconds=30 #服务续约时间 默认30s
# 表示是否从注册中心获取服务
eureka.client.fetch-registry=true
eureka.client.registry-fetch-interval-seconds=30
  • region:地理上的不同区域

  • zone:具体的机房

Eureka分区:

在Eureka Server集群中,如果有一个节点宕机,EurekaClient会自动切换到新的Eureka Server。每一个Eureka Server节点都会进行互相同步数据。Eureka Server的连接方式可以是单线的,就是A-》B-〉C,此时A的数据也会和C进行同步。一般不建议这种写法,在我们配置serviceUrl时可以指定多个注册地址,即A可以注册到B,也可以注册到C。

在这个集群中,Eureka Server之间通过Replicate进行数据同步,不同的Eureka Server之间不区分主从节点,所有节点都是平等的。节点之间通过serviceUrl来互相注册,形成一个集群。进而提高节点的可用性

我们可以直接看Eureka的架构图

5.4 Eureka 集群原理


一个是Eureka Server上缓存的服务注册信息,定期更新的时间间隔,默认30s

一个是是否获取注册中心信息

这里有两个属性:

Eureka Client从Eureka Server上获取服务的注册信息,并且缓存到本地,本地客户端,在需要调用远程服务时,会从该信息中查找远程服务所对应的IP地址,端口等信息。Eureka Client上缓存的服务注册信息会定期更新(30s)如果Eureka Server返回的注册列表信息与本地缓存信息不相同,Eureka Client会自动处理。

5.2.4 获取注册表信息


当Eureka Client下线时,他会主动发送一条消息,告诉Eureka Server我下线了。

5.2.3 服务下线


服务续约两个重要属性:一般不建议修改

Eureka Client注册到Eureka Server上之后,事情没有结束,刚开始而已。注册成功默认情况,Eureka Client每隔30s向Eureka Server发送一条心跳消息来告诉Eureka Server我还在运行。如果Eureka Server连续90s(连续三次没发送)都没有收到Eureka Client消息,它会认为Eureka CLient已经掉线,会将掉线的Eureka Client当前的注册列表中去除。

5.2.2 服务续约


服务提供者江自己注册到注册中心,注意,所谓的服务提供者,只是一个业务上的划分,本质上它是一个Eureka Client。当Eureka CLient注册向Eureka Server需要提供一些自身的元数据信息,例如端、iP、名称、运行状态

5.2.1 服务注册


Eureka Client简化每一个微服务和Eureka Server之间的交互。Eureka client会自动拉取、更新以及缓存EurekaServer中的信息。这样即使Eureka Server所有节点都宕机,EurekaClient依然能够获取到想要调用服务的地址(地址有可能不准确)

5.2 Eureka Client

  • 服务注册,所有的服务都注册到Eureka server上面;

  • 提供注册表,注册表就是注册上来的一个服务列表,Eureka Client在调用服务时,需要获取,一般会缓存下来,如果缓存失效,则获取最新的注册表;

  • 同步状态:Eureka Client 通过注册、心跳等机制,和Eureka Server同步当前客户端的状态;


主要提供三个功能:

5.1 Eureka Server

Eureka分为两大部分:Eureka Server和Eureka Client。

5 Eureka工作细节


http://localhost:1111/

浏览器输入http://localhost:1112/

启动eureka-01、eureka-02启动时会报错,因为启动会检查eureka-02 因为我们还未启动,当两个注册中心正常启动之后则无报错。

Eureka-01:application.proterties


Eureka-01:application.proterties

Eureka集群就是启动多个Eureka,多个Eureka可以互相注册 互相同步数据,共同组成一个Eureka集群。同理我们创建Eureka-02服务参考之前创建方法


搭建集群环境则需要修改电脑的host是文件,可根据自己本子进行修改如下

准备工作:

使用了注册中心之后,所有服务都要通过服务注册中心进行信息交换。注册中心的是否稳定运行则非常重要,一旦服务中心掉线,会影响到整个系统的稳定性,所以在实际开发中Eureka中一般都是以集群方式运行。

4 Eureka集群搭建


项目启动浏览器输入http://localhost:1111/ 看到如下页面

如果启动遇到异常java.lang.TypeNotPresentException:type.javax.xml.bind.JAXBContent not present异常。因为jdk9移除了JAXB这个时候只要手动引入即可。


文章转载自含江君,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论