apinto OpenAPI
OpenApi
上游
查询列表
查询详情
新增
{
"name": "jg_upstream",
"driver": "http",
"description": "通过postman添加上游",
"scheme": "HTTPS",
"retry":"1",
"timeout": 1000,
"nodes": [
"127.0.0.1:80 weight=1"
],
"balance": "round-robin",
"pass_host": "node"
}
修改
如果名称或者id不存在则创建
{
"driver": "http",
"description": "修改通过postman添加上游",
"scheme": "HTTPS",
"retry":"3",
"timeout": 2000,
"nodes": [
"127.0.0.2:80 weight=1"
],
"balance": "round-robin",
"pass_host": "node"
}
删除
根据名字或者id
应用
查询列表
查询详情
新增
{
"additional": [],
"anonymous": false,
"auth": [
{
"config": {
"expire": 0,
"password": "jg_app",
"username": "jg_app"
},
"position": "header",
"token_name": "Authorization",
"type": "basic",
"users": [
{
"expire": 0,
"hide_credential": false,
"pattern": {
"password": "jg_app",
"username": "jg_app"
}
}
]
}
],
"description": "postman新增应用",
"driver": "app",
"id": "jg_app@app",
"labels": {},
"name": "jg_app"
}
修改
{
"additional": [],
"anonymous": false,
"auth": [
{
"config": {
"expire": 0,
"password": "jg_app1",
"username": "jg_app1"
},
"position": "header",
"token_name": "Authorization",
"type": "basic",
"users": [
{
"expire": 0,
"hide_credential": false,
"pattern": {
"password": "jg_app1",
"username": "jg_app1"
}
}
]
}
],
"description": "修改postman新增应用",
"driver": "app",
"labels": {},
"name":"修改了名字"
}
删除
API
查询列表
http://172.30.4.85:9400/api/router
查询详情
新增
#当http请求同时满足以下条件时才能匹配这个路由
#method为GET或者POST
#请求头内host的值后缀为.com
#请求路径uri为/demo
#头部存在name这个key,且对应值不为空值
#请求参数里包含key为id,且值不为123
{
"name": "complex_router",
"driver": "http",
"description": "一个匹配规则较复杂的路由",
"listen": 8099,
"method": [
"GET",
"POST"
],
"location": "/demo",
"host": ["*.com"],
"rules": [
{
"type":"header",
"name":"user",
"value":"apinto"
}
],
"service": "anonymous_service@service",
"template": ""
}
Plugin:自定义的插件
proxy_rewrite:重定向
{
"description": "新增api",
"disable": false,
"driver": "http",
"host": [],
"listen": 0,
"location": "/jg/delete",
"method": [
"DELETE"
],
"name": "jg_api",
"plugins": {
"proxy_rewrite": {
"config": {
"headers": {},
"host_rewrite": false,
"not_match_err": true,
"path_type": "prefix",
"prefix_path": [
{
"prefix_path_match": "/test",
"prefix_path_replace": "/test"
}
]
},
"disable": false
}
},
"profession": "router",
"retry": 0,
"rules": [],
"service": "upstream_test@service",
"template": "",
"time_out": 10000,
"websocket": false
}
修改
{
"description": "新增api",
"disable": false,
"driver": "http",
"host": [],
"listen": 0,
"location": "/delete",
"method": [
"DELETE"
],
"name": "jg_api",
"plugins": {
"proxy_rewrite": {
"config": {
"headers": {},
"host_rewrite": false,
"not_match_err": true,
"path_type": "prefix",
"prefix_path": [
{
"prefix_path_match": "/delete", //代理path
"prefix_path_replace": "/test" //数据源地址
}
]
},
"disable": false
}
},
"profession": "router",
"retry": 0,
"rules": [],
"service": "upstream_test@service",
"template": "",
"time_out": 10000,
"websocket": false
}
删除
策略
查询列表类型
查询策略列表
http://172.30.4.85:9400/api/strategy
查询策略详情
删除
访问策略
筛选的是所有的10.11.55.82服务器发送的get方法,
新增
过滤规则和生效规则,可以理解为什么可以做或不能做什么
如拒绝82服务发起的get请求,生效范围是所有请求
{
"description": "拒绝策略",
"driver": "visit",
"filters": {
"ip": [
"10.11.55.82"
],
"method": [
"GET"
]
},
"name": "ip_get",
"priority": 1,
"profession": "strategy",
"stop": false,
"visit": {
"continue": false,
"influence_sphere": {
"api": [
"ALL"
]
},
"visit_rule": "refuse"
}
}
修改
流量限制
新增
{
"description": "",
"driver": "limiting",
"filters": {
"method": [
"ALL"
]
},
"limiting": {
"metrics": [
"{api}"
],
"query": {
"hour": 10000,
"minute": 1000,
"second": 100
},
"response": {
"body": "{ \"msg\":\"很抱歉,$api 暂停服务,请稍候再试!,被流控了1111\"}",
"charset": "UTF-8",
"content_type": "application/json",
"status_code": 200
},
"traffic": {
"hour": 10000,
"minute": 1000,
"second": 100
}
},
"name": "jg_limite",
"priority": 1,
"profession": "strategy",
"stop": false
}
修改
{
"description": "修改流控",
"driver": "limiting",
"filters": {
"method": [
"ALL"
]
},
"limiting": {
"metrics": [
"{api}"
],
"query": {
"hour": 10000,
"minute": 1000,
"second": 100
},
"response": {
"body": "{ \"msg\":\"很抱歉,$api 暂停服务,请稍候再试!,被流控了1111\"}",
"charset": "UTF-8",
"content_type": "application/json",
"status_code": 200
},
"traffic": {
"hour": 10000,
"minute": 1000,
"second": 100
}
},
"name": "jg_limite",
"priority": 1,
"profession": "strategy",
"stop": false
}
灰度发布
一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。
新增
{
"description": "新增灰度",
"driver": "grey",
"filters": {},
"grey": {
"distribution": "percent",
"keep_session": false,
"matching": [],
"nodes": [
"172.30.4.81:4561"
],
"percent": 4800
},
"name": "jg_huidu",
"priority": 1,
"profession": "strategy",
"stop": false
}
修改
测试结果
5000代表50%,一次执行api本来地址,一次执行配置的新地址。
熔断
简单来说,用API的“出错比例”来表示这个API的健康状态,当这个比例值高于设定的阈值,API自动抛出异常,终止服务,这个过程就叫做自动熔断
Api有三种状态,健康期、观察期、熔断期
健康期正常转发到后端
熔断期直接返回预定的值
观察期允许转发到后端,失败达到阈值转入熔断期,成功达到预定阈值转入健康期
比如访问服务每秒失败三次进入熔断期,设置熔断持续时间2(2秒为基准,乘以连续熔断次数,第1次熔断时间为2秒,连续第2次熔断时间为2秒乘以2为4秒),达到熔断时间进入观察期,可以正常请求后端,请求成功达到每秒3次进入健康期,请求失败达到每秒2次则再次进入熔断,随着连续熔断次数增多,熔断时间会越来越大,设置最大熔断持续时间500。设置熔断响应内容
新增
{
"description": "新增熔断",
"driver": "fuse",
"filters": {
"api": [
"659bbf16-9c59-5414-8247-fde143eb783b"
],
"method": [
"GET"
]
},
"fuse": {
"fuse_condition": {
"count": 1,
"status_codes": [
500
]
},
"fuse_time": {
"max_time": 300,
"time": 2
},
"metric": "{service}",
"recover_condition": {
"count": 3,
"status_codes": [
200
]
},
"response": {
"body": "{ \"msg\":\"很抱歉,$api 暂停服务,请稍候再试!,被熔断了\"}",
"charset": "UTF-8",
"content_type": "application/json",
"status_code": 200
}
},
"name": "jg_rongduan",
"priority": 1,
"profession": "strategy",
"stop": false
}
修改
{
"description": "修改熔断",
"driver": "fuse",
"filters": {
"api": [
"659bbf16-9c59-5414-8247-fde143eb783b"
],
"method": [
"ALL"
]
},
"fuse": {
"fuse_condition": {
"count": 5,
"status_codes": [
500
]
},
"fuse_time": {
"max_time": 200,
"time": 2
},
"metric": "{service}",
"recover_condition": {
"count": 4,
"status_codes": [
200
]
},
"response": {
"body": "{ \"msg\":\"很抱歉,$api 暂停服务,请稍候再试!,被熔断了\"}",
"charset": "UTF-8",
"content_type": "application/json",
"status_code": 200
}
},
"name": "jg_rongduan",
"priority": 1,
"profession": "strategy",
"stop": false
}
服务发现
新增
http://172.30.4.85:9400/api/discovery
{
"config": {
"address": [
"http://172.30.3.113:8848"
],
"address_static": [
"http://172.30.3.113:8848"
],
"params": {
"password": "nacos ",
"username": "nacos"
}
},
"description": "nacos服务发现22222222",
"driver": "nacos",
"name": "nacos_dis",
"profession": "discovery"
}
修改
所有查询
172.30.4.84:9400/api/discovery
查询详情
172.30.4.85:9400/api/discovery/nacos_dis@discovery
上游服务绑定服务发现
http://172.30.4.84:9400/api/service
{
"name": "nacos_up_postman",
"driver": "http",
"description": "postman新增nacos上游",
"timeout": 1000,
"retry": 3,
"discovery": "nacos_dis@discovery",
"service": "esb-console-biz",
"balance": "round-robin",
"pass_host": "node",
"profession": "service",
"scheme": "HTTP",
"use_discovery": true
}
创建一个api绑定nacos服务发现
http://172.30.4.85:9400/api/router/
{
"description": "post添加api通过nacos发现服务",
"disable": false,
"driver": "http",
"host": [],
"listen": 0,
"location": "/console/v1/businesstagconfig",
"method": [
"GET"
],
"name": "postman_api_nacos",
"plugins": {
"proxy_rewrite": {
"config": {
"headers": {},
"host_rewrite": false,
"not_match_err": true,
"path_type": "prefix",
"prefix_path": [
{
"prefix_path_match": "/console/v1/businesstagconfig",
"prefix_path_replace": "/console/v1/businesstagconfig"
}
]
},
"disable": false
}
},
"profession": "router",
"retry": 0,
"rules": [
{
"type": "header",
"name": "ss",
"value": "dd"
}
],
"service": "nacos_up_postman@service",
"template": "",
"time_out": 10000,
"websocket": false
}
插件
查询
172.30.4.85:9400/api/template/
查询详情
172.30.4.85:9400/api/template/cc4538eb-abb8-4f09-2d2d-7e4d35f9e3db@template
新增
172.30.4.85:9400/api/template
{
"description": "postam 新增插件添加额外参数",
"driver": "plugin_template",
"name": "postman_plugin",
"plugins": {
"extra_params": {
"config": {
"error_type": "text",
"params": [
{
"conflict": "origin",
"name": "addparamter",
"position": "header",
"value": "paramtervalue"
}
]
},
"disable": false
}
},
"profession": "template"
}
API绑定插件
172.30.4.85:9400/api/router/
{
"description": "新增api绑定插件模板",
"disable": false,
"driver": "http",
"host": [],
"listen": 0,
"location": "/single/delete",
"method": [
"DELETE"
],
"name": "template_api",
"plugins": {
"proxy_rewrite": {
"config": {
"headers": {},
"host_rewrite": false,
"not_match_err": true,
"path_type": "prefix",
"prefix_path": [
{
"prefix_path_match": "/single",
"prefix_path_replace": "/single"
}
]
},
"disable": false
}
},
"profession": "router",
"retry": 0,
"rules": [],
"service": "test@service",
"time_out": 10000,
"template":” postman_plugin@template",
"websocket": false
}
日志
Kafka日志
查询
172.30.4.85:9400/api/output
查询详情
172.30.4.85:9400/api/output/kafka_access@output
新增
172.30.4.85:9400/api/output/
{
"address": "127.0.0.1",
"content_resize": [
{
"size": 11,
"suffix": "log"
}
],
"description": "postman_kafaka日志",
"driver": "kafka_output",
"formatter": {
"fields": [
"$request_id",
"$request",
"$status",
"@time",
"@proxy",
"$response_time"
],
"proxy": [
"$proxy_uri",
"$proxy_scheme",
"$proxy_addr"
],
"time": [
"$msec",
"$time_iso8601",
"$time_local"
]
},
"kafka_version": "3.1.0",
"name": "kafka_access_postman",
"partition_type": "hash",
"profession": "output",
"scopes": [
"access_log"
],
"timeout": 10,
"topic": "ddd",
"type": "json"
}
新增文件日志
{
"content_resize": [
{
"size": 3,
"suffix": "log"
}
],
"description": "postman 添加文件日志",
"dir": "/var/log/apinto",
"driver": "file",
"expore": "3",
"file": "access",
"formatter": {
"fields": [
"$time_iso8601",
"$request_id",
"@request",
"@proxy",
"@response",
"@status_code",
"@time"
],
"proxy": [
"$proxy_method",
"$proxy_scheme",
"$proxy_uri",
"$proxy_host",
"$proxy_header",
"$proxy_addr"
],
"request": [
"$request_method",
"$scheme",
"$request_uri",
"$host",
"$header",
"$remote_addr"
],
"response": [
"$response_header"
],
"status_code": [
"$status",
"$proxy_status"
],
"time": [
"$request_time",
"$response_time"
]
},
"name": "postman_access",
"period": "day",
"profession": "output",
"scopes": [
"access_log"
],
"type": "json"
}
相关文章:

