大厂都在用的管理型网关解密:Fizz管理后台使用教程

Fizz管理后台使用教程

前言

Fizz Gateway 是一个基于 Java异步框架WebFlux开发的微服务网关,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。Fizz管理后台是Fizz Gateway的配套系统,基于Java、Vue开发,提供友好的图形化配置界面,支撑Fizz Gateway的热服务编排、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、自定义插件等功能的配置使用。本篇文章介绍Fizz管理后台的使用。

功能

Fizz管理后台包含如下功能:

  • 网关管理
    • 网关分组:对Fizz网关集群内的机器进行逻辑上的分组,针对不同的分组可配置不同的路由策略。
    • 插件管理:维护插件元数据,定义路由级别的自定义属性、插件级别的自定义配置信息。
    • appID管理:配置应用鉴权信息,可配置是否启用签名、是否启用IP白名单,AppID级别的自定义配置供自定义插件使用。
    • 路由管理:配置服务或API路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。
    • 接口统计:Fizz网关接口访问统计功能,以图表的形式展示指定时间段内每日的接口总数、访问次数,可查看接口的历史访问总次数以及最近请求时间。
  • 服务编排
    • 服务管理:聚合接口归属于服务,服务通过该功能维护,创建人自动获得服务权限,服务权限可分配,拥有权限的用户才能操作对应的接口列表。
    • 接口列表:基于现有的业务微服务使用在线配置的方式快速的生成一个聚合接口,同时提供在线测试功能,发布历史版本查看。
    • 操作日志:查看聚合接口的新增、修改、发布、下线、回滚、删除操作日志。
    • 网关缓存:查看Fizz网关当前在线的实例列表以及对应实例本地缓存的已发布接口信息。
  • 发布申请
    • 我的申请:提交接口发布|下线申请,审核通过后可以对相关接口执行发布|下线操作。
    • 待审核:审核发布|下线申请。
    • 审核日志:查看审核发布|下线申请操作日志。
  • 权限管理
    • 角色管理:维护角色数据,为角色分配权限。
  • 系统管理
    • 用户管理:维护用户数据,为用户分配角色。

登录

Fizz管理后台使用账号密码登录,登录界面如图所示。

manager_overview_1.png

输入账号、密码、验证码后登录后台,后台验证成功后跳转至后台主界面,如图所示。

manager_overview_2.png

网关管理

网关管理模块主要用于维护Fizz Gateway的路由配置,本章节介绍网关管理下的路由管理功能的使用。

路由管理概述

路由管理功能用于维护网关的路由规则,支持按请求路径转发、转发到指定后端服务两种转发规则,支持插件配置。

路由列表

菜单位置:网关管理 > 路由管理。点击菜单后进入路由列表页面,如图所示。

manager_api_auth_list_query.png

新增路由

点击 新增 按钮弹出新增窗口,如图所示。

manager_api_auth_add_1.png
manager_api_auth_add_2.png

网关分组:选取路由关联的网关分组,只有属于所选分组的网关实例路由规则才会生效,必选;

服务:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},服务对应{service}段,当 转发 选择 按请求路径转发 时服务需要是聚合配置的服务或者是Eureka注册的服务,当 转发 选择 转发到指定后端服务 时服务不需要是实际存在的服务,只用于路径匹配使用,长度不能超过50个字符,必填;

API方法:请求的method类型,可选GET|POST;

API Path:网关的请求路径格式为 http://{ip}:{port}/proxy/{service}{apiPath},API Path对应{apiPath}段,使用前缀匹配原则,例如"/api/"将匹配"/api/"、"/api/1"、"/api/1/1"等路径;

应用:选取路由关联的应用,网关使用选取应用的信息进行鉴权,更多详情请查看appID管理功能介绍;

访问:可选允许|禁止,必选;

