注册发现介绍
采用网络接口进行通信,并且支持多实例弹性扩缩容是微服务一个重要的特征。 一个微服务 A 需要和另外一个微服务 B 进行 通信,首先需要知道微服务 B 的网络地址信息, 这个过程一般是通过注册发现实现的。
最常见的服务发现机制是引入一个中间件服务, 微服务 B 启动的过程中,向中间件服务注册自己的网络地址信息,微服务 A 访问 B 的时候, 首先从中间件服务查询微服务 B 的网络地址信息。
对于规模较小的系统,也可以不使用中间件服务,而是通过配置文件的方式,在微服务 A 中指定微服务 B 的地址。这种方式 适合组网情况固定,不会弹性扩缩容的场景。
在局域网环境下,还可以通过组播协议,比如 mDNS 发现其他的服务,这种方式不需要做额外的配置。
注册发现信息
Java Chassis定了了几个维度的核心概念,注册发现和配置管理都围绕这几个核心概念来组织。
- 环境 environment
- 应用 application
- 微服务名称 name
- 微服务版本 version
- 实例地址信息 Endpoints,一个实例可以包含多个协议的 Endpoint。
此外还包括契约(schema)。 契约是Java Chassis治理管控的基础。
这些基本信息通过 yaml 文件进行配置:
servicecomb:
service:
application: basic-application
name: gateway
version: 0.0.1
rest:
address: 0.0.0.0:9090?sslEnabled=false
同时使用多个注册发现
可以同时使用多个注册发现的实现。组合不同的注册发现的实现,能够满足一些非常重要场景的需求。
使用多个服务中心的约束和行为
- 服务注册
可以往多个不同的注册中心注册,不同的实例在注册的时候,需要保证每个实例(进程)具备唯一的实例ID,如果实例重启,需要生成新的实例ID,即使是在同一个物理主机。
- 服务发现
实例ID相同的微服务实例,会被作为同一个实例进行管理。如果不同的注册中心实例ID相同,那么必须保证这些实例是同一个,否则会出现实例丢失或者覆盖的情况。