SpringCloud微服务实战系列:05远程调用组件Feign的核心原理

目录

代码解释:

Feign对象创建核心原理:

总结:

演示完整代码:


写过springcloud微服务的都知道feign远程调用,为了方便演示,我们换一种写法,直接在main方法中运行:

代码解释:

1.定义请求拦截器:

requestTemplate.header("authorization", "Bearer 69a5d08839dc4cfcab3daf20635acbe6");

这个拦截器的作用就是发送http请求时候,增加authorization header ,将用户认证token发送给服务器。

2. 构造FeignClient对象:

基于java的动态代理构建一个FeignClient对象,这是feign的核心能力。


3. 调用FeignClient方法 

Feign对象创建核心原理:

就是基于jdk的动态代理,jdk动态代理的核心要素:

1. 接口:JDK动态代理是基于接口的代理机制,即目标类必须实现至少一个接口或者就是接口

2. InvocationHandler接口:
这是JDK动态代理中的一个关键接口,它定义了一个invoke方法,用于处理代理实例上的方法调用。invoke方法有三个参数:代理实例(proxy)、被调用的方法(method)和方法参数(args)。
开发者需要实现这个接口,并在invoke方法中编写方法调用的逻辑。 

3. Proxy类:
Proxy类是JDK动态代理的核心类之一,它提供了创建动态代理实例的静态方法。当调用Proxy.newProxyInstance方法时,JDK会动态生成一个代理类

总结:

1.Feign就是定义一个接口,然后用jdk Proxy创建一个动态代理实例。 feign可以基于name从注册中心获取调用目的接口服务器的IP端口,实现负载均衡; 也可以直接用url指定目的接口的IP端口。

2. 因为可以插入自己的拦截器,所以可以实现比较复杂的业务功能。

3. Feign 可以用直接当成一个http请求客户端工具使用,比如文章开头的演示demo就是这中用法。

演示完整代码:

package cn.iocoder.yudao.module.system.test;

import feign.Feign;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.support.SpringMvcContract;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@FeignClient(name = "tenant")
interface TenantClient {
    @RequestMapping(method = RequestMethod.GET, value = "/admin-api/system/tenant/page?pageNo=1&pageSize=10")
    String tenants();
}

public class FeignTest {
    public static void main(String[] args) {
        //拦截器
        RequestInterceptor interceptor = new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                requestTemplate.header("authorization", "Bearer 69a5d08839dc4cfcab3daf20635acbe6");
            }
        };
        //构造feignClient对象
        TenantClient client = Feign.builder()
                .contract(new SpringMvcContract())
                .requestInterceptor(interceptor)
                .target(TenantClient.class, "http://localhost:48080/");
        System.out.println(client.tenants());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值