Spring-Cloud系列 Eureka (一)

什么是Eureka?

  Eureka是一个服务发现组件。所谓的服务发现就是将服务的调用者和被调用者者,都注册到一个第三方应用上。调用者在调用服务时可以清楚的知道被调用服务的状态。如果大家用过ZooKeeper就能很好的理解服务发现的原理。Eureka也如ZooKepper一般由service和client两部分组成。


Eureka-Clients

添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Edgware.SR3</spring-cloud.version>
</properties>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Client端代码

@RestController  //Spring-Boot
@EnableEurekaClient //EurekaClient 
@SpringBootApplication
public class EurekaClientApplication {

    @RequestMapping("/")
    public String home() {
        return "Hello world";
    }

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

    我们在上述代码上用了@EnableEurekaClient这个注解,在Spring-Cloud除了这个注解还可以用@EnableDiscoveryClient。那么这两个注解有啥区别呢?@EnableEurekaClient表明这个是EurekaClient,@EnableDiscoveryClient则是标记一个服务发现客户端。这个可户端可以是ZK-Client,也可以EurekaClient

application配置

server:
</br>
  port: 8080
</br>
spring:
</br>
  application:
</br>
    name: eureka-client-one #建议小写,eureka默认注册节点是会将应用名称大写。
</br>
eureka:
</br>
  client:
</br>
    serviceUrl:
</br>
      defaultZone: http://localhost:8761/eureka

启动效果

查看启动结果

Eureka-Service

添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <spring-cloud.version>Dalston.SR5</spring-cloud.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

服务端代码

@EnableEurekaServer //EurekaServer
@SpringBootApplication
public class EurekaServiceApplication {

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

配置文件

server:


  port: 8761


eureka:


  instance:


  #实例主机名#


    hostname: localhost


  client:

    #是否需要多机拷贝#


    register-with-eureka: false


    fetch-registry: false

    #本机服务地址#

    service-url:


      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动后效果

启动效果

重要参数解释

重要参数解释

修改Instance-ID

