java 单机接口限流处理方案
286
2022-11-21
本文目录一览:
接口开发需要考虑全面,一般来说接口开发都是比较复杂的(单纯的查询接口除外)。
而且接口这块需要做好安全验证,还需要做好日志记录。
接口开发就是先定义一个接口,不进行具体的实现,由子类实现相应的方法。
如果有方法继承这个接口方法,来进行具体的实现,也就是说的父类引用指向子类对象。
如父类是 “水果”,子类是“苹果”,那么 “水果 水果类 = new 苹果();”实际上最后执行的方法是“苹果”中的具体实现。
Java接口是Java语言中存在的结构,有特定的语法和结构,Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。
接口实现和类继承的规则不同,因为Java接口不涉及表象,因此Java接口本身没有任何实现。
第一个方法是:把一段缓存加载为一个 Lu a 代码块。 这个函数使用 l ua_load 来加载 buff 指向的长度为 sz 的内存区。
这个函数和 lu a_load 返回值相同。 name 作为代码块的名字,用于调试信息和错误消息。 mode 字符串的作用同函数 lu a_load。
第二个方法是:把一个文件加载为 Lu a 代码块。 这个函数使用 lu a_load 加载文件中的数据。 代码块的名字被命名为 filename。 如果 filename 为 NULL, 它从标准输入加载。 如果文件的第一行以 # 打头,则忽略这一行。
mode 字符串的作用同函数 lu a_load。
此函数的返回值和 lua_load 相同, 不过它还可能产生一个叫做 LUA_ERRFILE 的出错码。这种错误发生于无法打开或读入文件时,或是文件的模式错误。
和 lu a_load 一样,这个函数仅加载代码块不运行。
第三个方法是:创建一张新的表,并预分配足够保存下数组 l 内容的空间(但不填充)。 这是给 lu aL_setfuncs 一起用的 (参见 lu aL_newlib)。
它以宏形式实现, 数组 l 必须是一个数组,而不能是一个指针。
如果注册表中已存在键 tname,返回 0 。 否则, 为用户数据的元表创建一张新表。 向这张表加入 __name = tname 键值对, 并将 [tname] = new table 添加到注册表中, 返回 1 。 (__name项可用于一些错误输出函数。)
这两种情况都会把最终的注册表中关联 tname 的值压栈。
第四个方法是:创建一个新的 Lua 状态机。 它以一个基于标准 C 的 realloc 函数实现的内存分配器 调用 lua_newstate 。 并把可打印一些出错信息到标准错误输出的 panic 函数(参见) 设置好,用于处理致命错误。
返回新的状态机。 如果内存分配失败,则返回 NULL 。
如果函数的第 arg 个参数是一个 整数(或可以转换为一个整数), 返回该整数。 若该参数不存在或是 nil, 返回 d。 除此之外的情况,抛出错误。
如果函数的第 arg 个参数是一个 字符串,返回该字符串。 若该参数不存在或是 nil, 返回 d。 除此之外的情况,抛出错误。
若 l 不为 NULL, 将结果的长度填入 *l 。
网站的开发接口意思是在一些网站上、软件系统中或游戏应用中等能把一个链接带进另外的应用的模块。
例如在一格网站上设置支付宝登录接口。这个支付宝接口开发和设计就是这种模块的从设计、实现到应用的三个过程。
网站接口开发很简单,大概流程是这样的
1.开发人员和第三方讨论需要实现哪些接口;
2,开发人员编写详细设计文档;
3,科技人员对设计要求高科技和一些进行编码;
4,开发人员对这个初步开发和试用的产品进行测试和检测;产品的生产评估和上线;
开发自己的api需要准备几个工作:
第一:你的API的功能
第二:你的API访问协议,如:socket,http
第三:你的API的认证方式,如:curl,oauth
第四:你的API开发语言
magic-api 是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口。
1,引入magic-api-spring-boot-starter依赖
org.ssssssss
magic-api-spring-boot-starter
1.7.1
2,application.yml 中配置
magic-api:
#配置web页面入口
web: /magic/web
resource:
# location: /data/magic-api
type: database # 配置接口存储方式,这里选择存在数据库中
table-name: magic_api_file # 数据库中的表名
3,启动服务,访问magic-api web页面
1,RequestParam
GET ;age=49
这样的URL参数magic-api 会自动将name和age映射为同名变量
2,表单参数
POST
name=abcage=49
这样的表单参数magic-api 也会自动将name和age映射为同名变量。
3,Request Header参数获取
magic-api 会对所有RequestHeader统一封装为一个名为header的变量 如要获取 token 可以通过header.token 来获取。
4,POST请求的Request Body参数获取
{
"name": "magic-api"
}
如要获取name属性 则可通过 body.name 来获取
5,Path参数获取
主要是针对URL定义为{id} 的类似接口
如要获取path路径上的id可通过path.id 或 id来获取
6,Cookie,Session参数获取
可以通过cookie.xxx,session.xxx来获取
1,#{} 注入参数,${} 拼接参数
作用和mybatis用法一致
id = #{id};
id=${id};
2,动态SQL参数
通过?{condition,expression}来实现动态拼接SQL,如果条件成立则拼接后部分内容SQL中,与mybatis中的if标签基本一致
return db.select("select * from sys_user ?{id,where id = #{id}}");
相当于mybatis中的
3,Mybatis 语法支持
1.6.0以后的版本支持Mybatis语法
操作入口 db.table('table_name')
1,insert
return db.table('sys_user').insert({ user_name : '李富贵', role : 'admin'})
// insert into sys_user(user_name,role) values('李富贵','admin')
2,update
return db.table('base_dict').primary('code').update({ code: 'insertTerst', name : '测试insert'})
//update base_dict set name = ? where code = ?
3,save
用法和insert相似
return db.table('sys_user').primary('id', uuid()).save({user_name: '李富贵'});
// insert into sys_user(id,user_name) values('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx','李富贵');
4,select,page,where
return db.table('sys_user').select()
return db.table('sys_user').page()
return db.table('sys_user')
.where()
.like('user_name','%李富贵%')
.eq('role','admin')
.select()
yml中配置分页参数
magic-api:
page-config:
size: size # 页大小的请求参数名称
page: page # 页码的请求参数名称
default-page: 1 # 未传页码时的默认首页
default-size: 10 # 未传页大小时的默认页大小
自动分页
使用yml中配置的分页参数
return db.page("""select * from base_dict_detail""")
手动分页
跳过前3条记录,然后取5条
return db.page("""select * from base_dict_detail""",5,3)
自定义分页参数获取
实现 PageProvider接口,复写getPage方法 {
public Page getPage(RuntimeContext runtimeContext) {
long page = 2;
long pageSize = 3;
return new Page(pageSize, (page - 1) * pageSize);
}
此模式会覆盖yml的配置内容
目前内置了三种状态码,分别为 执行成功(1),参数验证失败(0),以及系统异常(-1)
自定义状态码
magic-api:
response-code-config:
success: 200 #执行成功的code值
invalid: 400 #参数验证未通过的code值
exception: 500 #执行出现异常的code值
默认返回格式
{
"code": 1, // 状态码
"message": "success", // 状态说明
"data": ..., // 返回的数据内容
"timestamp": 1629610503506, // 服务器时间
"executeTime": 1 // 执行时间
}
自定义返回格式
magic-api:
response: |- #配置JSON格式,格式为magic-script中的表达式
{
code: code,
message: message,
data,
timestamp,
requestTime,
executeTime,
}
自定义结构配置
实现ResultProvider接口,重写buildResult方法
引入swagger依赖
在yml文件中配置
magic-api:
swagger-config:
version: 1.0.0
description: magic测试文档
title: magic测试
name: 配置化实现
location: /v2/api-docs/magic-api/swagger2.json
Magic-api通过springboot自动配置的方式配置了resource,dataSource,interceptor等内容。
在服务启动时,生成MagicConfiguration注入容器时,通过mappingHandlerMapping.registerAllMapping();来注册所有映射(即在界面上配置的接口请求地址和接口的实际处理类、方法的映射)。映射关系注册到handleMapping中,并在内存中通过ConcurrentHashMap来缓存映射关系
接口调用时,在DispatcherServlet中通过url去寻找handler,找到magic-api的统一处理RequestHandler以及处理方法invoke。
在invoke中根据请求方法和路径获取接口信息封装在ApiInfo中,然后进行参数的验证封装。实际脚本的执行,以及对返回结果的包装
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~