分布式协调服务Zookeeper

zz@TOC

Zookeeper介绍

Zookeeper是一个开放源代码的分布式协调服务由互联网公司雅虎创建,是Google Chubby的开源实现。Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

zookeeper的工作原理

1.Zookeeper工作机制

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接收观察者的注册,一旦这些数据的状态发送变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。也就是说Zookeeper = 文件系统 + 通知机制
在这里插入图片描述

2.Zookeeper特点

【1】Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
【2】Zookeeper集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务。所以Zookeeper适合安装奇数台的服务器。
【3】全局数据一致性:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。
【4】实时性,在一定时间范围内,client能读取到最新的数据。
【5】更新请求数据执行,来自同一个client的更新请求按其发送顺序依次执行,即先进先出。
【6】数据更新原子性,一次数据更新要么成功,要么失败。

3.Zookeeper 数据结构

ZooKeeper数据模型的结构与Linux文件系统很类似,整体上可以看作是一棵树,每个节点称做一个ZNode。每.一个 ZNode默认能够存储1MB的数据,每个ZNode都可以通过其路径唯一标识
在这里插入图片描述

4.zookeeper的应用场景

  • 命名服务
    在Zookeeper文件系统里创建一个文件,即有一个唯一的path。我们可以约定好,通过path就能实现服务的相互探索与发现。

  • 配置管理
    客户端都需要配置文件,如果对每个服务配置文件部署在自身的服务器上,对服务配置文件就需要逐个管理,那样就会很麻烦。可以在Zookeeper服务上创建一个Configration的服务配置管理节点,把每个客户端的配置写在这个文件里,当配置文件发生改变时只需改变Zookeeper服务器上的这个配置文件即可,每个客户端都会监听Zookeeper服务器的Configuration节点,当配置信息发生改变时,各自服务器实时读取即可。
    在这里插入图片描述

  • 集群管理
    集群管理无在乎两点:是否有机器退出和加入、选举master。
    第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它删除了。新机器加入也是类似,所有机器收到通知:新兄弟目录加入。
    第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就可以了。
    在这里插入图片描述

  • 分布式锁
    有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。
    对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。
    对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次轮流。
    在这里插入图片描述

5.Zookeeper选举机制

第一次启动选举机制
(1)服务器1启动,发起一次选举。服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING;
(2)服务器2启动,再发起一次选举。服务器1和2分别投自己一票并交换选票信息:此时服务器1发现服务器2的myid比自己目前投票推举的(服务器1)大,更改选票为推举服务器2。此时服务器1票数0票,服务器2票数2票,没有半数以上结果,选举无法完成,服务器1,2状态保持L00KING
(3)服务器3启动,发起一.次选举。此时服务器1和2都会更改选票为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数,服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;
(4)服务器4启动,发起一次选举。此时服务器1,2,3已经不是LOOKING状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,并更改状态为FOLLOWING;
(5)服务器5启动,同4一样当小弟。

非第一次启动选举机制
(1)当ZooKeeper集群中的一台服务器出现以下两种情况之一时,就会开始进入Leader选举:

服务器初始化启动。
服务器运行期间无法和Leader保持连接。
(2)而当一台机器进入Leader选举流程时,当前集群也可能会处于以下两种状态:
集群中本来就已经存在一个Leader。
对于已经存在Leader的情况,机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器来说,仅仅需要和Leader机器建立连接,并进行状态同步即可。
集群中确实不存在Leader。
假设ZooKeeper由5台服务器组成,SID分别为1、2、3、4、5,ZXID分别为8、8、8、7、7,并且此时SID为3的服务器是Leader。某一时刻,3和5服务器出现故障,因此开始进行Leader选举。
选举Leader规则:
1.EPOCH大的直接胜出
2.EPOCH相同,事务id大的胜出
3.事务id相同,服务器id大的胜出

zookeeper 的集群

在 zookeeper 中,客户端会随机连接到 zookeeper 集群中的一个节点,如果是读请求,就直接从当前节点中读取数 据,如果是写请求,那么请求会被转发给leader提交事务, 然后 leader会广播事务,只要有超过半数节点写入成功,那么写请求就会被提交(类 2PC 事务)
在这里插入图片描述
所有事务请求必须由一个全局唯一的服务器来协调处理,这个服务器就是 Leader 服务器,其他的服务器就是follower。leader 服务器把客户端的失去请求转化成一个事务 Proposal(提议),并把这个 Proposal 分发给集群中的
所有 Follower 服务器。之后 Leader 服务器需要等待所有Follower 服务器的反馈,一旦超过半数的 Follower 服务器进行了正确的反馈,那么 Leader 就会再次向所有的 Follower 服务器发送 Commit 消息,要求各个 follower 节点对前面的一个 Proposal 进行提交;

