Spring Boot 注册中心 – ZooKeeper
1、什么是注册中心
注册中心是只有在分布式架构中才有的概念,注册中心是分布式架构中所有服务器注册信息等相关功能的专用服务器,注册的地址是服务器的名称与对应IP地址。分布式环境下的应用在启动时候都会向这个地方来注册自己的网络地址和名称。用一句话来概括,注册中心的作用就是存放和调度服务,实现服务和注册中心,服务与服务之间的通信。
在分布式架构中,服务会注册到注册中心,应用 a 访问应用 b 时,则应用 a 首先通过应用 b 的应用名称向注册中心获取最新的 ip 地址,再根据 ip 地址访问应用 b。
2、为什么需要注册中心
① 没有注册中心
在不用服务注册之前,去维护这种关系网络呢就是写死 IP 地址。
将其他模块的 ip 和 port 写死在自己的配置文件里,甚至写死在代码里,每次要去新增或者移除1个服务的实例的时候,就得去通知其他所有相关联的服务去修改。随之而来的就是各个项目的配置文件的反复更新、每隔一段时间大规模的 ip 修改和机器裁撤,非常的痛苦。
② 有注册中心
有了注册中心之后,每个服务在调用别人的时候只需要服务的名称就好,调用时会通过注册中心根据服务编码进行具体服务地址进行调用。
常用的注册中心中间件
服务注册中心的作用就是【服务的注册】和【服务的发现】
3、注册中心原理
注册中心主要涉及到三大角色:
- 服务提供者
- 服务消费者
- 注册中心
它们之间的关系大致如下:
- 各个微服务在启动时,将自己的网络地址等信息注册到注册中心,注册中心存储这些数据。
- 服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。
- 各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。
- 微服务网络地址发送变化(例如实例增加或IP变动等)时,会重新注册到注册中心。这样,服务消费者就无需人工修改提供者的网络地址了。
4、注册中心和网关的简单联系
在微服务架构中,我们都会使用API网关来作为暴露服务的唯一出口。这样可以将与业务无关的各项控制,集中的在API网关中进行统一管理,从而使得业务服务可以更加专注于业务领域本身。而在微服务构建的系统内部,各个服务之间的调度,我们通常采用注册中心和客户端负载均衡的方式来实现服务之间的调用。
所以,大致的结构是这样子的:
5、注册中心代码实例
① 引入依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<version>3.1.0</version>
<exclusions>
<exclusion>
<artifactId>zookeeper</artifactId>
<groupId>org.apache.zookeeper</groupId>
</exclusion>
</exclusions>
</dependency>
② 修改配置文件
# 表表示注册到 zookeeper 服务的支付服务提供者端口号
server.port=1212
# 服务别名 ---注册 zookeeper 到注册中心名称
spring.application.name=canal-client
# zk连接信息
cloud.zookeeper.connect-string=127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
③ 启动项目
如果连接zk集群,报异常:Invalid config event received
一个curator框架的bug,已在curator 5.2.0版本里修复该问题
https://issues.apache.org/jira/browse/CURATOR-526
④ 可以用 zk 连接工具看到服务已经注册成功