注册服务与发现 Eureka

概念:

springcloud主要实现分布式

就是多个项目之间互相远程调用 cloud是RPC框架

Eureka是注册中心,多个关联项目的管理中心,他们可以通过eureka关联在一起

首先我们要讲一个架构

笔记:

server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

``

服务器端口

server:
  port: 8761

``eureka实例

eureka:
  instance:
    hostname: localhost

eureka客户端配置:

  client:
    registerWithEureka: false   //是否向eureka注册中心注册自己(自己不需要注册自己,我们这里配置的就是Eureka注册中心)
    fetchRegistry: false        //该实例是否向eureka服务器获取所有的注册信息表
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ //配置eureka的服务地址

``然后在SpringBoot启动类上贴@EnableEurekaServer注解,表明这个项目启动的是一个eureka服务

启动服务器 访问localhost:8761 完成!

现在完成了以上这些操作,我们现在来了解一下整体的一个架构吧

服务发现分为三块

服务提供者,服务消费者,服务发现组件这三者之间的关系如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vXAIGLGX-1591669191450)(file:///D:/WizNoteData/temp/5f48938c-02d5-40de-9e6e-cef388c62c40/128/index_files/124be270-8961-4097-9379-f1fca38cbb63.png)]

各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息

服务消费者可从服务发现组件查询服务提供者的网络地址

(说人话:其实就是服务消费者和服务提供者使用这个服务发现组件来关联起来,从而获取对方的地址,来调用对方!!!);

服务消费者可从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口

(说人话:服务消费者从服务发现组件中找到提供者的地址,调用提供者对应的接口);

各个微服务与服务发现组件使用一定机制(例如心跳)通信. 服务发现组件若长时间无法与某微服务实例通信,就会注销该实例

(说人话:每过一段时间服务发现组件就会使用一定机制来判断此时使用其关联的项目是否可以正常通信,如果发现无法连接会注销该实例);

了解了基本架构,我们来了解一下Eureka的原理:

再此之前先了解一波Region和Availability Zone

Region和Availability Zone都是AWS的概念

Region指的是地域,Availability Zone是可用区

地域就是物理意义上的不同地方的机房

可用区就是同一个地域中的不同模块

可以这么理解:阿里云的杭州机房有可用区A 可用区B

但是它们可能在同一个机房也有可能是分布在杭州的两个机房,这就是可用区,不过这两个可用区的机器是可以通过内网ping通的!

本人简单画了一张图可以看看:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aQxcep4x-1591669191453)(file:///D:/WizNoteData/temp/5f48938c-02d5-40de-9e6e-cef388c62c40/128/index_files/11668319-0a42-4d65-94c4-045162d40909.png)]

微服务项目关联Eureka的配置

这块是定义我们项目的名称,也是在Eureka关联中的名称

spring:
  application:
    name: product-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    prefer-ip-address: true
server:
  port: 8081

分割记录:

spring:
  application:
    name: product-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka 这里配置的是要对接的Eureka地址
 
  instance:
    prefer-ip-address: true //这里表示将自己的IP用于指定注册到Eureka Server若不配置该属性或将其设置为false
系统会自动将所在主机的hostname直接作为默认值
server:
  port: 8081

写完这些配置后也一定要记得在其启动类上添加@EnableEurekaClient 在高版本中的SpringCloud只需添加相关依赖即可自动注册

若不想将服务注册到Eureka Server只需要设置spring.cloud.servie-reg-istry.auto-registration.enable=false

Eureka Server的高可用

在实际工作中 Eureka Server一般是不会单点使用的,要作到一台Eureka宕机服务器也能照常运行

也不能影响服务消费者和提供者之间的正常调用,通常在部署Eureka我们会使用集群Eureka Server

Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署

Eureka实例做到彼此间增量地同步信息,从而确保所有节点的数据是一致的.事实上节点之间相互注册是Eureka Server的默认行为

记得我们在前面配置Eureka的时候其中的两条配置分别是:

Eureka  
client:
    registerWithEureka: false   //是否向eureka注册中心注册自己(自己不需要注册自己,我们这里配置的就是Eureka注册中心)
    fetchRegistry: false  

其中registerWithEureka表示是否向Eureka中心注册自己

fetchRegistry表示是否向Eureka获取注册表

接下来再创建一个Eureka项目,进行实现高可用集群!

server:
  port: 8761
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8761/eureka/,http://${eureka.instance.hostname}:8762/eureka/
server:
  port: 8762
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:8761/eureka/,http://${eureka.instance.hostname}:8762/eureka/

``这分别是两个Eureka Server 交互的地址都是双方都有的,实现了交互功能,然后微服务要注册上来的时候也两个地址都填写即可!

Eureka Server实现用户认证

在上面的Eureka是存在一定缺陷的,比如我们可以直接访问它,现在我们要对它做用户认证

只有成功通过认证的用户才可以访问Eureka Server

本小节实现

步骤:

先导入依赖jar:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.2.1.RELEASE</version>
</dependency>

```然后在Eureka交互那块 ```

client:
  service-url:
    defaultZone: http://localhost:8761/eureka
改成 
    defaultZone: http://user:password@localhost:8761/eureka
这样就可以实现访问这个Eureka的时候要进行账号密码验证在高版本的security在密码上会自动进行加密,及时要关注控制台输出

Eureka Server的REST端点

Eureka Server的REST端点

基本的端点记录

地址/eureka/apps //访问eureka的全局信息

Eureka Server的自我保护模式

在自我保护上,最直观的便是你一个微服务关闭的时候,Eureka页面发出的警告(这意味着您进入了自我保护模式)

默认情况下,Eureka在一定时间内没有接收导某个微服务实例的心跳,Eureka Server将注销该实例,(默认时间90s)

但是当网络分区发生故障的时候,微服务与Eureka无法正常通信的情况下,以上行为就危险了,因为微服务本身是正常的,

但是因为无法通信而被Eureka注销掉了

在这一点上,Eureka通过自我保护模式来解决了这个问题,当Eureka在短时间内丢失过多客户端的时候(如果网络出现故障的话,节点一般是不止一个微服务无法通信的,一次性会造成很多微服务直接无法连通)所以Eureka在一次性丢失过多微服务的时候可以猜测是网络出现了故障,那么这个时候对应的微服务节点会进入自我保护模式,一旦进入这个模式,Eureka Server就会保存服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务),当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式

