目录
写过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());
}
}