转发:可选按请求路径转发|转发到指定后端服务,当选择 按请求路径转发 时,请求会按请求路径转发,例如网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://my-service/api-path;当选择 转发到指定后端服务 时,需要添加转发到的后端服务URL,请求会转发到配置的后端服务,例如配置了服务为 my-service,API Path为空,后端服务URL为 http://127.0.0.1:8080/forward-service/,网关请求 http://{ip}:{port}/proxy/my-service/api-path 将转发到 http://127.0.0.1:8080/forward-service/api-path

点击 添加插件 按钮为路由添加插件,如图所示。

manager_api_auth_add_3.png

配置插件路由级别的自定义配置,表单界面来自于插件的表单定义,更多详情请查看插件管理功能介绍。

manager_api_auth_add_4.png

配置完成后点击 保存 按钮保存路由规则。

manager_api_auth_add_5.png

编辑路由

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_api_auth_edit_1.png
manager_api_auth_edit_2.png

删除路由

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_api_auth_delete_1.png
manager_api_auth_delete_2.png

服务编排

服务编排模块主要用于维护Fizz Gateway的热服务编排配置,本章节介绍服务编排下的接口列表功能的使用。

接口列表概述

接口列表功能用于维护聚合接口,聚合接口从外部调用方角度看是一个简单的接口,通过入参请求获取响应结果,内部实现会调用多个底层后端服务,将多个调用结果聚合转换成外部调用方想要的数据格式。

接口列表

菜单位置:服务编排 > 接口列表。点击菜单后进入接口列表页面,如图所示。

manager_aggregate_list_query.png

新增接口

点击 新增 按钮弹出新增窗口,如图所示。

manager_aggregate_add_1.png

基础信息

manager_aggregate_add_2.png

所属服务:接口所属服务,更多详情请查看服务管理功能介绍,必选;

接口名:接口名称,用于展示使用,长度不能超过200个字符,必填;

方法:接口请求方法类型,可选GET|POST,必选;

路径:接口请求路径后缀,长度不能超过2000个字符,必填;

开发人员:接口对应负责的开发人员,长度不能超过200个字符;

描述:接口功能描述,长度不能超过2000个字符;

举个例子,所属服务设置my-test-service,方法设置POST,路径设置test-aggregate-post,对应的聚合接口请求为 POST http://{Fizz网关ip地址}:{port端口}/proxy/my-test-service/test-aggregate-post。

配置输入

聚合接口的入参大部分是通过JSON Schema来定义的,下面先简单地介绍下JSON Schema。

JSON Schema介绍

JSON Schema实际上也是JSON数据,用于标注和验证JSON文档,可以类比于XML Schema,当前最新版本2019-09。

作为普通用户,我们并不需要去了解JSON Schema的规范内容,只要能够构建JSON Schema即可。

要理解JSON Schema,首先要理解什么是JSON。JSON是JavaScript Object Notation的缩写,一种简单的数据交换格式。最初JSON是基于JavaScript,广泛的应用于万维网。由于其简洁和清晰的层次结构、易于人阅读等特性,使得越来越多的场景下被采用。

JSON包含以下数据结构:

  • object:
    { "key1": "value1", "key2": "value2" }
    
  • array:
    [ "first", "second", "third" ]
    
  • number:
    42
    3.1415926
    
  • string:
    "This is a string"
    
  • boolean:
    true
    false
    
  • null:
    null
    

通过以上的简单数据类型,就能构造复杂的结构化数据了。下面举两个例子:

{
  "name": "George Washington",
  "birthday": "February 22, 1732",
  "address": "Mount Vernon, Virginia, United States"
}
{
  "first_name": "George",
  "last_name": "Washington",
  "birthday": "1732-02-22",
  "address": {
    "street_address": "3200 Mount Vernon Memorial Highway",
    "city": "Mount Vernon",
    "state": "Virginia",
    "country": "United States"
  }
}

以上两个例子都是有效的JSON数据,包含一样的有效信息,但是当程序读取数据时,需要准确的知道数据是怎么组织的,比如哪些字段是必须,这些字段是什么类型。这时候JSON Schema就派上用场了,看以下JSON Schema例子:

