FeignClient RPC使用
一、创建FeignClient
// 创建Feign客户端
@FeignClient(contextId = "myClient", name = "mt-prject-name:student",
url = "http://localhost:8080/")
public interface ReportApiClient {
// 对应服务的接口(controller层的接口一致)
@GetMapping("/v2/student")
StudyReportNewVO report(
@RequestParam(value = "classroomId", required = true) Long classroomId,
@RequestParam(value = "studentId", required = true) Long studentId);
}
二、启动类增加扫描
// 增加@EnableFeignClients注解,扫描上面FeignClient路径。
@EnableDiscoveryClient
@EnableFeignClients({"com.mt.rpc"})
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
SpringApplication.run(DemoApplication.class, args);
log.info("api application startup time: {}s", (System.currentTimeMillis() - startTime) / 1000);
}
}
三、controller层就可以直接通过FeignClient调用了
一般将其放在service层调用
@RestController
public class NewCourseController {
private final ReportApiClient reportApiClient;
/**
* cmt
*
* @author: mao-tao
**/
public NewCourseController(ReportApiClient reportApiClient) {
this.reportApiClient = reportApiClient;
}
/**
* 查询
**/
@GetMapping("/newFiveReport")
public StudyReportNewVO report(@RequestParam(value = "classroomId", required = true)
Long classroomId, @RequestParam(value = "studentId", required = true)
Long studentId) {
return reportApiClient.report(classroomId, studentId);
}
}
四、rpc请求中增加参数
当服务提供方,需要进行身份认证,则在rpc调用时,添加验证参数。
// 通过拦截器给feign的RequestTemplate请求增加参数
@Configuration
@Slf4j
public class FeignReqInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest req = attributes.getRequest();
// 增加需要验证的参数
requestTemplate.header("Authorization", req.getHeader("Authorization"));
log.info("add token to feign request");
}
}
}
五、解说拦截器
RequestInterceptor是openfeign提供的一个拦截器接口,可以配置0个或多个RequestInterceptors,目的是为所有请求添加头,但是不能保证拦截器应用的顺序。一旦应用了拦截器,就会调用Target.apply(RequestTemplate)来创建通过Client发送的不可变http请求。
RequestInterceptors是通过Feign.Builder.requestInterceptors配置的。