Spring Cloud之Eureka

微服务

介绍
微服务是一种新型的服务架构风格,微服务架构是一种将单应用程序作为一套小型服务开发的方法,每种应用程序都在其自己的进程中运行,并与轻量级机制(通常是HTTP资源的API)进行通信。这些服务是围绕业务功能构建的,可以通过全自动部署机制进行独立部署。这些服务的集中化管理已经是最少的,它们可以用不同的编程语言编写,并使用不同的数据存储技术。
spring cloud和dubbo的对比

  1. spring cloud,它的通信是基于http的Rest API。从命名我们就可以知道,它是Spring Source的产物,Spring社区的强大背书可以说是Java企业界最有影响力的组织了,除了Spring Source之外,还有Pivotal和Netfix是其强大的后盾与技术输出。其中Netflix开源的整套微服务架构套件是Spring Cloud的核心。
  2. dubbo是阿里巴巴服务化治理的核心框架,它的通信是基于rpc的,并被广泛应用于阿里巴巴集团的各成员站点。但是dubbo在2012年就停止更新,虽然在2017年又重新拾起这个业务,但是我个人认为dubbo的很多功能还是没有springcloud强的,spring cloud才是真正的一站式架构风格。

在这里插入图片描述
结构
Spring FrameWork是一个轻量级的Java开发的框架,是为企业开发而生成的,把代码的控制权都控制在外部容器中。spring boot是把spring框架的复杂配置进行了简化,然而spring boot就是一个一个的服务,spring cloud就是把spring boot作为服务进行简化构建分布式应用架构。
在这里插入图片描述

注册服务Eureka
由上面那个图我们可以看到spring cloud有多个子项目,可以做多件事情,服务注册,服务网关,断路由等操作,既然是分布式服务架构,那么一定要进行的就是服务注册功能。spring cloud用的服务注册就是Eureka,那我们就先来了解Eureka。

  1. Eureka是一种服务发现机制,分为注册中心EurekaServer和服务注册 EurekaClient,还有Eureka的高可用。
  2. 首先创建一个spring boot项目,添加EurekaServer依赖
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述3,@EnableEurekaServer,在server端的启动类上应该加上这个。然后在application.yml中加上这样的配置。
    这是service-url的源码,这是一个以HashMap存储的url。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8763/eureka/
    #自动注册功能
    register-with-eureka: false
    fetch-registry: false
#  自我保护机制
  server:
    enable-self-preservation: false
#应用进行命名,显示更清晰
spring:
  application:
    name: eureka

在这里插入图片描述【System Status】
Environment : 环境,默认为test, 该参数在实际使用过程中,可以不用更改
Data center : 数据中心,使用的是默认的是 “MyOwn”
Current time:当前的系统时间
Uptime : 已经运行了多少时间
Lease expiration enabled :是否启用租约过期 , 自我保护机制关闭时,该值默认是true, 自我保护机制开启之后为false。
Renews threshold : 每分钟最少续约数
Renews (last min) : 最后一分钟的续约数量(不含当前,1分钟更新一次)

自我保护机制

自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制。

该模式下,eureka会保护注册表中的信息,不在注销任何微服务,当网络故障恢复后,eureka会自动退出保护模式。自我保护模式可以让集群更加健壮。

但是我们在开发测试阶段,需要频繁地重启发布,如果触发了保护机制,则旧的服务实例没有被删除,这时请求有可能跑到旧的实例中,而该实例已经关闭了,这就导致请求错误,影响开发测试。所以,在开发测试阶段,我们可以把自我保护模式关闭,只需在eureka server配置文件中加上如下配置即可:eureka.server.enable-self-preservation=false
但在生产环境,不会频繁重启,所以,一定要把自我保护机制打开,否则网络一旦终端,就无法恢复。
自动注册功能
每一个EurekaServer也是一个client,当我们启动这个server的时候client会自动注册。

register-with-eureka: false
fetch-registry: false

客户端
我们使用一样的方法创建一个client,在选择以来的时候应该选择在这里插入图片描述然后在启动类上加上@EnableDiscoveryClient,注意版本要和server端一致。
application.properties上加上这个,连接服务注册端的。
在这里插入图片描述
在pom文件中需要加上下列代码,不然会出现无法启动的错误。

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

常见问题
1,为什么服务下线了,Eureka Server 接口返回的信息还会存在。
Eureka Server 并不是强一致的,因此 registry 中会存留过期的实例信息,这里头有几个原因:
应用实例异常挂掉,没能在挂掉之前告知 Eureka Server 要下线掉该服务实例信息。这个就需要依赖 Eureka Server 的 EvictionTask 去剔除。
解决办法:可以调整 EvictionTask 的调度频率,比如下面配置将调度间隔从默认的 60 秒,调整为 5 秒:

eureka: server:
	Eureka server
		eviction-interval-timer-in-ms: 5000

应用实例下线时有告知 Eureka Server 下线,但是由于 Eureka Server 的 REST API 有 response cache,因此需要等待缓存过期才能更新。
解决办法:可以根据情况考虑关闭 readOnlyCacheMap:

eureka:
  server:
    # 此处不开启缓存
    use-read-only-response-cache: false

Eureka Server 由于开启并引入了 SELF PRESERVATION 模式,导致 registry 的信息不会因为过期而被剔除掉,直到退出 SELF PRESERVATION 模式。
解决办法:可以关闭自我保护模式
2,为什么服务上线了,Eureka Client 不能及时获取到。
针对新服务上线,Eureka Client 获取不及时的问题,在测试环境,可以适当提高 Client 端拉取 Server 注册信息的频率,例如下面将默认的30秒改为5秒:

eureka:
  client:
    registry-fetch-interval-seconds: 5

Eureka高可用

最少两台EurekaServer的情况下才能做成分布式的情况,下面我们就用两台进行关联。
在这里插入图片描述我们用这两个Eureka进行互相注册,如果不进行互相注册的话,那么就没必要做分布式了,因为这个client关联注册到一个Eureka中,那么另一个Eureka什么都没有,就像是单体的一样。所以我们对这两个Eureka互相注册,这样这两个Eureka都可以获取到client信息。如果有一台机器挂掉的话,那么就转移到另一台。这就是高可用。只有不是全部挂掉都可以,client就可以使用。
把Eureka端口号改一下
在这里插入图片描述在这里插入图片描述客户端的话需要两个都写上,如果只写8761的话,那么8761挂掉,这个服务不会转移到8762。service-url是用map存储的,所以可以写多个。

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

在没有进行服务注册的时候在这里插入图片描述服务注册之后
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值