{
  "type": "object",
  "properties": {
    "first_name": { "type": "string" },
    "last_name": { "type": "string" },
    "birthday": { "type": "string", "format": "date" },
    "address": {
      "type": "object",
      "properties": {
        "street_address": { "type": "string" },
        "city": { "type": "string" },
        "state": { "type": "string" },
        "country": { "type" : "string" }
      }
    }
  }
}

用以上JSON Schema验证第一个例子时,验证失败;但是第二个例子验证通过。

JSON Schema本身也是通过JSON编写,其本身也是数据,不是一个计算机程序,只是一种“描述其它数据的结构”的声明格式。这既是长处,也是弱点,JSON Schema可以简洁地描述数据的结构并且自动验证数据,但是对于数据元素间的关系表达就力不能及了。

更多JSON Schema知识可以阅读Understanding JSON Schema

请求头部

定义聚合接口的请求Header参数。

manager_aggregate_add_3.png

举个例子:

{
  "type": "object",
  "properties": {
    "headerParam1": {
      "type": "string",
      "title": "请求头参数1",
      "titleEn": "headerParam1"
    }
  },
  "required": [
    "headerParam1"
  ]
}

以上例子定义了必传请求头参数headerParam1

title字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“请求头参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_header_1.png

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传请求头时会提示“headerParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_header_2.png
请求体

定义聚合接口的请求体参数。

manager_aggregate_add_4.png

举个例子:

{
  "type": "object",
  "properties": {
    "bodyParam1": {
      "type": "string",
      "title": "请求体参数1",
      "titleEn": "bodyParam1"
    }
  },
  "required": [
    "bodyParam1"
  ]
}

以上例子定义了必传请求体参数bodyParam1

title字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“请求体参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_body_1.png

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传请求体参数时会提示“bodyParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_body_2.png
Query参数

定义聚合接口的Query参数。

manager_aggregate_add_5.png

举个例子:

{
  "type": "object",
  "properties": {
    "queryParam1": {
      "type": "string",
      "title": "query参数1",
      "titleEn": "queryParam1"
    }
  },
  "required": [
    "queryParam1"
  ]
}

以上例子定义了必传Query参数queryParam1

title字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“query参数1不能为空”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_query_1.png

