游戏陪玩源码服务端接口设计模式,不走寻常路

2023-11-10 12:40

本文主要是介绍游戏陪玩源码服务端接口设计模式,不走寻常路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、常见的游戏陪玩源码服务端接口设计模式是采用restful形式对外提供服务,我以用户登录、获取个人信息等接口作为示例,这里只展示主要的示例代码:

@RequestMapping("/user")
@RestController
public class UserController {@Autowiredprivate UserService userService;/*** 登录* @return*/@PostMapping("/login")public Result login(@RequestParam String username,@RequestParam String password){//校验参数//验证登录信息//返回登录结果return null;}/*** 获取个人信息* @param userId* @return*/@GetMapping("/getProfile")public Result<User> getProfile(@RequestParam String userId){//查询用户数据//返回查询结果return null;}
}

这种模式运行起来也挺好用,如果游戏陪玩源码服务端接口需要身份验证,可以在filter中对token(采用token验证的做法比较常见)进行有效性验证,对于不需要验证的接口,也可以在filter中进行url的排除,如果有网关,这些可以在网关中处理,这一切运行起来也都没有问题,在游戏陪玩源码开发中经常会选择这么做。

今天给大家分享一下另外的一种设计方式,也是在游戏陪玩源码开发中总结出来的一些设计经验,相比restful风格的接口形式,自认为有一些优点,仅供与大家交流。
下图是我画的一个简单的UML图,从图中可以看到,接口的入口仍然是一个Controller,它只有一个doRequest方法。它依赖一个服务工厂类BusiServiceFactory,它负责从Spring容器中获取具体的接口实现实例,然后执行游戏陪玩源码业务。
在这里插入图片描述
2、我以用户登录接口为例:
接口请求的报文定义,报文分为公共参数和业务参数,我将data中的参数定义业务参数,data外层的参数定义为公共参数,目前公共参数定义了serviceName和token。

{#公共参数"serviceName": "userLogin",    #接口名称"token": "",   #认证的token#业务参数"data": {"username": "admin",  #用户名"password": "123456"  #密码}
}

3、与之对应的,我定义了一个RequestMessage的参数对象,便于在游戏陪玩源码中传递参数,并且也可以根据需要扩充参数,如请求的终端设备类型、版本号等等,就不一一列出,下面是RequestMessage的定义,之所以data参数是JSONObject类型,也是方便在后面的游戏陪玩源码中使用。RequestMessage定义如下:

@Setter
@Getter
public class RequestMessage {/*** 接口名称,也是每个接口实现中bean的名称*/private String serviceName;/*** 认证信息*/private String token;/*** 请求者IP*/private String remoteIp;/*** 具体业务参数*/private JSONObject data;
}

4、再来看一下请求入口的MainController类型的实现,在doRequest方法中,将请求的json报文转换成了RequestMessage 对象,然后通过BusiServiceFactory 获取具体的接口实现bean,最后处理游戏陪玩源码业务并将结果返回。具体代码如下:

@RequestMapping("/api/service")
@Controller
public class MainController {@Autowiredprivate BusiServiceFactory busiServiceFactory;/*** 请求入口* @param request* @return*/@PostMapping("/v1")@ResponseBodypublic String doRequest(HttpServletRequest request){Result result = Result.successResult();try {// 读取请求内容String reqBody = IOUtils.toString(request.getInputStream(), StandardCharsets.UTF_8);JSONObject reqJson = JSON.parseObject(reqBody);//转换成RequestMessageRequestMessage reqMessage = JSON.toJavaObject(reqJson, RequestMessage.class);//设置请求者的IP地址,此处仅做示例reqMessage.setRemoteIp(request.getRemoteAddr());//根据接口名称获取具体的接口实现bean,最后处理业务将结果返回BusinessService businessService = busiServiceFactory.getBusiService(reqMessage.getServiceName());result = businessService.doHandle(reqMessage);} catch (IOException e) {e.printStackTrace();result = Result.errorResult();}return JSON.toJSONString(result);}
}

BusiServiceFactory 的实现相当简单,它实现了ApplicationContextAware接口,获取到了Spring容器的上下文,用于从容器中根据Bean名称取得Bean。

@Component
public class BusiServiceFactory implements ApplicationContextAware {private ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}/*** 从spring上下文中获取接口实现的bean* @param beanName* @return*/public BusinessService getBusiService(String beanName){return this.applicationContext.getBean(beanName, BusinessService.class);}
}

当然,MainController也可以实现ApplicationContextAware接口,不用单独写一个BusiServiceFactory来实现,这也是可以的。但从设计的角度来讲,Controller中并不关心这个实现到底从哪来,它只需要知道接口可调用即可。
本例中这个bean是在Spring容器中,如果游戏陪玩源码服务端接口实现使用SPI的方式来配置,只需要改变一下BusiServiceFactory 的实现方式即可。这也是一种可扩展的原则,即在游戏陪玩源码服务端接口设计的时候要充分考虑其它场景,给扩展留有余地。

这篇关于游戏陪玩源码服务端接口设计模式,不走寻常路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac