SpringCloud生态架构

基础知识

名词 解释
register 动词,注册
registry 名词,注册中心,注册表
spring.application.name Service ID 或 virtual host (VIP)
eureka server 它包含一个服务注册表和一个REST API,可以用来注册一个服务,注销一个服务,并发现其他服务的位置
eureka client service ID 标识的一个client,可包含多个实例
eureka instance 一个微服务application的单个启动实例,随着负载增长可启动多个水平缩放
eureka service 当你注册一个微服务application成一个client,你能通过注册的service ID获取一个eureka service

Eureka架构

Eureka架构中的三个核心角色:

  • 服务注册中心

    Eureka的服务端应用,提供服务注册和发现功能

  • 服务提供者

    提供服务的应用,可以是SpringBoot应用,也可以是其它任意技术实现,只要对外提供的是Rest风格服务即可。

  • 服务消费者

    消费应用从注册中心获取服务列表,从而得知每个服务方的信息,知道去哪里调用服务方。

高可用的Eureka Server

常用配置

  • Eureka Server常用配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
server:
port: 8761
spring:
application:
name: eureka-server # 应用名称
eureka:
instance:
prefer-ip-address: true # 让client注册时,使用ip替代默认的hostname
ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的话会自己寻找
client:
register-with-eureka: false #单机禁用自己注册自己,默认true
fetch-registry: false #单机时不从对等点拉取registry
service-url: # 服务地址,单机时是自己,集群时需要加上其它Server的地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • Eureka Client常用配置
1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 8761
spring:
application:
name: eureka-server # 应用名称,会在Eureka中显示
eureka:
instance:
prefer-ip-address: true # 让client注册时,使用ip替代默认的hostname
ip-address: 127.0.0.1 # 指定自己的ip信息,不指定的话会自己寻找
client:
service-url: # 服务地址,单机时是自己,集群时需要加上其它Server的地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

Eureka Client要指定register-with-eureka和fetch-registry为true,即注册自己到Eureka Server,因为默认是true,所以不用配置

Eureka Server Standalone

  • spring-cloud-starter-eureka-server
  • @EnableEurekaServer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
eureka server的application.yml配置

server:
port: 8761

eureka:
instance:
hostname: localhost
preferIpAddress: true # 让client注册时,使用ip替代默认的hostname
client:
registerWithEureka: false #单机禁用自己注册自己
fetchRegistry: false #单机时不从对等点拉取registry
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  • 默认服务注册中心也会将自己作为客户端来尝试注册它自己,并且需要(至少一个)服务URL来定位对等方,单机我们需要禁用它的客户端注册行为,不禁用日志中会出现异常提醒。
  • eureka server和client会通过心跳机制保持通讯,client每30秒发送一次心跳去续约,如果90秒内server不能收到client的心跳,则会将该client踢出注册表,自我保护模式下不会踢出失效的client
  • eureka server没有后端存储,但registry中eureka instance都必须发送检测信号去使其注册保持最新状态(这些在内存中完成),eureka client还拥有一个rigistry的内存缓存,所以不必每次都去请求rigistry。

Eureka Server HA

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
eureka server的application.yml配置

spring:
profiles:
active: peer1
application:
name: eureka-server-ha

---

spring:
profiles: peer1
eureka:
instance:
hostname: peer1
preferIpAddress: true # 让client注册时,使用ip替代默认的hostname
client:
serviceUrl:
defaultZone: http://peer2/eureka/
server:
port: 1001

---

spring:
profiles: peer2
application:
name:
eureka:
instance:
hostname: peer2
preferIpAddress: true # 让client注册时,使用ip替代默认的hostname
client:
serviceUrl:
defaultZone: http://peer1/eureka/
server:
port: 1002
  • 你能多个peer到系统中,只要它们互相至少通过一条边连接,它们之间能同步注册表。如果这些peers中物理上隔离的,系统原则上会存在脑裂类型失败。

Eureka Client

  • spring-cloud-starter-eureka
  • @EnableEurekaClient/@EnableDiscoveryClient
1
2
3
4
5
discovery client的application.properties

spring.application.name=eureka-client-provider
server.port=2001
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ #服务注册中心的位置
  • defaultZone,为任何不表示偏好的客户提供服务URL(即,这是一个有用的默认值)。
  • client通过RestTemplate来真正发起REST请求

授权访问

  • spring-boot-starter-security
1
2
3
4
5
6
7
8
9
10
eureka server 新增

security.basic.enabled=true
security.user.name=user
security.user.password=pwd
defaultZone=http://user:pwd@localhost:8761/eureka

eureka client 配置curl style like

http://user:pwd@localhost:8761/eureka

为什么注册一个服务很慢?

  • 成为一个instance涉及一个到注册中心的周期性心跳,通过client的serverUrl, 默认间隔30秒,
    一个服务不可用于被其他clients发现,直到instance,server,client所有的在本地缓存中有相同的metadata,因此会花费3个心跳,你能改变这个周期,通过设置eureka.instance.leaseRenewalIntervalInSeconds=30,这将会加速client连接到其他服务的进度,
    在生产上,使用默认的可能更好,因为在server上有一些计算间隔使关于续约周期的猜想。