当定义了语言配置(详情请查看后文的语言配置介绍)选项为英文时会使用titleEn字段用于验证失败时提示使用,例如请求接口时没传Query参数时会提示“queryParam1 is missing but it is required”(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_query_2.png
脚本校验

对于JSON Schema规范无法覆盖的校验场景可以使用脚本对入参进行更加灵活的处理。

manager_aggregate_add_6.png

点击 新增 按钮后弹出脚本配置窗口,如图所示。

manager_aggregate_add_7.png

脚本类型:可选javascript|groovy,必选;

脚本内容:所选的脚本类型语言编写的入参验证脚本,必填。

举个例子:

// javascript脚本函数名不能修改
function dyFunc(paramsJsonStr) {
  // 上下文, 数据结构请参考 context.js
  var context = JSON.parse(paramsJsonStr)['context'];
  // common为内置的上下文便捷操作工具类,详情请参考common.js;例如:
  // var data = common.getStepRespBody(context, 'step2', 'request1', 'data');

  // do something
  var headerParam1 = common.getInputReqHeader(context, 'headerParam1');
  var bodyParam1 = common.getInputReqBody(context, 'bodyParam1');
  var queryParam1 = common.getInputReqParam(context, 'queryParam1');
  var result = new Array();
  if (headerParam1 != bodyParam1) {
    result.push("headerParam1与bodyParam1不一致");
  }
  if (queryParam1 != bodyParam1) {
    result.push("queryParam1与bodyParam1不一致");
  }
  if (headerParam1 != queryParam1) {
    result.push("headerParam1与queryParam1不一致");
  }

  // 返回结果为Array或Object时要先转为json字符串
  return JSON.stringify(result);
}

以上例子使用javascript编写参数校验,限制入参headerParam1bodyParam1queryParam1必须一致,不一致将提示错误信息(错误提示输出通过校验结果配置,详情请看后文介绍),如图所示。

manager_aggregate_add_input_script.png
语言配置

聚合接口默认使用中文响应校验失败提示,通过配置可通过入参选择不同的提示语言,目前支持中文、英文提示(已满足我们的业务使用场景,有其他语言要求的小伙伴可以联系我们添加)。

manager_aggregate_add_8.png

字段:入参字段值,例如input.request.body.languageCode使用请求体参数languageCode的值来决定使用哪种语言;

中文:中文与入参字段值的映射关系,例如配置0,当请求入参字段值为0时使用中文提示校验结果;

英文:英文与入参字段值的映射关系,例如配置1,当请求入参字段值为1时使用中文提示校验结果。

配置步骤

聚合接口调用底层服务是通过多个step实现的,多个step串行执行,每个step包含多个request(对底层服务接口的调用),同个step里的多个request并行执行,后执行的step可以获取已执行step的执行结果,更多详情请查看服务编排文章的介绍,下面介绍配置步骤的使用。

manager_aggregate_add_9.png

是否执行完此步骤后结束:勾选后实际请求只执行完该步骤后即响应结果,不执行后续步骤,用于调试使用;

请求方法:调用底层服务接口的请求类型,可选GET|POST,必选;

默认URL:调用底层服务接口的默认URL,当Fizz网关启动环境没有配置URL时使用该默认URL;

开发环境URL:开发环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=dev时使用该URL;

测试环境URL:测试环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=test时使用该URL;

预生产环境URL:预生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=pre时使用该URL;

生产环境URL:生产环境调用底层服务接口的URL,当Fizz网关启动使用spring.profiles.active=prod时使用该URL;

超时时间(毫秒):调用底层服务接口的超时时间,超时抛出异常,单位毫秒;

Fallback:可选stop|continue,控制当调用底层服务接口失败后是否继续执行后续操作;

请求预处理:勾选后可配置预处理脚本,预处理脚本返回true时才执行调用底层服务接口。

manager_aggregate_add_10.png

配置入参:配置调用底层服务接口的请求参数;

配置响应:配置调用底层服务接口的响应内容。

manager_aggregate_add_11.png

配置步骤结果:配置step执行完成后的响应内容。

配置输出

配置聚合接口调用完成的响应内容。在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。

manager_aggregate_add_12.png
manager_aggregate_add_13.png

校验结果

配置聚合接口入参校验失败后的响应内容,在响应体、响应头配置中可以配置简单的响应固定值、响应引用值,对于需要逻辑处理得到结果的响应可以通过脚本配置灵活处理,如图所示。

manager_aggregate_add_14.png

校验结果有一个专用的引用值validateMsg,该引用值用于存放入参验证错误提示信息。

保存接口

所有配置完成后点击 保存 按钮,完成聚合接口的配置。

manager_aggregate_add_15.png

导出接口

导出功能将聚合接口以配置文件的形式导出,导出的文件可通过导入功能重新导入系统,当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。

manager_aggregate_export_1.png

勾选想到导出的接口,点击 导出 按钮弹出确认窗口,如图所示。

manager_aggregate_export_2.png

点击 确定 按钮,浏览器保存配置文件,如图所示。

manager_aggregate_export_3.png

导入接口

导入功能将配置文件中的聚合接口转化成后台的持久化存储,导入的文件可以通过导出功能获取或者通过编写好的聚合配置JSON文件转化得到(转换工具可以联系我们获取)。当我们的系统分多个环境时,可使用导出导入功能实现聚合接口的快速同步,下面介绍导出功能。

manager_aggregate_import_1.png

点击 导入 按钮弹出导入配置窗口,如图所示。

manager_aggregate_import_2.png

点击 选取文件 按钮后选取要导入的配置文件;

强制覆盖:通过请求类型(GET|POST)、请求路径(/proxy/{service}/{apiPath})可以唯一确定一个聚合接口,当聚合接口已存在时,未勾选该选项时忽略该聚合接口导入,勾选该选项时覆盖已存在的聚合接口配置;

点击 确定 按钮后导入聚合接口配置。

调试模式

调试模式用于对接口开发过程中的调试使用,当打开调试模式后,Fizz网关会将聚合接口调用底层服务接口的请求响应信息以及耗时、聚合结果、步骤上下文打印到日志中,通过日志可以清楚的了解聚合接口的实际执行情况。调试模式会对网关性能造成影响,因此不建议在生产环境打开调试模式,当调试完成后及时关闭调试模式,避免打印过多日志造成资源浪费,下面介绍调试模式的使用。

勾选想要打开调试模式的接口,点击 打开调试模式 按钮弹出确认窗口,如图所示。

manager_aggregate_debug_mode_1.png

点击 确定 按钮确认打开调试模式。

manager_aggregate_debug_mode_2.png

勾选想要关闭调试模式的接口,点击 关闭调试模式 按钮弹出确认窗口,如图所示。

manager_aggregate_debug_mode_3.png

点击 确定 按钮确认关闭调试模式。

manager_aggregate_debug_mode_4.png

编辑接口

点击 编辑 按钮弹出编辑窗口,如图所示。

manager_aggregate_edit_1.png
manager_aggregate_edit_2.png

删除接口

点击 删除 按钮弹出删除确认窗口,如图所示。

manager_aggregate_delete_1.png
manager_aggregate_delete_2.png

点击 确定 按钮后删除接口,处于已发布状态的接口无法删除,需要下线后才能操作删除。

发布|下线申请

发布|下线申请用于聚合接口的发布或者下线申请,只有通过审核人审核后申请人才能执行发布|下线操作,避免误操作‘,保证接口的安全。

点击 发布|下线申请 按钮,弹出发布|下线申请窗口,如图所示。

manager_aggregate_apply_1.png
manager_aggregate_apply_2.png

点击 添加 按钮后,弹出接口列表,勾选需要操作的接口,点击 确定 添加进申请中。

manager_aggregate_apply_3.png

标题:申请的标题,长度不能超过200个字符,必填;

类型:申请类型,可选发布|下线,必选;

申请原因:申请的原因,长度不能超过2000个字符;

选择审核人:选择有审核权限的人对申请进行审核,列表根据需要操作的接口动态变化(未添加接口时列表为空,拥有服务权限并且有待审核菜单权限的人、操作管理员角色的人为可选审核人),必选;

点击 确定 按钮后提交申请,选择的审核人会收到申请审核邮件(审核人邮箱地址通过用户管理设置,更多详情请查看用户管理功能介绍),如图所示。

manager_aggregate_apply_4.png

接口测试

后台提供了可视化的接口调用界面,聚合接口创建完成后可通过该界面对接口进行调用测试。通过点击接口详情页面的 测试 按钮打开接口测试页面,如图所示。

manager_aggregate_test_1.png

跳转页面的同时后台会将接口当前的最新配置推送给Fizz网关生成一个测试接口,请求路径为/proxytest/{service}/{apiPath}。

manager_aggregate_test_2.png

点击 发送 按钮向指定接口发送一次请求,Response响应结果区域显示调用接口结果,如图所示。

manager_aggregate_test_3.png
manager_aggregate_test_4.png

请求体tab用于配置请求的请求体参数。

manager_aggregate_test_5.png

请求头tab用于配置请求的请求头参数。

manager_aggregate_test_6.png

Query参数用于配置请求的Query参数。

manager_aggregate_test_7.png

返回Context:Fizz网关中一次聚合接口的请求过程中内部会持有一个Context对象,该对象保存了本次请求过程的入参信息、底层服务接口调用信息、响应信息,通过勾选该选项,接口会将Context随接口响应一起返回,通过查看Context可以清楚地了解接口的实际调用过程。

未勾选 返回Context 选项时,接口按配置输出的设置响应结果,如图所示。

manager_aggregate_test_8.png

勾选 返回Context 选项后,接口会将Context随接口响应一起返回,如图所示。

manager_aggregate_test_9.png

测试接口:调用测试接口,请求路径为/proxytest/{service}/{apiPath};

正式接口:调用正式接口,请求路径为/proxy/{service}/{apiPath};

manager_aggregate_test_10.png

点击 保存 按钮会将本次测试请求数据保存下来,通过选取已保存的测试记录可以快速恢复请求数据,如图所示。

manager_aggregate_test_11.png

标题:本次测试数据保存时使用的标题,长度不能超过2000个字符,保存后在历史测试记录列表显示,如图所示。

manager_aggregate_test_12.png

发布申请

发布申请模块主要用于规范化聚合接口的发布下线流程,保证接口通过审核才能被执行操作,本章节介绍发布申请下的我的申请功能的使用。

我的申请概述

聚合接口的发布|下线操作需要提交发布|下线申请,审核通过后申请人才能执行发布|下线操作,我的申请功能用于发布|下线申请过程的相关操作。

申请列表

菜单位置:发布申请 > 我的申请。点击菜单后进入申请列表页面,如图所示。

manager_aggregate_my_apply_list_query.png

申请撤回

对于已提交但未被审核的申请可执行撤回操作,点击 撤回 按钮弹出确认窗口,如图所示。

manager_aggregate_my_apply_revoke_1.png

点击 确定 按钮后确认撤回申请,如图所示。

manager_aggregate_my_apply_revoke_2.png

撤回后审核人会收到邮箱提醒无需再处理该申请,如图所示。

manager_aggregate_my_apply_revoke_3.png

撤回后可对申请重新进行编辑后再次提交,点击 编辑 按钮后弹出编辑窗口,如图所示。

manager_aggregate_my_apply_revoke_4.png

点击 确定 按钮后再次提交申请,如图所示。

manager_aggregate_my_apply_revoke_5.png

申请详情

点击 查看 按钮查看申请详情。

manager_aggregate_my_apply_detail_1.png
manager_aggregate_my_apply_detail_2.png

操作日志记录该申请的所有操作,包括申请提交、申请撤回、申请重新提交、审核不通过、审核通过、修改审核人、接口发布、接口下线 、接口回滚、接口撤回。

待审核状态申请可以更换审核人,点击 修改审核人 按钮后弹出修改审核人窗口,如图所示。

manager_aggregate_my_apply_detail_3.png

重新选择审核人后点击 确定 按钮,修改审核人完成。

修改后原审核人会收到邮件提醒无须再处理该申请。

修改后新的审核人会收到邮件提醒需要处理该申请。

审核通过后可以对接口进行发布操作,如图所示。

manager_aggregate_my_apply_detail_4.png

批量发布:对申请内的接口批量发布推送到Fizz网关。

批量回滚:对申请内的接口批量回滚到上一个版本,当发布后接口异常时该操作相当有用。

对于申请通过后又无须操作的接口可以执行撤回操作,撤回接口时必须填写备注信息用于回溯查询,如图所示。

manager_aggregate_my_apply_detail_5.png
manager_aggregate_my_apply_detail_6.png

结束语

本篇文章介绍了Fizz管理后台各个功能的作用,之后详细的介绍了网关管理、服务编排、发布申请模块的核心功能使用。希望读者通过本篇文章的阅读能够掌握Fizz管理后台的使用,通过对后台功能的灵活使用充分发挥Fizz Gateway的能力,为我们的企业开发降低成本,提升效率。

介绍

作者:fizz-zhongjie
Fizz Gateway开源地址:https://github.com/wehotel/fizz-gateway-community

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容