fhs_framework springcloud使用统一的控制器来接收rpc调用请求教程,无需每个rpc接口都写控制器

本文主要是介绍fhs_framework springcloud使用统一的控制器来接收rpc调用请求教程,无需每个rpc接口都写控制器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从dubbo转到springcloud,觉得springcloud家族组件很全,但是用起来稍微麻烦,每个api 都要写一个控制器来处理http请求 .

于是对相关代码进行抽象,使用统一控制器方法来处理请求,返回结果.

 

1   RPC接口定义

        在定义接口的时候,url使用统一的开头  /api/*,将需要调用的类和方法标记到url中.比如

@RequestLine("GET /api/com.fhs.basics.api.rpc.FeignWordBookApiService/getWordBookListByWordBookGroupCode?wordBookGroupCode={wordBookGroupCode}")

    然后定义好参数的处理方式,如果是表单参数使用@Param注解标记,如果是@RequestBody 使用 @RequestBody标记.

   

/*** 字典公共服务*/
@FeignClient(value = "basics", configuration = FeignConfiguration.class,primary = false)
public interface FeignWordBookApiService {/*** 根据字典编码获取字典信息* @param wordBookGroupCode 字典编码* @return HttpResult 角色数据权限*/@RequestLine("GET /api/com.fhs.basics.api.rpc.FeignWordBookApiService/getWordBookListByWordBookGroupCode?wordBookGroupCode={wordBookGroupCode}")HttpResult<List<ServiceWordbookVO>> getWordBookListByWordBookGroupCode(@Param("wordBookGroupCode") String wordBookGroupCode);
}

     这样由统一的控制器拦截处理此请求后就拿到了 类,方法,参数.

            

2  统一处理控制器

       首先拿到类名,方法名,然后通过反射拿到方法,解析方法的参数(根据注解来决定从body读取还是通过request.getParameter获取),拿到参数后,调用方法返回返回值.

  

/*** 执行RPC方法** @param serviceClass 方法类* @param methodName   方法名* @param request      req* @param response     res*/@RequestMapping("/api/{serviceClass}/{methodName}")public void doExec(@PathVariable() String serviceClass,@PathVariable() String methodName, HttpServletRequest request, HttpServletResponse response) {ParamChecker.isNotNullOrEmpty(serviceClass, "serviceClass 不可为空");ParamChecker.isNotNullOrEmpty(methodName, "methodName 不可为空");if(!this.apiToken.equals(request.getHeader("apiToken"))){throw new ParamException("token不正确,非法调用");}try {Class clazz = Class.forName(serviceClass);if (!clazz.isAnnotationPresent(FeignClient.class)) {throw new ParamException("调用方法非Feign接口");}Method method = ReflectUtils.getMethodd(clazz, methodName);if (method == null) {throw new ParamException("方法不存在");}Object[] params = new Object[method.getParameterTypes().length];Annotation[][] annotations = method.getParameterAnnotations();int index = 0;outside:for (Annotation[] oneParamAnnotations : annotations) {for (Annotation annotation : oneParamAnnotations) {if (annotation instanceof RequestBody) {String jsonString = readAsChars(request);params = new Object[]{JSONObject.parseObject(jsonString, method.getParameters()[0].getType())};break outside;} else if (annotation instanceof RequestParam) {RequestParam tempParam = (RequestParam)annotation;params[index] = request.getParameter(tempParam.defaultValue());}}index++;}Object service = SpringContextUtil.getBeanByClassForApi(clazz);try {Object result = method.invoke(service, params);JsonUtils.outJson(response, JsonUtils.bean2json(result));} catch (IllegalAccessException e) {log.error("", e);} catch (InvocationTargetException e) {log.error("", e);}} catch (ClassNotFoundException e) {throw new ParamException("serviceClass 名称错误");}}

 

全部源码地址:https://gitee.com/fhs-opensource/fhs-framework/blob/v2.x/fhs_extends/fhs_base/fhs_base_other/src/main/java/com/fhs/core/base/controller/ApiController.java

开源项目地址:https://gitee.com/fhs-opensource/fhs-framework

fhs framework qq群:976278956

 

这篇关于fhs_framework springcloud使用统一的控制器来接收rpc调用请求教程,无需每个rpc接口都写控制器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/475812

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll