spring-cloud之注册中心eureka

在传统的应用架构里,一般通过nginx的反向代理来对外暴露后端服务,来支持负载均衡、高可用。用过的人都懂,一旦部署的后端服务更换了服务器或者端口,都需要我们修改nginx的配置。当然在传统的应用架构里边,这个无可厚非,毕竟服务数量不多,而且变动不频繁。但是来到了微服务架构后,可能就涉及到几十个以上的服务了。每个服务都需要进行类似的配置方式,这样不便于管理、而且容易出错。
spring-cloud中提供了eureka注册中心,为我们解决了以上的问题。服务提供者只需要在启动时,将自身的信息注册到eureka中,eureka会返回注册到其上的服务列表,并维持心跳;当服务有变动时,通过事件通知机制告知客户端(即注册到eureka上的服务)刷新服务列表。这样我们就可以借助eureka来取缔nginx,而且无需维护反向代理的配置。

使用eureka集群

由于eureka没有后端存储,所有服务数据都处于内存中。因此在生产环境中,需要使用eureka集群。一般有三个节点,两两互相注册,互相同步服务数据,以此保证高可用。

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
```yaml
---
spring:
profiles: peer1
application:
name: eureka-server
server:
port: 8761
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer2:8761/eureka/,http://peer3:8761/eureka/
instance:
prefer-ip-address: true # 以ip地址注册,默认为主机名
---
spring:
profiles: peer2
application:
name: eureka-server
server:
port: 8762
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer2:8761/eureka/,http://peer3:8761/eureka/
instance:
prefer-ip-address: true # 以ip地址注册,默认为主机名
---
spring:
profiles: peer3
application:
name: eureka-server
server:
port: 8763
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer1:8761/eureka/,http://peer2:8761/eureka/,http://peer3:8761/eureka/
instance:
prefer-ip-address: true # 以ip地址注册,默认为主机名

服务注册与发现

服务发现是基于微服务的体系结构的关键原则之一,spring cloud是如何做到服务注册和发现的呢?
当服务启动时,eureka客户端(即配置了注册eureka的服务)向eureka集群服务提供元数据(host、port、health indicator url、home page etc.)将自身注册到eureka集群中。而且eureka集群会收到来自每个服务的心跳信息,如果心跳超过了配置的时间未刷新,那么这个服务实例就会从服务注册表中删除,并通知其他eureka客户端。