微服务之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。大致原理就是这样,我们来看下具体怎么通过代码实现吧!
#公共配置信息
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/
...
#公共配置信息
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;
}
}
#公共配置信息
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分区