Spring Cloud Eureka(客户端)

上次我们讲了Spring Cloud Eureka服务端,这次来说下客户端。客户端简单来说就是把服务注册到服务端

Eureka客户端

主要处理服务的注册和发现。客户端服务通过注册和参数配置的方式,嵌入在客户端应用程序的代码中。在应用程序启动时,Eureka客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期行的刷新服务状态。

服务注册

服务提供者在启动的时候会通过REST请求的方式将自己注册到Eureka Server上,同时带上自身服务的一些元数据信息。Eureka Server接收到这个Rest请求之后,将元数据信息存储在一个双层结构的Map中,其中第一层的key是服务名。第二层的key 是具体服务的实例名。

在服务注册时,需要确认一下eureka.client.register-with-eureka=true参数是否正确,该值默认为true。若设置为fasle将不会启动注册操作。一般Eureka Server才设置为falseEureka Client都设为true

服务同步

不同的服务提供者可以注册在不同的服务注册中心上,它们的信息被不同的服务注册中心维护。由于多个服务注册中心互相注册为服务,当服务提供者发送注册请求到一个服务注册中心时,它会将该请求转发给集群中相连的其他注册中心,从而实现服务注册中心之间的服务同步。通过服务同步,提供者的服务信息就可以通过集群中的任意一个服务注册中心获得。

创建并注册服务提供者

SpringCloudSpringBoot的版本在上一篇文章有,这里我就不多说了
在微服务项目中,在同一个项目中应该创建多个模块,每个模块对应不同的服务
引入Spring Cloud Eureka Client依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

开启Eureka客户端

只需要在启动类中加入@EnableEurekaClient注解

@SpringBootApplication
@EnableEurekaClient
public class SpringcloudEurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudEurekaClientApplication.class, args);
    }
}

在配置文件中加入Eureka Client相关配置
需要指定服务注册中心的地址

server:
  port: 8081
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9090/eureka

server.port指定服务的端口号
eureka.client.service-url.defaultZone指定注册中心的地址

获取服务

消费者服务启动时,会发送一个Rest请求给服务注册中心,来获取上面注册的服务清单。为了性能考虑,Eureka Server会维护一份只读的服务注册清单来返回给客户端,同时该缓存清单默认会每隔30秒更新一次。
eureka.client.registery-fetch-interval-seconds:从Eureka服务器端获取注册信息的间隔时间,单位:秒,默认是30秒(对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒)

eureka.client.eureka-server-connect-timeout-seconds:连接 Eureka Server 的超时时间,单位:秒,默认是5秒
eureka.client.eureka-server-read-timeout-seconds:读取 Eureka Server信息的超时时间,单位:秒,默认是8秒
eureka.client.filter-only-up-instances:获取实例时是否过滤,只保留UP状态的实例,默认为true
eureka.client.eureka-connection-idle-timeout-seconds:Eureka 服务端连接空闲关闭时间,单位:秒,默认是30秒
eureka.client.eureka-server-total-connections:从Eureka 客户端到所有Eureka服务端的连接总数,默认是200
eureka.client.eureka-server-total-connections-per-host:从Eureka客户端到每个Eureka服务主机的连接总数,默认是50

服务调用

服务消费者在获取服务清单后,通过服务名可以获取具体提供服务的实例名和该实例的元数据信息。因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例,在Ribbon中会默认采用轮询的方式进行调用,从而实现客户端的负载均衡。

服务下线

在系统运行过程中必然会面临关闭或重启服务的某个实例的情况,在服务关闭操作时,会触发一个服务下线的Rest服务请求给Eureka Server,告诉服务注册中心该服务下线了。服务端在接收到该请求后,将该服务状态置位下线(DOWN),并把该下线事件传播出去。

服务启动

一定要先启动Eureka Server再启动Eureka Client
不然会报com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server意思就是找不到服务端

注:在测试的时候没加web依赖同样是报找不到服务端,所以还是加上吧

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

成功启动之后,在浏览器输入http://localhost:9090/就可以进入服务注册中心,如果设了安全验证就需要用户密码,上一篇文章有说到

QQ截图20180615205232.png

在服务注册中心中可以看到服务中有一个名为unknown的应用服务,开放的端口是8081,证明我们的服务成功注册了

来改下应用名吧,unknown是默认名
只需要在配置文件中配置spring.application.name就可以了

spring:
  application:
    name: springcloud-eureka-client

下面重新启动下Eureka Client,刷新下服务注册中心页面

QQ截图20180615210040.png

可以看到名为springcloud-eureka-client的服务已经注册上去了,但是之前的unknown服务还没下线,所以报了上面红色的一段话
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

如果在Eureka Server的首页看到这段提示,则说明Eureka已经进入了保护模式,一般出现此模式时,服务返回错误。即如果真实的服务已经Down掉,但在注册中心界面服务却一直存在,且显示为UP状态。

产生原因:Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。

解决方法:

1.重新启动客户端和服务端(不推荐,如果太多服务的话会很麻烦)
2.关闭注册中心自我保护机制
Eureka Server配置文件中把eureka.server.enable-self-preservation设置为false

不过设置了之后只是看不到上面那段红色的提示,并且还多了一条新的提示THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.告诉我们自我保护机制被关闭了

当你再次进入服务注册中心时,可能还是有两个相同的服务,这个是正常的
因为默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。

在客户端的配置文件中加入

eureka:
  instance:
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2

lease-renewal-interval-in-seconds每间隔1s,向服务端发送一次心跳,证明服务依然”存活“
lease-expiration-duration-in-seconds 告诉服务端,如果我2s之内没有给服务端发心跳,就代表服务down掉了,将服务踢出掉

但是还是隔了几十秒才把down掉的服务移除,不知道是不是我网络问题

所以我觉得在注册服务时写好服务名,最好不改,改了也没多大问题,就是要等一会注册中心才会把down掉的服务移除,自我保护机制我是推荐不关闭的。

所以正常的是这样的


QQ截图20180615211119.png

官方对于自我保护机制的说明

自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。
自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,
此时会出现以下几种情况:
1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,
而不会像Zookeeper那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

关于开启Eureka客户端

上面我们使用的是@EnableEurekaClient注解
其实@EnableDiscoveryClient@EnableEurekaClient都是可以的
SpringCloud中发现服务有许多种实现(eureka、consul、zookeeper等等)。
@EnableDiscoveryClient基于spring-cloud-commons,
@EnableEurekaClient基于spring-cloud-netflix

如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient
如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容