资讯专栏INFORMATION COLUMN

Spring Cloud 参考文档(服务发现:Eureka客户端)

awokezhou / 1412人阅读

摘要:这些发布在服务注册表中,客户端使用它们以直接的方式联系服务,可以将额外元数据添加到中的实例注册中,并且可以在远程客户端中访问此元数据。

服务发现:Eureka客户端

服务发现是基于微服务架构的关键原理之一,尝试手动配置每个客户端或某种形式的约定可能很难做到并且可能很脆弱,Eureka是Netflix Service Discovery服务器和客户端,服务器可以被配置和部署为高可用性,每个服务器将注册服务的状态复制到其他服务器。

如何包含Eureka客户端

要在项目中包含Eureka Client,请使用组ID为org.springframework.cloud和工件ID为spring-cloud-starter-netflix-eureka-client的启动器。

注册Eureka

当客户端向Eureka注册时,它会提供有关自身的元数据 — 例如主机、端口、健康指示器URL、主页和其他详细信息,Eureka从属于服务的每个实例接收心跳消息,如果心跳故障超过可配置的时间表,则通常会从注册表中删除该实例。

以下示例显示了最小的Eureka客户端应用程序:

@SpringBootApplication
@RestController
public class Application {

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

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

请注意,前面的示例显示了一个普通的Spring Boot应用程序,通过在类路径上使用spring-cloud-starter-netflix-eureka-client,你的应用程序会自动向Eureka Server注册,找到Eureka服务器需要进行配置,如以下示例所示:

application.yml

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

在前面的示例中,“defaultZone”是一个神奇的字符串回退值,它为任何不表示首选项的客户端提供服务URL(换句话说,它是一个有用的默认值)。

默认应用程序名称(即服务ID)、虚拟主机和非安全端口(取自Environment)分别是${spring.application.name}${spring.application.name}${server.port}

在类路径上使用spring-cloud-starter-netflix-eureka-client使应用程序成为Eureka“实例”(即,它自己注册)和“客户端”(它可以查询注册表以查找其他服务),实例行为由eureka.instance.*配置键驱动,但如果你确保应用程序具有spring.application.name的值(这是Eureka服务ID或VIP的默认值),则默认值很好。

有关可配置选项的更多详细信息,请参阅EurekaInstanceConfigBean和EurekaClientConfigBean。

要禁用Eureka Discovery Client,可以将eureka.client.enabled设置为false

使用Eureka Server进行身份验证

如果其中一个eureka.client.serviceUrl.defaultZone URL中嵌入了凭据,则会自动将HTTP基本身份验证添加到你的eureka客户端(curl样式,如下所示:http://user:password@localhost:8761/eureka)。对于更复杂的需求,你可以创建一个类型为DiscoveryClientOptionalArgs@Bean并将ClientFilter实例注入其中,所有这些都应用于从客户端到服务器的调用。

由于Eureka的限制,无法支持每个服务器基本身份验证凭据,因此仅使用找到的第一个集合。
状态页面和健康指示器

Eureka实例的状态页面和健康指示器分别默认为/info/health,它们是Spring Boot Actuator应用程序中有用端点的默认位置,如果使用非默认上下文路径或servlet路径(例如server.servletPath=/custom),则需要更改这些,即使对于Actuator应用程序也是如此,以下示例显示了两个设置的默认值:

application.yml

eureka:
  instance:
    statusPageUrlPath: ${server.servletPath}/info
    healthCheckUrlPath: ${server.servletPath}/health

这些链接显示在客户端使用的元数据中,并在某些情况下用于决定是否向你的应用程序发送请求,因此如果它们准确,则会很有帮助。

在Dalston中,还需要在更改管理上下文路径时设置状态和健康检查URL,从Edgware开始删除此要求。
注册安全应用程序

如果你的应用程序想通过HTTPS联系,你可以在EurekaInstanceConfig中设置两个标志:

eureka.instance.[nonSecurePortEnabled]=[false]

eureka.instance.[securePortEnabled]=[true]

这样做会使Eureka发布显示对安全通信明确偏好的实例信息,对于以这种方式配置的服务,Spring Cloud DiscoveryClient始终返回以https开头的URI,同样,当以这种方式配置服务时,Eureka(本机)实例信息具有安全的健康检查URL。

由于Eureka在内部工作的方式,它仍然会发布状态和主页的非安全URL,除非你也明确地覆盖这些URL,你可以使用占位符来配置eureka实例URL,如以下示例所示:

application.yml

eureka:
  instance:
    statusPageUrl: https://${eureka.hostname}/info
    healthCheckUrl: https://${eureka.hostname}/health
    homePageUrl: https://${eureka.hostname}/

请注意,${eureka.hostname}是一个原生占位符,仅在更高版本的Eureka中可用,你也可以使用Spring占位符实现相同的功能 — 例如,使用${eureka.instance.hostName}

如果你的应用程序在代理后面运行,并且SSL终止在代理中(例如,如果你在Cloud Foundry或其他平台中作为服务运行),然后,你需要确保代理“转发” headers被应用程序拦截和处理。如果嵌入在Spring Boot应用程序中的Tomcat容器具有针对X-Forwarded-* headers的显式配置,则会自动发生,应用程序呈现到自身的链接错误(错误的主机、端口或协议)表明你的配置错误。
Eureka的健康检查

默认情况下,Eureka使用客户端心跳来确定客户端是否已启动,除非另有说明,否则Discovery Client不会根据Spring Boot Actuator传播应用程序的当前健康检查状态,因此,在成功注册后,Eureka始终宣布应用程序处于“UP”状态,通过启用Eureka健康检查可以更改此行为,从而将应用程序状态传播到Eureka。因此,每个其他应用程序都不会向“UP”以外的状态下的应用程序发送流量,以下示例显示如何为客户端启用健康检查:

application.yml

eureka:
  client:
    healthcheck:
      enabled: true
eureka.client.healthcheck.enabled=true应该只在application.yml中设置,在bootstrap.yml中设置值会导致不良副作用,例如在Eureka中以UNKNOWN状态注册。

如果你需要更多控制健康检查,请考虑实现自己的com.netflix.appinfo.HealthCheckHandler

实例和客户端的Eureka元数据

值得花一些时间了解Eureka元数据的工作原理,因此你可以在平台中使用它,有用于信息的标准元数据,如主机名、IP地址、端口号、状态页和健康检查。这些发布在服务注册表中,客户端使用它们以直接的方式联系服务,可以将额外元数据添加到eureka.instance.metadataMap中的实例注册中,并且可以在远程客户端中访问此元数据。通常,除非客户端了解元数据的含义,否则额外元数据不会更改客户端的行为,本文稍后将介绍几种特殊情况,其中Spring Cloud已经为元数据映射赋予了意义。

在Cloud Foundry上使用Eureka

Cloud Foundry有一个全局路由器,因此同一个应用程序的所有实例都具有相同的主机名(具有类似架构的其他PaaS解决方案),这不一定是使用Eureka的障碍。但是,如果你使用路由器(建议甚至强制使用,具体取决于你的平台的设置方式),你需要明确设置主机名和端口号(安全或非安全),以便他们使用路由器。你可能还希望使用实例元数据,以便区分客户端上的实例(例如,在自定义负载均衡器中),默认情况下,eureka.instance.instanceIdvcap.application.instance_id,如以下示例所示:

application.yml

eureka:
  instance:
    hostname: ${vcap.application.uris[0]}
    nonSecurePort: 80

根据在Cloud Foundry实例中设置安全规则的方式,你可以注册并使用主机VM的IP地址进行直接服务到服务调用,Pivotal Web Services(PWS)尚未提供此功能。

在AWS上使用Eureka

如果计划将应用程序部署到AWS云,则必须将Eureka实例配置为支持AWS,你可以通过自定义EurekaInstanceConfigBean来执行此操作,如下所示:

@Bean
@Profile("!default")
public EurekaInstanceConfigBean eurekaInstanceConfig(InetUtils inetUtils) {
  EurekaInstanceConfigBean b = new EurekaInstanceConfigBean(inetUtils);
  AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka");
  b.setDataCenterInfo(info);
  return b;
}
更改Eureka实例ID

一个vanilla Netflix Eureka实例注册的ID等于其主机名(即每个主机只有一个服务),Spring Cloud Eureka提供合理的默认值,定义如下:

${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}}

一个例子是myhost:myappname:8080

通过使用Spring Cloud,你可以通过在eureka.instance.instanceId中提供唯一标识符来覆盖此值,如以下示例所示:

application.yml

eureka:
  instance:
    instanceId: ${spring.application.name}:${vcap.application.instance_id:${spring.application.instance_id:${random.value}}}

使用前面示例中显示的元数据和部署在localhost上的多个服务实例,将随机值插入其中以使实例唯一,在Cloud Foundry中,vcap.application.instance_id会自动填充在Spring Boot应用程序中,因此不需要随机值。

使用EurekaClient

一旦你拥有一个发现客户端的应用程序,就可以使用它从Eureka Server发现服务实例,一种方法是使用原生com.netflix.discovery.EurekaClient(而不是Spring Cloud DiscoveryClient),如以下示例所示:

@Autowired
private EurekaClient discoveryClient;

public String serviceUrl() {
    InstanceInfo instance = discoveryClient.getNextServerFromEureka("STORES", false);
    return instance.getHomePageUrl();
}
不要在@PostConstruct方法或@Scheduled方法中使用EurekaClient(或者可能尚未启动ApplicationContext的任何地方),它在SmartLifecycle中初始化(phase=0),因此最早可以依赖它的是另一个具有更高阶段的SmartLifecycle
没有Jersey的EurekaClient

默认情况下,EurekaClient使用Jersey进行HTTP通信,如果你希望避免来自Jersey的依赖项,则可以将其从依赖项中排除,Spring Cloud基于Spring RestTemplate自动配置传输客户端,以下示例显示Jersey被排除在外:


