基于DNS搭建高可用Eureka注册中心

基于DNS搭建高可用Eureka注册中心,第1张

按Alt + 回车键,将会生成eureka-serverzip,解压缩后得到一个maven 项目,将该项目录入IDE。

我们首先来看一下pom文件,可以看出项目中引用了spring-cloud-starter-netflix-eureka-server, 并且springboot 的版本号为:212RELEASE, Spring Cloud的版本号为:GreenwichRC2RC2 表示还没有正式发布,只是第二个Release Candidate。
接下来我们只需要两个步骤,
a、修改EurekaServerApplication, 在@SpringBootApplication的注解上面,加入一个新的注解:@EnableEurekaServer
b、在resources 目录中加入applicationyml 文件, 并配置以下信息:

一个简单的Eureka 注册中心就已经可以使用了,我们运行一下这个spring boot 应用,找开浏览器:localhost:8761,即可看到我们的注册中心就已经运行启来了。并且EUREKA-SERVER也注册到自己的注册中心了。

单节点的注册中心已经搭建完毕,但单节点的注册中心存在单点故障的可能,不能用于生产环境。生产环境的Eureka一般采用集群方式进行部署。

通过clientserviceUrldefaultZone配置多个peer节点,因为是在单机上测试,所以修改了host文件,并且使用不同的端口号来启动注册中心。正式的生产环境请根据自己的实际情况进行配置,比如:第一台Eureka的IP地址为:1921680100,则defaultZone配置其他三台注册中心>一旦您拥有@EnableDiscoveryClient(或@EnableEurekaClient)的应用程序,您就可以使用它来从 Eureka服务器 发现服务实例。一种方法是使用本机comnetflixdiscoveryEurekaClient(而不是Spring云DiscoveryClient),例如

@Autowired

private EurekaClient discoveryClient;

public String serviceUrl() {

    InstanceInfo instance = discoveryClientgetNextServerFromEureka("STORES", false);

    return instancegetHomePageUrl();

}

提示不要使用@PostConstruct方法或@Scheduled方法(或ApplicationContext可能尚未启动的任何地方)EurekaClient。它被初始化为SmartLifecycle(带有phase=0),所以最早可以依靠它可用的是另一个具有更高阶段的SmartLifecycle。

本机Netflix EurekaClient的替代方案

您不必使用原始的NetflixEurekaClient,通常在某种包装器后面使用它更为方便。Spring Cloud支持 Feign (REST客户端构建器),还支持 SpringRestTemplate 使用逻辑Eureka服务标识符(VIP)而不是物理URL。要使用固定的物理服务器列表配置Ribbon,您可以将ribbonlistOfServers设置为逗号分隔的物理地址(或主机名)列表,其中是客户端的ID。

您还可以使用orgspringframeworkcloudclientdiscoveryDiscoveryClient,它为Netflix不具体的发现客户端提供简单的API,例如

@Autowired

private DiscoveryClient discoveryClient;

public String serviceUrl() {

    List list = discoveryClientgetInstances("STORES");

    if (list != null && listsize() > 0 ) {

        return listget(0)getUri();

    }

    return null;

}

为什么注册服务这么慢?

作为一个实例也包括定期心跳到注册表(通过客户端的serviceUrl),默认持续时间为30秒。在实例,服务器和客户端在其本地缓存中都具有相同的元数据(因此可能需要3个心跳)之前,客户端才能发现服务。您可以使用eurekainstanceleaseRenewalIntervalInSeconds更改期限,这将加快客户端连接到其他服务的过程。在生产中,最好坚持使用默认值,因为服务器内部有一些计算可以对租赁更新期进行假设。



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

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

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

1区服务1

eurekainstancemetadataMapzone = zone1

eurekaclientpreferSameZoneEureka = true

第2区的服务1

eurekainstancemetadataMapzone = zone2 

eurekaclientpreferSameZoneEureka = true 

applicationyml

eureka:

  client:

    healthcheck:

      enabled: true

警告eurekaclienthealthcheckenabled=true只能在applicationyml中设置。设置bootstrapyml中的值将导致不期望的副作用,例如在具有UNKNOWN状态的eureka中注册。