集群角色

Leader 角色

Leader 服务器是整个 zookeeper 集群的核心,主要的工作 任务有两项

  1. 事物请求的唯一调度和处理者,保证集群事物处理的顺序性
  2. 集群内部各服务器的调度者

Follower 角色

Follower 角色的主要职责是

  1. 处理客户端非事物请求、转发事物请求给 leader 服务器
  2. 参与事物请求 Proposal 的投票(需要半数以上服务器 通过才能通知 leader commit 数据; Leader 发起的提案, 要求 Follower 投票)
  3. 参与 Leader 选举的投票

Observer 角色

Observer 是 zookeeper3.3 开始引入的一个全新的服务器角色,从字面来理解,该角色充当了观察者的角色。观察 zookeeper 集群中的最新状态变化并将这些状态变化同步到 observer 服务器上。Observer 的工作原理与 follower 角色基本一致,而它和 follower 角色唯一的不同在于 observer 不参与任何形式的投票,包括事物请求Proposal的投票和leader选举的投票。简单来说,observer 服务器只提供非事物请求服务,通常在于不影响集群事物处理能力的前提下提升集群非事物处理的能力

集群组成

通常 zookeeper 是由 2n+1 台 server 组成,每个 server 都 知道彼此的存在。对于 2n+1 台 server,只要有 n+1 台(大多数)server 可用,整个系统保持可用。我们已经了解到, 一个 zookeeper 集群如果要对外提供可用的服务,那么集 群中必须要有过半的机器正常工作并且彼此之间能够正常 通信,基于这个特性,如果向搭建一个能够允许 F 台机器 down 掉的集群,那么就要部署 2*F+1 台服务器构成的 zookeeper 集群。因此 3 台机器构成的 zookeeper 集群,能够在挂掉一台机器后依然正常工作。一个 5 台机器集群的服务,能够对 2 台机器协调的情况下进行容灾。如果一 个由 6 台服务构成的集群,同样只能挂掉 2 台机器。因此,5 台和 6 台在容灾能力上并没有明显优势,反而增加了网络通信负担。系统启动时,集群中的 server 会选举出一台 server 为 Leader,其它的就作为 follower(这里先不考虑 observer 角色)。 之所以要满足这样一个等式,是因为一个节点要成为集群中的 leader,需要有超过及群众过半数的节点支持,这个涉及到 leader 选举算法。同时也涉及到事务请求的提交投票

zookeeper部署

zookeeper 有两种运行模式:集群模式和单击模式。

单机部署

一般情况下,在开发测试环境,没有这么多资源的情况下, 而且也不需要特别好的稳定性的前提下,我们可以使用单机部署;Centos7 安装zookeeper:
1.下载 zookeeper安装包:

[root@ycl zookeeper]# wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz
--2023-07-24 15:21:38--  https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz
Resolving dlcdn.apache.org (dlcdn.apache.org)... 151.101.2.132, 2a04:4e42::644
Connecting to dlcdn.apache.org (dlcdn.apache.org)|151.101.2.132|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 13338235 (13M) [application/x-gzip]
Saving to: ‘apache-zookeeper-3.8.2-bin.tar.gz’

apache-zookeeper-3.8.2-bin.tar.gz           100%[========================================================================================>]  12.72M  24.0KB/s    in 7m 9s   

2023-07-24 15:28:47 (30.4 KB/s) - ‘apache-zookeeper-3.8.2-bin.tar.gz’ saved [13338235/13338235]
[root@ycl zookeeper]# ls
apache-zookeeper-3.8.2-bin.tar.gz

2.下载完成,通过tar -zxvf解压

