Spring Cloud 注册中心及注册中心的桥梁OpenFeign源码分析

注册中心:

首先强调一下注册中心作用于多个(>=2)服务之间使用,把服务的地址扔到nacos上,方便服务找

配置中心作用于单个服务,把application.yaml中热更新的属性配置扔到nacos上,方便人去配置

网关是作用于人和服务之间

注册中心: 

注册中心用于已经拆开的各项服务之间通信,类似作为远程通信的可以动态更新的电话簿

可以记录并监控为微服务各实例状态,推送服务变更信息

注册中心用法:

服务提供者在启动时将自己能提供的服务注册至注册中心,服务消费者可以从注册中心订阅和拉取相关服务信息。

多个服务提供对象咋选

        负载均衡

服务提供对象怎么动态更新:

        服务提供者定时发送心跳续约,如果注册中心持续没有收到续约,则向服务消费者发送推送变更,将这个服务(电话号)剔除

具体而言即获取服务提供者所在IP+端口,并通过远程调用形式实现。我们使用OpenFeign实现前两步过程


nacos服务注册

application.yaml配置服务名称,以及要提交的nacos服务器地址

两个实例,就看成有两个异地的服务提供者。当然也会注册成两个

nacos界面展示

细节展示:与application.yaml文件配置相同, 电话簿有了内容

服务发现

注意上边那个是服务提供者,现在我要消费了,但下面这个太麻烦了不用直接openfeign

OpenFeign

根据@FeignClient(value = "item-service") 取注册中心获取服务所在位置,后续调用queryItemByIds方法自动配置好Get请求路径去服务所在位置获取结果 

 OpenFeign原理 

可以看到这就是一个动态代理。底层通过Proxy动态产生的代理类需要用接口类型向上转型

本质上是如果不用OpenFeign,那么就需要在代码中手动加入Nacos的api查询目标服务的ip+端口,再进行访问得到结果,OpenFeig实际上就是简化了手动操作,他通过实现InvokationHandler接口并重写其中Invoke方法(其实例作为h),在invoke方法内部实现了对目标服务的查询,访问得到结果;再根据InvokationHandler创建代理类$Proxy101,那么执行itemClient.queryItemByIds()方法时,就调用代理类中的queryItemByIds()方法(这个方法通过实现父类接口获得。

动态代理类中的queryItemByIds()就是一个通过h.invoke()方法,完成对目标服务查询。

为什么不需要一个被代理类呢?可能因为代理类只需要增强方法就可以了。

至于为啥后续补一个动态代理源码吧(如下图)

和动态代理一样,OpenFiegn自己实现了一个InvocationHandler重写唯一方法invoke

这里重写当然就是为了获得服务提供者提供的服务了(获取地址+访问)(如下图)

 我们进入invoke方法:内部转换传入的参数,也就是上文的itemIds

转换成 根据注解形成的路径参数 + itemIds,逐渐变成和单体项目访问后端方法(如下图)

进一步转换,发现item-service还只是微服务名,需要把他转成对应的真正地址

所以去注册中心查找(如下图)

那么就用这个方法去根据服务名查得到结果(如下图)

得到真正得远程微服务路径。那么就真正的如同正常单体后端项目去执行对应方法了(如下图)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值