综上所述,自我保护模式是一种应对网络异常的安全保护措施,它的架构哲学是宁可保护所有微服务(不管这个微服务健康与否)

也不盲目的注销任何健康的微服务

其实说人话就是:不管这个微服务有没有挂掉,我们都保存他

在SpringCloud中自我保护机制默认是启动的 我们要关闭它的话可以在配置文件加这么一段话

eureka.server.enable-self-preservation = false //禁用自我保护模式

多网卡环境下的IP选择

对于多网卡的服务器,Eureka究竟如何指定呢?

例如某台服务器有eth0,eth1,eth2三张网卡

三张网卡都可以跟Eureka客户端关联,但是其中只有一张是可以跟其他项目进行关联的

SpringCloud提供了按需选择IP的能力,从而避免以上的问题,

第一步

spring.cloud.inetutils ignored-interfaces:-docker0 -veth.*

eureka.instance: prefer-ip-address=true这样就可以武略docker0网卡所有以veth开头的网卡了

第二步:

使用正则表达式指定使用的网络地址

spring.cloud.inetutils: preferredNetworks:- 192.168 -10.0

第三步:

只使用站点本地地址:

spring.cloud.inetutils: useOnlySiteLocalInterfaces: true

我们也可以通过手动指定IP地址

eureka.instance.prefer-ip-address: true && ip-address: 127.0.0.1

开启Eureka的健康检查:

eureka.client.healthcheck: enable: true //底层其实是继承了HealthCheckHandler接口

某些场景下,可能希望更细粒度的控制健康检查,此时可实现com.netflix.appinfo.HealthCheckHandler接口

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值