    org.springframework.cloud
    spring-cloud-starter-netflix-eureka-client
    
        
            com.sun.jersey
            jersey-client
        
        
            com.sun.jersey
            jersey-core
        
        
            com.sun.jersey.contribs
            jersey-apache-client4
        
    
原生Netflix EurekaClient的替代品

你无需使用原始Netflix EurekaClient,此外,在某种包装后面使用它通常更方便,Spring Cloud通过逻辑Eureka服务标识符(VIP)而不是物理URL支持Feign(REST客户端构建器)和Spring RestTemplate。要使用固定的物理服务器列表配置Ribbon,可以将.ribbon.listOfServers设置为以逗号分隔的物理地址(或主机名)列表,其中是客户端的ID。

你还可以使用org.springframework.cloud.client.discovery.DiscoveryClient,它为发现客户端提供简单的API(不特定于Netflix),如以下示例所示:

@Autowired
private DiscoveryClient discoveryClient;

public String serviceUrl() {
    List list = discoveryClient.getInstances("STORES");
    if (list != null && list.size() > 0 ) {
        return list.get(0).getUri();
    }
    return null;
}
为什么注册服务这么慢?

作为实例还涉及到注册表的定期心跳(通过客户端的serviceUrl),默认持续时间为30秒,在实例、服务器和客户端在其本地缓存中都具有相同的元数据之前,客户端无法发现服务(因此可能需要3个心跳)。你可以通过设置eureka.instance.leaseRenewalIntervalInSeconds来更改周期,将其设置为小于30的值会加快使客户端连接到其他服务的过程,在生产中,最好坚持使用默认值,因为服务器中的内部计算会对租约续期做出假设。

Zones

如果你已将Eureka客户端部署到多个区域,你可能希望这些客户端在尝试另一个区域中的服务之前使用同一区域内的服务,要进行此设置,你需要正确配置Eureka客户端。

首先,你需要确保将Eureka服务器部署到每个区域,并确保它们彼此对等,有关详细信息,请参阅有关Zones和Regions的部分。

接下来,你需要告诉Eureka你的服务所在的区域,你可以使用metadataMap属性执行此操作,例如,如果将service 1部署到zone 1zone 2,则需要在service 1中设置以下Eureka属性:

zone 1的service 1

eureka.instance.metadataMap.zone = zone1
eureka.client.preferSameZoneEureka = true

zone 2的service 1

eureka.instance.metadataMap.zone = zone2
eureka.client.preferSameZoneEureka = true
上一篇:Spring Cloud Config Client 下一篇:服务发现:Eureka Server

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74146.html

相关文章

  • Spring Cloud 参考文档服务发现Eureka Server)

    摘要:何时首选地址在某些情况下,最好公布服务的地址而不是主机名,将设置为,当应用程序向注册时,它使用其地址而不是其主机名。 服务发现:Eureka Server 本节介绍如何设置Eureka服务器。 如何包含Eureka服务器 要在项目中包含Eureka Server,请使用组ID为org.springframework.cloud和工件ID为spring-cloud-starter-net...

    BLUE 评论0 收藏0
  • Spring Cloud 参考文档Spring Cloud Config Client)

    摘要:应用程序可以立即利用或应用程序开发人员提供的其他外部属性源,它还提取了一些与变化事件相关的额外有用特性。标签也可以以逗号分隔列表的形式提供,在这种情况下,列表中的项目将逐个尝试,直到成功为止,在处理特性分支时,此行为非常有用。 Spring Cloud Config Client Spring Boot应用程序可以立即利用Spring Config Server(或应用程序开发人员提供...

    DevWiki 评论0 收藏0
  • SpringCloud核心教程 | 第三篇:服务注册与发现 Eureka

    摘要:下一篇介绍基于的服务注册与调用。服务提供者工程配置这里服务提供者是使用之前进阶教程第三篇整合连接池以及监控改造而来,这里一样的部分就不再重复说明,下面将说明新增的部分。 Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分...

    scq000 评论0 收藏0
  • Spring Cloud 参考文档户端负载均衡器:Ribbon)

    摘要:客户端负载均衡器是一个客户端负载均衡器,可以让你对和客户端的行为进行大量控制,已经使用了,因此,如果你使用,此部分也适用。 客户端负载均衡器:Ribbon Ribbon是一个客户端负载均衡器,可以让你对HTTP和TCP客户端的行为进行大量控制,Feign已经使用了Ribbon,因此,如果你使用@FeignClient,此部分也适用。 Ribbon中的一个核心概念是命名客户端,每个负载均...

    Songlcy 评论0 收藏0

发表评论

0条评论

awokezhou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<