apinto OpenAPI
OpenApi 上游 查询列表 查询详情 新增 { "name": "jg_upstream", "driver": "http", "description": "通过postman添加上游", "scheme": "HTTPS", "retry":"1", "…...

XYCTF - web
目录 warm up ezMake ezhttp ezmd5 牢牢记住,逝者为大 ezPOP 我是一个复读机 ezSerialize 第一关 第二关 第三关 第一种方法: 第二种方法: ez?Make 方法一:利用反弹shell 方法二:通过进制编码绕过 ε…...

学习方法的重要性
原贴:https://www.cnblogs.com/feily/p/13999204.html 原贴:https://36kr.com/p/1236733055209095 1、 “一万小时定律”的正确和误区 正确: 天才和大师的非凡,不是真的天资超人一等,而是付出了持续不断的努力&…...
把现有的 Jenkins 容器推送到一个新的镜像标签,并且重新启动新的容器
要把现有的 Jenkins 容器推送到一个新的镜像标签,并且重新启动新的容器,你可以按照以下步骤操作: 停止当前正在运行的 Jenkins 容器(如果你不想在操作时中断服务,可以跳过此步骤,直接进行下一步)…...

难以重现的 Bug如何处理
对很多测试人员(尤其是对新手来说)在工作过程中最不愿遇到的一件事情就是:在测试过 程中发现了一个问题,觉得是 bug,再试的时候又正常了。 碰到这样的事情,职业素养和测试人员长期养成的死磕的习性会让她…...

我与足球的故事 | 10年的热爱 | 伤病 | 悔恨 | 放弃 or 继续 | 小学生的碎碎念罢了
今天不分享技术博客,今天不知道为什么就是想写我和足球的故事(手术完两个礼拜,手还是很疼那个,就连打字都费劲),上面两张图是我最喜欢的两个球星,当然因为之前特别喜欢巴萨,也特别喜…...

js图片回显的方法
直接上代码: <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body>// HTML部分<input type"file" id"fileInput"><button onclick"show…...

Java中的maven的安装和配置
maven的作用 依赖管理 方便快捷的管理项目依赖的资源,避免版本冲突问题 统一项目管理 提供标准,统一的项目结构 项目构建 标准跨平台(Linux、windows、MacOS)的自动化项目构建方式 maven的安装和配置 在maven官网下载maven Ma…...

轴承制造企业“数智化”突破口
轴承是当代机械设备中一种重要零部件。它的主要功能是支撑机械旋转体,降低其运动过程中的摩擦系数,并保证其回转精度。轴承是工业核心基础零部件,对国民经济发展和国防建设起着重要的支撑作用。 轴承企业普遍采用以销定产的经营模式…...
UIButton案例之添加动画
需求 基于上一节代码进行精简,降低了冗余性。添加动画,使得坐标变化自然,同时使用了bounds属性和center属性,使得UIView变化以中心点为基准。 此外,使用两种方式添加动画:1.原始方式。 2.block方式。 代码…...
C#链接数据库、操作sql、选择串口
// 公共增删方法 using MySql.Data.MySqlClient; using System.Data; namespace ****** {public class MySQLHelper{private MySqlConnection conn null;private MySqlCommand comm null;private MySqlDataReader reader null;/// <summary>/// 构造方法里建议连…...

本地搭建各大直播平台录屏服务结合内网穿透工具实现远程管理录屏任务
文章目录 1. Bililive-go与套件下载1.1 获取ffmpeg1.2 获取Bililive-go1.3 配置套件 2. 本地运行测试3. 录屏设置演示4. 内网穿透工具下载安装5. 配置Bililive-go公网地址6. 配置固定公网地址 本文主要介绍如何在Windows系统电脑本地部署直播录屏利器Bililive-go,并…...

macos使用yarn创建vite时出现Usage Error: The nearest package directory问题
步骤是macos上使用了yarn create vite在window上是直接可以使用了yarn但是在macos上就出现报错 我们仔细看,它说的If /Users/chentianyu isnt intended to be a project, remove any yarn.lock and/or package.json file there.说是要我们清除yarn.lock和package.js…...

【JAVA入门】Day04 - 方法
【JAVA入门】Day04 - 方法 文章目录 【JAVA入门】Day04 - 方法一、方法的格式1.1 无参无返回值的方法定义和调用1.2 带参数的方法定义和调用1.3 形参和实参1.4 带返回值的方法定义和调用1.5 方法的注意事项 二、方法的重载三、方法的使用四、方法的内存原理4.1 方法调用的基本内…...

前端报错 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse
问题描述 控制台提示 SyntaxError: Unexpected number in JSON at position xxxx at JSON.parse 问题原因 原因:JSON 数据格式错误,是否符合 JSON 格式。 解决方法 应为json格式数据 什么是json格式数据 JSON(JavaScript Object …...

Mybatis进阶详细用法
目录 条件构造器 案例 自定义SQL 案例 Service接口 案例 综合案例 条件构造器 案例 Testvoid testQueryMapper() {// 创建 QueryWrapper 实例QueryWrapper<User> queryWrapper new QueryWrapper<>();queryWrapper.select("id," "username,&…...

Android 系统省电软件分析
1、硬件耗电 主要有: 1、屏幕 2、CPU 3、WLAN 4、感应器 5、GPS(目前我们没有) 电量其实是目前手持设备最宝贵的资源之一,大多数设备都需要不断的充电来维持继续使用。不幸的是,对于开发者来说,电量优化是他们最后才会考虑的的事情…...

了解什么是Docker
了解什么是Docker Docker 是一个开源的应用容器引擎,它允许开发者打包应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类…...

ChatGPT开源的whisper音频生成字幕
1、前言 好了,那接下来看一下whisper开源库的介绍 有五种模型大小,其中四种仅支持英语,提供速度和准确性的权衡。上面便是可用模型的名称、大致的内存需求和相对速度。如果是英文版的语音,直接想转换为英文。 本来我是想直接在我的…...

融知财经:期货和现货的区别是什么?哪个风险大?
期货和现货在交易对象等方面存在明显的区别。期货交易是一种衍生金融工具,主要用于价格发现、风险管理和投机,而现货交易则是商品和服务的实际买卖。在选择进行期货交易还是现货交易时,投资者需要根据自己的需求和市场情况来决定。 期货和现货…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...

aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)
漏洞概述 漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号:CVE-2023-25194 CVSS评分:8.8 影响版本:Apache Kafka 2.3.0 - 3.3.2 修复版本:≥ 3.4.0 漏洞类型:反序列化导致的远程代…...