微服务之SpringCloud实战:SpringCloud Eureka分区

Posted 程序猿王国

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务之SpringCloud实战:SpringCloud Eureka分区相关的知识,希望对你有一定的参考价值。




导言:

我们的系统用户量很大或者地区很广的情况下,一般我们会有多个机房,使用SpringCloud的情况下,我们的服务可能会被注册到不同的机房中,但是我们想要指定有先访问的机房,应该怎么操作呢?我们一起来探索一下!


region和zone

region字面意思是区域,我们可以理解为地理分区,比如北京大区、上海大区等等。

zone可以理解为具体的机房分区,比如说region有北京大区,北京大区下面有两个机房zone1和zone2.


上图所示:beijing大区下面有zone1和zone2两个分区,两个大区中分别注册了两个Eureka并分别有两个服务提供方Service。

当我们在zone1创建一个客户端作为服务消费者,这个客户端会优先调用zone1中的Service,如果zone1中的Service不可用时,会路由到zone2。大致原理就是这样,我们来看下具体怎么通过代码实现吧!


EurekaServer-1

#公共配置信息

server:

  port: 9901


spring:

  application:

    name: eureka-server-1

  profiles:  

    active: node1


eureka:

  instance:

    prefer-ip-address: true

    instance-id: ${spring.cloud.client.ipAddress}:${server.port} 

  server:

    enableSelfPreservation: true                #关闭保护机制,以确保注册中心可以将不可用的实例剔除.(注意:自我保护模式是一种应对网络异常的安全保护措施,使用自我保护模式,可以让Eureka集群更加的健壮、稳定)

    evictionIntervalTimerInMs: 5000            #eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒

  client:

    registerWithEureka: true

    fetchRegistry: true

prefer-same-zone-eureka: true
#地区
    region: beijing
availability-zones:
      beijing: zone-1,zone-2
service-url:
zone-1: http://localhost:9901/eureka/
zone-2: http://localhost:9902/eureka/

#用---分割不同的环境对应的配置信息(YML以"---"作为文档分割符,以"..."作为结束标志)

---

spring:

  profiles: node1

  

eureka:

  client:

    serviceUrl:

      defaultZone: http://10.200.159.22:${server.port:9902}/eureka/

...


 

EurekaServer-2

#公共配置信息

server:

  port: 9902


spring:

  application:

    name: eureka-server-2

  profiles:  

    active: node1


eureka:

  instance:

    prefer-ip-address: true

    instance-id: ${spring.cloud.client.ipAddress}:${server.port} 

  server:

    enableSelfPreservation: true                #关闭保护机制,以确保注册中心可以将不可用的实例剔除.(注意:自我保护模式是一种应对网络异常的安全保护措施,使用自我保护模式,可以让Eureka集群更加的健壮、稳定)

    evictionIntervalTimerInMs: 5000            #eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒

  client:

    registerWithEureka: true

    fetchRegistry: true

prefer-same-zone-eureka: true
#地区
    region: beijing
availability-zones:
      beijing: zone-2,zone-1
service-url:
zone-1: http://localhost:9901/eureka/
zone-2: http://localhost:9902/eureka/

#用---分割不同的环境对应的配置信息(YML以"---"作为文档分割符,以"..."作为结束标志)

---

spring:

  profiles: node1

  

eureka:

  client:

    serviceUrl:

      defaultZone: http://10.200.159.22:${server.port:9902}/eureka/

...


上述配置文件是Eureka-Server在不同分区中的配置,下面我们来创建服务提供方Service

@RestController
public class TestController {
@Value("${zone.name}")
private String zoneName;
@GetMapping(value = "/helloWorld")
public String hi() {
return zoneName;
}
}



service

#公共配置信息

server:

  port: 9911


spring:

  application:

    name: service-1

  profiles:  

    active: node1


eureka:

  instance:

    prefer-ip-address: true

    instance-id: ${spring.cloud.client.ipAddress}:${server.port} 

  server:

    enableSelfPreservation: true                #关闭保护机制,以确保注册中心可以将不可用的实例剔除.(注意:自我保护模式是一种应对网络异常的安全保护措施,使用自我保护模式,可以让Eureka集群更加的健壮、稳定)

    evictionIntervalTimerInMs: 5000            #eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒

metadata-map:

zone:zone-1

  client:

    registerWithEureka: true

    fetchRegistry: true

prefer-same-zone-eureka: true
#地区
    region: beijing
availability-zones:
      beijing: zone-1,zone-2
service-url:
zone-1: http://localhost:9901/eureka/
zone-2: http://localhost:9902/eureka/

#用---分割不同的环境对应的配置信息(YML以"---"作为文档分割符,以"..."作为结束标志)

---

spring:

  profiles: node1

  

eureka:

  client:

    serviceUrl:

      defaultZone: http://10.200.159.22:${server.port:9902}/eureka/

...


Service-2的配置与上述分区配置顺序调整即可!这里不做复制

 接下来创建服务消费者:

@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping(value="/consumer")
public String hi() {
return restTemplate
    .getForObject("http://service/helloWord", String.class);
}
}

消费方将配置指定到zone-1如下所述:

prefer-same-zone-eureka: true
#地区
    region: beijing
availability-zones:
      beijing: zone-1,zone-2
service-url:
zone-1: http://localhost:9901/eureka/
zone-2: http://localhost:9902/eureka/

编写完成,我们启动所有服务,测试如下Url

localhost:9913/consumer

此时发现无论怎么调用都是返回的zone-1,然后去关掉Service-1的服务,再次调用就会路由到zone-2!是不是很简单!


以上是关于微服务之SpringCloud实战:SpringCloud Eureka分区的主要内容,如果未能解决你的问题,请参考以下文章

微服务之SpringCloud实战:SpringCloud Eureka服务治理

微服务架构整理-(七SpringCloud实战之RestTemplate)

微服务架构整理-(七SpringCloud实战之RestTemplate)

微服务之SpringCloud实战:SpringCloud Eureka分区

微服务架构整理-(八SpringCloud实战之Hystrix [1])

微服务架构整理-(八SpringCloud实战之Hystrix [1])