dubbo-gateway 提供了http协议到dubbo协议的转换,但【并非】使用dubbo的【泛化】调用(泛化调用性能比普通调用有10-20%的损耗,通过普通异步的调用方式与基于webflux系列的响应式网关整合提高系统的吞吐量,普通调用需要依赖api jar包,需要对接口定义进行改造,除此之外不需要做任何其它改造.另外也支持基于servlet类的应用或网关进行整合
泛化缺点泛化过程数据流会经过了三次转换, 会产生大量的临时对象, 有很大的内存要求。使用反射方式对于旨在榨干服务器性能以获取高吞吐量的系统来说, 难以达到性能***
同时服务端也会对泛化请求多一重 Map <-> POJO 的来回转换的过程。整体上,与普通的Dubbo调用相比有10-20%的损耗
泛化调用在网关或服务消费者阶段无法校验参数类型的有效性,数据要到服务提供者反序列化时才能校验出参数类型的有效性
开源地址开源地址
相关注解 @GateWayDubbo标识这个接口需要自动进行协议转换
/** * 服务id,可以和dubbo普通调用的配置属性关联. */ @AliasFor("id") String value() default ""; /** * 服务id,可以和dubbo普通调用的配置属性关联. * 例如: com.atommiddleware.cloud.config.dubboRefer.<userService>.version=1.1.0 com.atommiddleware.cloud.config.dubboRefer.<userService>.group=userSystem 以上相当于会调用版本号为1.1.0并且groupw为userSystem的dubbo服务,与@DubboReference的参数对齐,具体支持哪些参数详见配置类DubboReferenceConfigProperties */ @AliasFor("value") String id() default ""; @PathMapping标记这个接口方法需要进行协议自动转换
/** * 路径表达式 */ @AliasFor("path") String value() default ""; /** * 路径表达式 */ @AliasFor("value") String path() default ""; /** * 提交方法,GET或POST */ RequestMethod requestMethod() default RequestMethod.POST; public enum RequestMethod { GET, POST } @FromBody表示参数对象来源于消息体
/** * 是否检查参数 */ @AliasFor(annotation = ParamAttribute.class) boolean required() default true; @FromHeader表示参数对象来源于消息头
/** * 消息头名称 */ @AliasFor(annotation = ParamAttribute.class) String value() default ""; /** * 消息头名称 */ @AliasFor(annotation = ParamAttribute.class) String name() default ""; /** * 是否检查参数 */ @AliasFor(annotation = ParamAttribute.class) boolean required() default true; @FromCookie表示参数对象来源于cookie
/** * cookie名称 */ @AliasFor(annotation = ParamAttribute.class) String value() default ""; /** * cookie名称 */ @AliasFor(annotation = ParamAttribute.class) String name() default ""; /** * 是否检查参数 */ @AliasFor(annotation = ParamAttribute.class) boolean required() default true; @FromPath表示参数对象来源于path,支持path表达式
/** * path占位符名称 */ @AliasFor(annotation = ParamAttribute.class) String value() default ""; /** * path占位符名称 */ @AliasFor(annotation = ParamAttribute.class) String name() default ""; /** * 是否检查参数 */ @AliasFor(annotation = ParamAttribute.class) boolean required() default true; @FromQueryParams表示参数来源于query部分
/** * query名称 */ @AliasFor(annotation = ParamAttribute.class) String value() default ""; /** * query名称 */ @AliasFor(annotation = ParamAttribute.class) String name() default ""; /** * 是否检查参数 */ @AliasFor(annotation = ParamAttribute.class) boolean required() default true; @FromAttribute表示参数来源于attribute
/** * attribute 名称 */ @AliasFor(annotation = ParamAttribute.class) String value() default ""; /** * attribute 名称 */ @AliasFor(annotation = ParamAttribute.class) String name() default ""; /** * 是否检查参数 */ @AliasFor(annotation = ParamAttribute.class) boolean required() default true; 配置示例 @GateWayDubbo("userService") public interface UserService { /** * 数据来源消息体 */ @PathMapping("/sample/registerUser") Result registerUser(@FromBody User user); /** * 对象数据源来自header * @param user 用户信息 * @return 结果 */ @PathMapping(value="/sample/registerUserFromHeader",requestMethod=RequestMethod.GET) Result registerUserFromHeader(@FromHeader("user") User user); /** * 对象数据源来自cookie * @param user 用户信息 * @return 结果 */ @PathMapping(value="/sample/registerUserFromCookie",requestMethod=RequestMethod.GET) Result registerUserFromCookie(@FromCookie("user") User user); /** * 对象数据源来自path * @param user 用户信息 * @return 结果 */ @PathMapping(value="/sample/registerUserFromPath/{user}",requestMethod=RequestMethod.GET) Result registerUserFromPath(@FromPath("user") User user); /** * 数据来源queryParam * @param userId 用户id * @return 取消注销结果 */ @PathMapping(value="/sample/unRegisterUser",requestMethod=RequestMethod.GET) Result unRegisterUser(@FromQueryParams("userId")Long userId); /** * 数据来源path * @param userId * @return */ @PathMapping(value="/sample/getUserInfo/{userId}/{gender}",requestMethod=RequestMethod.GET) Result getUserInfo(@FromPath("userId") Long userId,@FromPath("gender") Short gender); /** * 数据来源header 和cookie * @param userId 用户id * @param age 年龄 * @return 返回插叙结果 */ @PathMapping(value="/sample/getUserInfo/byHeaderAndCookie",requestMethod=RequestMethod.GET) Result getUserInfo(@FromHeader("userId")Long userId,@FromCookie("age")Integer age); /** * 全场景 * @param userId 用户id * @param age 年龄 * @param gender 性别 * @param user 用户信息 * @return 查询结果 */ @PathMapping("/sample/getUserUserInfoAll/{userId}") Result getUserUserInfoAll(@FromPath("userId") Long userId,@FromCookie("age")Integer age,@FromHeader("gender")Long gender,@FromBody User user); } 使用步骤