如果您需要更多的控制健康检查,您可以考虑实施自己的comnetflixappinfoHealthCheckHandler。

Eureka实例和客户端的元数据

值得花点时间了解Eureka元数据的工作原理,以便您可以在平台上使用它。有主机名,IP地址,端口号,状态页和运行状况检查等标准元数据。这些发布在服务注册表中,由客户使用,以直接的方式联系服务。额外的元数据可以添加到eurekainstancemetadataMap中的实例注册中,并且这将在远程客户端中可访问,但一般不会更改客户端的行为,除非意识到元数据的含义。下面描述了几个特殊情况,其中Spring Cloud已经为元数据映射指定了含义。

在Cloudfoundry上使用Eureka

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

applicationyml

eureka:

  instance:

    hostname: ${vcapapplicationuris[0]}

    nonSecurePort: 80

根据Cloudfoundry实例中安全规则的设置方式,您可以注册并使用主机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 = AmazonInfoBuildernewBuilder()autoBuild("eureka");

  bsetDataCenterInfo(info);

  return b;

}

更改Eureka实例ID

香草Netflix Eureka实例注册了与其主机名相同的ID(即每个主机只有一个服务)。Spring Cloud Eureka提供了一个明智的默认,如下所示:${springcloudclienthostname}:${springapplicationname}:${springapplicationinstance_id:${serverport}}}。例如myhost:myappname:8080。

使用Spring Cloud,您可以通过在eurekainstanceinstanceId中提供唯一的标识符来覆盖此。例如:

applicationyml

eureka:

  instance:

    instanceId: ${springapplicationname}:${vcapapplicationinstance_id:${springapplicationinstance_id:${randomvalue}}}

使用这个元数据和在localhost上部署的多个服务实例,随机值将在那里进行,以使实例是唯一的。在Cloudfoundry中,vcapapplicationinstance_id将在Spring Boot应用程序中自动填充,因此不需要随机值。

使用EurekaClient

一旦您拥有@EnableDiscoveryClient(或@EnableEurekaClient)的应用程序,您就可以使用它来从 Eureka服务器 发现服务实例。一种方法是使用本机comnetflixdiscoveryEurekaClient(而不是Spring云DiscoveryClient),例如

@Autowired

private EurekaClient discoveryClient;

public String serviceUrl() {

    InstanceInfo instance = discoveryClientgetNextServerFromEureka("STORES", false);

    return instancegetHomePageUrl();

}

提示不要使用@PostConstruct方法或@Scheduled方法(或ApplicationContext可能尚未启动的任何地方)EurekaClient。它被初始化为SmartLifecycle(带有phase=0),所以最早可以依靠它可用的是另一个具有更高阶段的SmartLifecycle。

本机Netflix EurekaClient的替代方案

您不必使用原始的NetflixEurekaClient,通常在某种包装器后面使用它更为方便。Spring Cloud支持 Feign (REST客户端构建器),还支持 SpringRestTemplate 使用逻辑Eureka服务标识符(VIP)而不是物理URL。要使用固定的物理服务器列表配置Ribbon,您可以将<client>ribbonlistOfServers设置为逗号分隔的物理地址(或主机名)列表,其中<client>是客户端的ID。

您还可以使用orgspringframeworkcloudclientdiscoveryDiscoveryClient,它为Netflix不具体的发现客户端提供简单的API,例如

@Autowired

private DiscoveryClient discoveryClient;

public String serviceUrl() {

    List<ServiceInstance> list = discoveryClientgetInstances("STORES");

    if (list != null && listsize() > 0 ) {

        return listget(0)getUri();

    }

    return null;

}

为了保护注册中心的服务安全,
避免恶意服务注册到Eureka,
需要对Eureka Server进行安全保护,
本文基于Spring Security方案,
为Eureka Server增加最简单的Basic安全认证。

修改pomxml,添加spring-boot-starter-security依赖:

修改applicationyml,配置用户名密码:

先只启动Eureka Server,
通过浏览器的URL访问注册中心,
>

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13434091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-05
下一篇 2023-08-05

发表评论

登录后才能评论

评论列表(0条)

保存