    我们在看上面实例状态时,状态栏给出的默认Instance-ID信息不是特别直观,我们有什么方式可以改呢?

eureka:
</br>  instance:
</br>    #开启地址显示
</br>    prefer-ip-address: true
</br>    instanceId:${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
#此修改要在Eureka-Client上修改

</br>
    默认定义:


默认效果

</br>
    修改后效果:


修改后效果

Eureka开启安全验证和健康检查

安全验证

添加依赖

<!--添加在Eureka-Server-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

    注意!如果不添加依赖直接进行配置项目启动时不报错的。

配置文件

security:
</br>  #开启eureka权限控制
</br>  basic:
</br>    enabled: true
</br>  #设定访问用户和密码
</br>  user:
</br>    name: user
</br>    password: Pass123456
</br>#在Eureka-Server配置

注意!改完上述配置后Server和Client的下述配置都需要修改:

eureka:
</br>  client:
</br>    service-url:

</br>      #此种风格是CURL的配置模式
</br>      defaultZone: http://user:Pass123456@localhost:8761/eureka

配置效果

安全验证

健康检查配置

添加依赖

<!--添加在Eureka-Client-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

添加配置

eureka:
</br>  client:
</br>    healthcheck:
</br>      enabled: true

注意事项

    老版本的Spring-Cloud配置完以上的就可以,访问一些healthcheck的接口了。如果你访问/env等路路径出现:


权限问题

需要做以下配置:

management:
</br>  security:
</br>    enabled: false

配置效果

健康检查

其他相关配置

剔除过期等不健康实例(生产环境不建议使用)
</br>服务端:

  #关闭注册中心自我保护机制
</br>  eureka:
</br>    server:
</br>      enable-self-preservation:false
</br>  #注册中心清理间隔(单位毫秒,默认60*1000)
</br>  eureka:
</br>    server:
</br>      eviction-interval-timer-in-ms:10000

</br>客户端:

  #租期更新时间间隔(默认30秒)
</br>  eureka:
</br>    instance:
</br>      lease-renewal-interval-in-seconds=10
</br>  #租期到期时间(默认90秒)
</br>  eureka:
</br>    instance:
</br>      lease-expiration-duration-in-seconds=15

Eureka的自我保护模式

    如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式:

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.

    一般出现此模式时,服务返回错误。即如果真实的服务已经Down掉,但在注册中心界面服务却一直存在,且显示为UP状态。

产生原因

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

EurekaClient端代码获取实例信息

@Autowired
private EurekaClient discoveryClient;

public String serviceUrl() {
    InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES",  false);
    return instance.getHomePageUrl();
}

Netflix-EurekaClient端代码获取实例信息

@Autowired
private EurekaClient discoveryClient;

public String serviceUrl() {
    InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
    return instance.getHomePageUrl();
}

不要在@PostConstruct方法或@Scheduled方法中(或ApplicationContext可能尚未启动的任何地方)使用EurekaClient。

客户端常用配置,均以eureka.client为前缀####

<table>
<thead>
<tr>
<th>参数名</th>
<th>说明</th>
<th>默认值</th>
</tr>
</thead>
<tbody><tr>
<td>enabled</td>
<td>启用Eureka客户端</td>
<td>true</td>
</tr>
<tr>
<td>registryFetchIntervalSeconds</td>
<td>从Eureka服务端获取注册信息的间隔时间,单位为秒</td>
<td>30</td>
</tr>
<tr>
<td>instanceInfoReplicationIntervalSeconds</td>
<td>更新实例信息的变化到Eureka服务端的间隔时间,单位为秒</td>
<td>30</td>
</tr>
<tr>
<td>initialInstanceInfoReplicationIntervalSeconds</td>
<td>初始化实例信息到Eureka服务端的间隔时间,单位为秒</td>
<td>40</td>
</tr>
<tr>
<td>eurekaServiceUrlPollIntervalSeconds</td>
<td>轮询Eureka服务端地址更改的间隔时间,单位为秒。当我们与Spring CLoud Config整合,动态刷新Eureka的serviceURL地址时需要关注该参数</td>
<td>300</td>
</tr>
<tr>
<td>eurekaServerReadTimeoutSeconds</td>
<td>读取Eureka Server信息的超时时间,单位为秒</td>
<td>8</td>
</tr>
<tr>
<td>eurekaServerConnectTimeoutSeconds</td>
<td>链接Eureka Server的超时时间,单位为秒</td>
<td>5</td>
</tr>
<tr>
<td>eurekaServerTotalConnections</td>
<td>从Eureka客户端到所有Eureka服务端的连接总数</td>
<td>200</td>
</tr>
<tr>
<td>eurekaServerTotalConnectionsPerHost</td>
<td>从Eureka客户端到每个Eureka服务端主机的连接总数</td>
<td>50</td>
</tr>
<tr>
<td>eurekaConnectionIdleTimeoutSeconds</td>
<td>Eureka服务端连接的空闲关闭时间,单位为秒</td>
<td>30</td>
</tr>
<tr>
<td>heartbeatExecutorThreadPoolSize</td>
<td>心跳连接池的初始化线程数</td>
<td>2</td>
</tr>
<tr>
<td>heartbeatExecutorExponentialBackOffBound</td>
<td>心跳超时重试延迟时间的最大乘数值</td>
<td>10</td>
</tr>
<tr>
<td>cacheRefreshExecutorThreadPoolSize</td>
<td>缓存刷新线程池的初始化线程数</td>
<td>2</td>
</tr>
<tr>
<td>cacheRefreshExecutorExponentialBackOffBound</td>
<td>缓存刷新重试延迟时间的最大乘数值</td>
<td>10</td>
</tr>
<tr>
<td>useDnsForFetchingServiceUrls</td>
<td>使用DNS来获取Eureka服务端的serviceUrl</td>
<td>false</td>
</tr>
<tr>
<td>registerWithEureka</td>
<td>是否要将自身的实例信息注册到Eureka服务端 true</td>
<td></td>
</tr>
<tr>
<td>preferSameZoneEureka</td>
<td>是否偏好使用处于相同Zone的Eureka服务端 true</td>
<td></td>
</tr>
<tr>
<td>filterOnlyUpInstances</td>
<td>获取实例时是否过滤,仅保留UP状态的实例</td>
<td>true</td>
</tr>
<tr>
<td>fetchRegistry</td>
<td>是否从Eureka服务端获取注册信息</td>
<td>true</td>
</tr>
<tr>
<td>serviceUrl</td>
<td>指定注册中心</td>
<td>http://:@localhost:1111/eureka</td>
</tr>
</tbody></table>

    本文参考:Spring-Cloud-Eureka-DOC
springboot-actuator监控的401Eureka客户端服务端配置

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

推荐阅读更多精彩内容