SpringCloudRPC远程调用核心原理:Feign弹性RPC客户端的重要组件

Feign弹性RPC客户端的重要组件

在微服务启动时,Feign会进行包扫描,对加@FeignClient注解的RPC接口创建远程接口的本地JDK动态代理实例。之后这些本地Proxy动态代理实例会注入Spring IOC容器中。当远程接口的方法被调用时,由Proxy动态代理实例负责完成真正的远程访问并返回结果。

演示用例说明

为了演示Feign的远程调用动态代理类,接下来的演示用例,将从uaa-provider服务实例向demo-provider服务实例发起RPC远程调用,调用流程如图3-10所示。

SpringCloudRPC远程调用核心原理:Feign弹性RPC客户端的重要组件

图3-10 从uaa-provider实例向demo-provider实例发起远程调用

uaa-provider服务中的DemoRPCController类的代码如下:

package com.crazymaker.springcloud.user.info.controller;
//省略import
@RestController
@RequestMapping("/api/call/demo/")
@Api(tags = "演示demo-provider远程调用")
public class DemoRPCController
{
 //注入 @FeignClient注解所配置的demo-provider远程客户端动态代理实例
 @Resource
 DemoClient demoClient;
 @GetMapping("/hello/v1")
 @ApiOperation(value = "hello远程调用")
 public RestOut<JSONObject> remoteHello()
 {
 /**
 *调用demo-provider的REST接口api/demo/hello/v1
 */
 RestOut<JSONObject> result = demoClient.hello(); JSONObject data = new JSONObject();
 data.put("demo-data", result);
 return RestOut.success(data).setRespMsg("操作成功");
 }
 @GetMapping("/echo/{word}/v1")
 @ApiOperation(value = "echo远程调用")
 public RestOut<JSONObject> remoteEcho(
 @PathVariable(value = "word") String word)
 {
 /**
 *调用demo-provider的REST接口api/demo/echo/{0}/v1
 */
 RestOut<JSONObject> result = demoClient.echo(word);
 JSONObject data = new JSONObject();
 data.put("demo-data", result);
 return RestOut.success(data).setRespMsg("操作成功");
 }
}

启动uaa-provider服务后,访问其swagger-ui接口,可以看到新增两个demo-provider实例进行RPC调用的REST接口,如图3-11所示。

SpringCloudRPC远程调用核心原理:Feign弹性RPC客户端的重要组件

图3-11 uaa-provider新增的对demo-provider实例进行RPC调用的两个 接口

本章后面的Feign动态代理RPC客户端类的知识都是基于此演示用例来进行介绍的,特殊情况下还需要在uaa-provider的方法执行时进行单步调试,以查看Feign在执行过程中的相关变量和属性的值。当然,在演示uaa-provider之前需要启动demo-provider服务。

基于以上演示用例,下面开始梳理Feign中涉及RPC远程调用的几个重要组件。

Feign的动态代理RPC客户端实例

由于uaa-provider服务需要对demo-provider服务进行Feign RPC调用,因此uaa-provider需要依赖DemoClient远程调用接口,该接口的代码大家都非常熟悉了,如下所示:

package com.crazymaker.springcloud.demo.contract.client;
//省略import
@FeignClient(
 value = "seckill-provider", path = "/api/demo/",
 fallback = DemoDefaultFallback.class)
public interface DemoClient
{
 /**
 *远程调用接口的方法
 *调用demo-provider的REST接口api/demo/hello/v1
 *REST接口功能:返回hello world
 *@return JSON响应实例
 */
 @GetMapping("/hello/v1")
 RestOut<JSONObject> hello();
 /**
 *远程调用接口的方法
 *调用demo-provider的REST接口api/demo/echo/{0}/v1
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值