[root@ycl zookeeper]# tar -zxvf apache-zookeeper-3.8.2-bin.tar.gz 
apache-zookeeper-3.8.2-bin/docs/
apache-zookeeper-3.8.2-bin/docs/images/
apache-zookeeper-3.8.2-bin/docs/skin/
...
[root@ycl zookeeper]# ls
apache-zookeeper-3.8.2-bin  apache-zookeeper-3.8.2-bin.tar.gz
[root@ycl zookeeper]# cd apache-zookeeper-3.8.2-bin/
[root@ycl apache-zookeeper-3.8.2-bin]# ls
bin  conf  docs  lib  LICENSE.txt  NOTICE.txt  README.md  README_packaging.md

3.进入conf文件夹,复制zoo_sample.cfg命名为zoo.cfg

[root@ycl apache-zookeeper-3.8.2-bin]# cd conf/
[root@ycl conf]# ls
configuration.xsl  logback.xml  zoo_sample.cfg
[root@ycl conf]# cp zoo_sample.cfg zoo.cfg
[root@ycl conf]# ls
configuration.xsl  logback.xml  zoo.cfg  zoo_sample.cfg

4.移动目录到bin目录下,启动 ZK 服务:
./zkServer.sh start

[root@ycl conf]# cd ../bin
[root@ycl bin]# ./zkServer.sh start
Error: JAVA_HOME is not set and java could not be found in PATH.

当出现这个错误,说明虚拟机未安装jdk环境,安装java环境:
https://blog.csdn.net/weixin_41423562/article/details/131898836
Java环境安装成功后,重新启动zookeeper服务,服务启动成功

