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

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

相关文章

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Go中sync.Once源码的深度讲解

《Go中sync.Once源码的深度讲解》sync.Once是Go语言标准库中的一个同步原语,用于确保某个操作只执行一次,本文将从源码出发为大家详细介绍一下sync.Once的具体使用,x希望对大家有... 目录概念简单示例源码解读总结概念sync.Once是Go语言标准库中的一个同步原语,用于确保某个操

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket