Spring Cloud 教程 - Eureka Client


本文基于Spring Cloud Finchley.RELEASE 版本。

服务发现:Eureka clients

服务发现是微服务架构的一个关键原则。手动配置每一个客户端不仅非常复杂,同时也容易出错。Netflix 提供了Erueka作为服务发现的服务端和客户端。Srever端可配置,同时每个server可以互相注册做高可用部署。

如何使用Eureka Client

将groupId 为 org.springframework.cloud,artifactId 为spring-cloud-starter-netflix-eureka-client的依赖添加到项目中即可引入Eureka Client,具体版本号可以参考Spring Cloud Project

注册Eureka Client

客户端向Eureka注册的时候会提供一系列的元数据信息,例如:主机,端口,健康检查url,主页等。Eureka 接受每个服务发送的心跳信息,如果在某个配置的超时时间内未接收到心跳信息,实例会被从注册列表中移除。 例如如下的服务:

@SpringBootApplication@RestControllerpublic class Application {    @RequestMapping("/")    public String home() {        return "Hello world";
    }    public static void main(String[] args) {        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

当把spring-cloud-starter-netflix-eureka-client添加到classpath时,应用会自动的注册到Eureka Server中,只需要配置Eureka 服务器位置。

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

可以通过${spring.application.name},${server.port}配置注册的服务名和服务端口。 将spring-cloud-starter-netflix-eureka-client添加到classpath会使服务注册为一个Eureka的实例,即服务本身会向自己注册,同时也是一个从注册中心获取其他服务的客户端。如果想要关闭自我注册的服务可以设置eureka.client.enabled=false。 更多配置信息可以参考EurekaInstanceConfigBean和EurekaClientConfigBean。

通过Eureka Server授权

如果Eureka Server配置了http basic的授权信息,可以通过将授权信息添加到eureka.client.serviceUrl.defaultZone中设置授权信息,eureka.client.serviceUrl.defaultZone=http://user:password@localhost:8761/eureka

状态页和健康检查

Eureka实例默认的状态页和健康检查接口是/info/health,他们是Spring Boot Actuator默认的端点。如果不想采用默认的设置可以通过修改Servlet Path (server.servletPath=/custom) 或者管理路径(management.contextPath=/admin),yaml中配置

eureka:
  instance:
    statusPageUrlPath: ${management.server.servlet.context-path}/info
    healthCheckUrlPath: ${management.server.servlet.context-path}/health
注册一个安全的应用

如果应用需要通过HTTPS通信,可以设置:

  • eureka.instance.nonSecurePortEnabled=false
  • eureka.instance.securePortEnabled=true

通过设置这两个配置,可以让Eureka发布安全的通信,DiscoveryClient每次都会返回https开头的URI。同样的,如果服务这么设置,健康检查也会使用https。 由于Eureka工作在内网,所以仍然会发布非https的健康检查和状态端点,所以需要手工替换,例如:

eureka:
  instance:
    statusPageUrl: https://${eureka.hostname}/info
    healthCheckUrl: https://${eureka.hostname}/health
    homePageUrl: https://${eureka.hostname}/
健康检查

默认情况下,Eureka使用心跳判断一个服务是否可用。除非特别说明,否则服务发现客户端不会根据Spring Boot Actuator来发布健康检查。当成功注册服务的后,Eureka总是将应用标记为UP状态。可以通过如下配置修改:

eureka:
  client:
    healthcheck:
      enabled: true

注意这个配置只能配置在application.yml中,如果配置在bootstrap.yml可能会出现副作用,例如注册服务为UNKNOWN状态。

Eureka 元数据

标准的元数据信息包括,host,port,ip,状态页,健康检查。如果需要自定义元数据信息可以将其配置到eureka.instance.metadataMap中,这些元数据信息可以被其服务获取

修改Eureka 实例的ID

Spring Cloud Eureka 将如下${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}} 信息注册微Eureka 实例的ID。例如myhost:myappname:8080。 通过如下配置可以修改其实例ID

eureka:
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}
使用Eureka Client

通过EurekaClient可以获取服务发现的信息,例如:

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

注意,不要将EurekaClient应用在@PostConstruct或者@Scheduled的方法中或者其他ApplicationContext还未启动的方法中。

移出Jersey依赖

默认情况下,EurekaClient使用Jersey作为HTTP 通信工具,如果不希望依赖Jersey,可以通过将Jersey依赖移出。Spring Cloud默认会使用RestTempalte作为通信工具。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-client</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jersey</groupId>
            <artifactId>jersey-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.sun.jersey.contribs</groupId>
            <artifactId>jersey-apache-client4</artifactId>
        </exclusion>
    </exclusions>
</dependency>
为什么服务注册很慢

默认情况下,心跳时间为30秒。只有在,client,server,client 缓存同时可以用的情况下,才会判断一个实例可用。可以修改eureka.instance.leaseRenewalIntervalInSeconds参数修改心跳的时间。尽量不要修改这个参数。

原文发布于微信公众号 - 代码拾遗(gh_8f61e8bcb1b1)

原文发表时间:2018-08-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

Centos7下部署两套python版本并存环境的操作记录

需求说明: centos7.2系统的开发机器上已经自带了python2.7版本,但是开发的项目中用的是python3.5版本,为了保证Centos系统的正常运行...

2906
来自专栏乐百川的学习频道

Spring IO Platform 简介

Spring IO Platform框架简单来说就是一个版本号兼容系统,它将常用第三方类库的兼容的版本组织起来。只要我们在项目中引用了Spring IO Pla...

2259
来自专栏闻道于事

使用Spring Initializr创建项目

Spring initializr 是Spring 官方提供的一个很好的工具,可以用来用来创建一个Spring boot 的项目。可以选择使用Maven管理或者...

4155
来自专栏程序猿DD

Spring Cloud实战小贴士:健康检查

今天在博客的交流区收到一条不错的问题,拿出来给大家分享一下。具体问题如下: 因为项目里面用到了redis集群,但并不是用spring boot的配置方式,启动后...

24610
来自专栏栗霖积跬步之旅

关于打包后提示无法连接到mongodb的情况

昨天晚上要和前端联调。 打完jar包后发现无法连接到测试环境的数据库。 就很尴尬,最后发现问题在于mongodb的URI写错了: 正确的URI格式:mongod...

3765
来自专栏nummy

virtualenv和vittualenvwrapper的使用

virtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够:

893
来自专栏编程

Spring-Data-REST轻松搞定RESTfulAPI

背景 昨天同事问我有没有研究过 ,没有~但是看名字就大概知道是做什么的(命名的重要性),因为之前有了解过 ,过一会发过两个截图过来。真的很强大,感觉这个在使用...

2726
来自专栏程序猿DD

Spring Boot快速开发利器:Spring Boot CLI

Spring Boot CLI(Command Line Interface)是一个命令行工具,您可以用它来快速构建Spring原型应用。通过Spring Bo...

3737
来自专栏阿杜的世界

Spring Boot的自动配置、Command-line Runner

接下来关于SpringBoot的一系列文章和例子,都来自《Spring Boot Cookbook》这本书,本文的主要内容是start.spring.io的使用...

892
来自专栏加米谷大数据

Flume的高可靠,高性能和高扩展性

Flume 是Apache旗下的一款开源、高可靠、高扩展、容易管理、支持客户扩展的数据采集系统。 Flume使用JRuby来构建,所以依赖Java运行环境。

1032

扫码关注云+社区

领取腾讯云代金券