[root@ycl bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/zookeeper/apache-zookeeper-3.8.2-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

这里也可以配置zookeeper的环境变量,就不需要将目录移动至bin目录下,zookeeper的环境变量如下:

[root@zk1 ~]# vim /etc/profile
#this is for zookeeper enviroment 
export ZOOKEEPER_HOME=/home/zookeeper/zookeeper-bin
export PATH=$ZOOKEEPER_HOME/bin:$PATH

这样就可以直接执行zookeeper命令

[root@zk1 ~]# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

6.查看 ZK 服务状态:
bin/zkServer.sh status

[root@ycl bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /root/zookeeper/apache-zookeeper-3.8.2-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: standalone

单机模式下不支持查看状态.
7.停止 ZK 服务:
bin/zkServer.sh stop

[root@ycl bin]# ./zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /root/zookeeper/apache-zookeeper-3.8.2-bin/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

8.重启 ZK 服务:
bin/zkServer.sh restart

[root@ycl bin]# ./zkServer.sh restart
ZooKeeper JMX enabled by default
Using config: /root/zookeeper/apache-zookeeper-3.8.2-bin/bin/../conf/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /root/zookeeper/apache-zookeeper-3.8.2-bin/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
ZooKeeper JMX enabled by default
Using config: /root/zookeeper/apache-zookeeper-3.8.2-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

zookeeper集群部署

1. 准备工作

  • 准备3台虚拟机
192.168.50.114 zk1
192.168.50.112 zk2
192.168.50.113 zk3

3台虚拟机做好以下工作

  • 分别修改3台虚拟机的主机名
    [root@192.168.148.128:22 ~]# vim /etc/hostname
    zk2

  • 检查Java环境,使用java -version查看jdk版本

[root@zk2 ~]# java -version
java version "1.8.0_331"
Java(TM) SE Runtime Environment (build 1.8.0_331-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.331-b09, mixed mode)
  • 关闭防火墙,查看防火墙状态,确保防火墙已经关闭
[root@zk2 ~]# systemctl stop firewalld
[root@zk2 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 五 2023-06-02 13:58:25 CST; 1 months 22 days ago
     Docs: man:firewalld(1)
  Process: 819 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 819 (code=exited, status=0/SUCCESS)

6月 02 13:55:48 zk2 systemd[1]: Starting firewalld - dynamic firewall daemon...
6月 02 13:55:49 zk2 systemd[1]: Started firewalld - dynamic firewall daemon.
6月 02 13:55:49 zk2 firewalld[819]: WARNING: AllowZoneDrifting is enabled. This ...w.
6月 02 13:58:23 zk2 systemd[1]: Stopping firewalld - dynamic firewall daemon...
6月 02 13:58:25 zk2 systemd[1]: Stopped firewalld - dynamic firewall daemon.
Hint: Some lines were ellipsized, use -l to show in full.

2. 配置一个zookeeper节点

  1. 将其中一台虚拟机,比如zk2,按照单机部署的方式部署zookeeper。
  2. 在这台zookeeper的根目录下创建两个文件夹data和logs,这两个路径主要是用来存放zk的数据以及日志的(需要手动在配置文件中设置)
[root@zk1 zookeeper]#mkdir data
[root@zk1 zookeeper]#mkdir logs
  1. 修改zoo.cfg配置文件:
[root@zk1 zookeeper-bin]# vim conf/zoo.cfg 
tickTime=2000
# 集群的心跳时间 zookeeper中使用的基本时间单位, 毫秒值.
initLimit=10
# zookeeper集群中的包含多台server, 其中一台为leader, 集群中其余的server为follower.
# initLimit参数配置初始化连接时, follower和leader之间的最长心跳时间。
# 此时该参数设置为10, 说明时间限制为10倍tickTime, 即10*2000=20000ms=20s.
syncLimit=5
# 该参数配置leader和follower之间发送消息, 请求和应答的最大时间长度.
# 此时该参数设置为5, 说明时间限制为5倍tickTime, 即10000ms.
dataDir=/home/zookeeper/data
# 数据目录. 可以是任意目录
dataLogDir=/home/zookeeper/logs
# log目录, 同样可以是任意目录. 如果没有设置该参数, 将使用和dataDir相同的设置.
clientPort=2181
# 监听client连接的端口号,通过ip:2181端口进入zookeeper的文件系统
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
# 2888是leader与跟随者通信的接口,当leader挂掉后跟随者通过3888通信选举出新leader

4.在data目录下创建myid文件,其值为配置文件中server.后面的数字一致,zk2对应的为2,则myid文件的值为2

[root@zk1 data]# vim myid
2

启动zookeeper节点,节点启动成功,这样第一个zookeeper节点就配置好了。

[root@zk2 ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

3.把配置好的zookeeper拷贝到其他节点

  • 拷贝zk2到zk3
[root@zk2 /]# scp -r /home/zookeeper/ zk3:/home/
root@zk3's password: 
apache-zookeeper-3.7.0.tar.gz                       100% 3358KB   8.4MB/s   00:00    
snapshot.0                                          100%  607   112.9KB/s   00:00    
currentEpoch                                        100%    2     0.4KB/s   00:00    
acceptedEpoch                                       100%    2     0.4KB/s   00:00    
...
zookeeper-root-server-192.168.176.131.out           100%  174KB   6.2MB/s   00:00    
zookeeper-root-server-zk2.out                       100%   41KB   3.5MB/s   00:00  
  • 在zk3上修改myid的值为3
[root@zk3 home]# echo 3 > zookeeper/data/myid
[root@zk3 home]# vim zookeeper/data/myid 
3
  • 拷贝zk2到zk1
[root@zk2 /]# scp -r /home/zookeeper/ zk1:/home/
root@zk1's password: 
apache-zookeeper-3.7.0.tar.gz                       100% 3358KB   8.4MB/s   00:00    
snapshot.0                                          100%  607   112.9KB/s   00:00    
currentEpoch                                        100%    2     0.4KB/s   00:00    
acceptedEpoch                                       100%    2     0.4KB/s   00:00    
...
zookeeper-root-server-192.168.176.131.out           100%  174KB   6.2MB/s   00:00    
zookeeper-root-server-zk2.out                       100%   41KB   3.5MB/s   00:00  
  • 在zk1上修改myid的值为1
[root@zk3 home]# echo 1 > zookeeper/data/myid
[root@zk3 home]# vim zookeeper/data/myid 
1

4. 添加控制zookeeper集群的shell脚本

  1. 在root的bin目录下新增zk.sh集群控制脚本文件

5. 启动集群

[root@zk2 bin]# sh zk.sh start
----------zookeeper zk1 启动----------
root@zk1's password: 
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
----------zookeeper zk2 启动----------
root@zk2's password: 
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
----------zookeeper zk3 启动----------
root@zk3's password: 
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
  • 查看集群各个节点状态
[root@zk2 bin]# sh zk.sh status
----------zookeeper zk1 状态----------
root@zk1's password: 
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
----------zookeeper zk2 状态----------
root@zk2's password: 
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
----------zookeeper zk3 状态----------
root@zk3's password: 
ZooKeeper JMX enabled by default
Using config: /home/zookeeper/zookeeper-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

这里在集群启动,停止,等集群操作的时候,每次都需要输入密码,通过建立信任关系,可以实现不输入密码。

[root@zk2 bin]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:5Lt/XNwHAqWYO4KfMM1ZydGknr5t2viuKqaCPU305Do root@zk2
The key's randomart image is:
+---[RSA 2048]----+
|        .o...    |
|       . *o.     |
|        O ..     |
|    .+.* o  . .  |
|   .++= S    o o |
|    .+o+ o    o o|
|.. o .o o  . .  .|
|o o E    *. o    |
| ..+ o..*B*.     |
+----[SHA256]-----+
[root@zk2 .ssh]# scp /root/.ssh/id_rsa.pub zk1:/root/.ssh/authorized_keys 
root@zk1's password: 
id_rsa.pub                                          100%  390    47.7KB/s   00:00    
[root@zk2 .ssh]# scp /root/.ssh/id_rsa.pub zk3:/root/.ssh/authorized_keys 
root@zk3's password: 
id_rsa.pub                                          100%  390    90.0KB/s   00:00

同理,如果其他哪一台服务器需要作为主机,进行相同配置即可。
配置完成,启动集群效果如下:
在这里插入图片描述

Zookeeper 可视化管理工具

PrettyZoo 是一个基于 Apache Curator 和 JavaFX 实现的 Zookeeper 图形化管理客户端。
使用了 Java 的模块化(Jigsaw)技术,并基于 JPackage 打包了多平台的可运行文件(无需要额外安装 Java 运行时)。
https://gitee.com/ox7c00/PrettyZoo/blob/master/README.md

Zookeeper的应用

SpringCloud整合Zookeeper实现服务注册与发现

服务注册

  1. 首先,你需要在你的Spring Cloud项目中添加Spring Cloud Zookeeper的依赖。在你的pom.xml文件中添加以下依赖:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
  1. 在application.yml文件中配置Zookeeper的连接信息:
spring:
  cloud:
    zookeeper:
      connect-string: 192.168.50.112:2181,192.168.50.113:2181,192.168.50.114:2181
  application:
    name: zkService
server:
  port: 8082
  1. 在你的主应用类上添加@EnableDiscoveryClient注解来启用服务注册和发现功能:
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

以上步骤完成后,你的Spring Cloud应用就注册上Zookeeper了

服务发现

  1. 使用RestTemplate:
  • 首先,你需要在你的配置类中创建一个RestTemplate的Bean,并添加@LoadBalanced注解:
@Configuration
public class MyConfiguration {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  • 然后,你可以在你的服务中注入这个RestTemplate,并使用它来调用其他服务:
@RestController
public class MyController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/callOtherService")
    public String callOtherService() {
        return restTemplate.getForObject("http://other-service/api", String.class);
    }

}在上述代码中,other-service是你想要调用的服务的名称,/api是你想要调用的API的路径。
2. 使用Feign:

  • 首先,你需要在你的主应用类或者配置类上添加@EnableFeignClients注解:
SpringBootApplication
@EnableFeignClients
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 然后,你可以创建一个Feign客户端接口,并使用@FeignClient注解来指定你想要调用的服务:
@FeignClient("other-service")
public interface OtherServiceClient {
    @GetMapping("/api")
    String callApi();
}
  • 最后,你可以在你的服务中注入这个Feign客户端接口,并使用它来调用其他服务:
@RestController
public class MyController {
    @Autowired
    private OtherServiceClient otherServiceClient;

    @GetMapping("/callOtherService")
    public String callOtherService() {
        return otherServiceClient.callApi();
    }
}

在上述代码中,other-service是你想要调用的服务的名称,/api是你想要调用的API的路径。

  • 注意:在Spring Cloud中,当一个服务注册到Zookeeper时,它的调用路径通常是由服务名称和API路径组成的。服务名称是在Spring Cloud应用的配置文件中通过spring.application.name属性设置的,API路径是在服务的Controller类中通过@RequestMapping或@GetMapping等注解设置的。
    例如,如果你有一个名为my-service的服务,它有一个API路径为/api的接口,那么这个服务的调用路径就是http://my-service/api。
    你可以在其他服务中使用RestTemplate或Feign来调用这个路径,例如:
restTemplate.getForObject("http://my-service/api", String.class);

或者:

@FeignClient("my-service")
public interface MyServiceClient {
    @GetMapping("/api")
    String callApi();
}

在上述代码中,http://my-service/api就是服务的调用路径

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值