30分钟通过Kong实现.NET网关
什么是Kong
Openrestry是一个基于Nginx与Lua的高性能平台,内部有大量的Lua库。其中ngx_lua_moudule使开发人员能使用Lua脚本调用Nginx模块。Kong是一个Openrestry程序,而Openrestry运行在Nginx上,用Lua扩展了nginx。所以可以认为Kong = Openrestry + nginx + lua。Kong有很高的扩展性,可以通过其插件机制实现扩展。
官方文档:https://docs.konghq.com/
Github:https://github.com/Kong/kong
原理

客户端请求到达Kong,Kong识别出是哪个Consumer,根据路由规则将请求转发给Service对应的上游服务。我们来看看这个过程中涉及到的核心组件
Consumer:代表一个应用,可以为Consumer定义plugin,制定其请求规则。
Route:客户端与服务匹配的规则,是Kong的入口,一旦匹配Route规则,则将其代理到与其关联的Service,一个Route对应一个Service,一个Service有多个Route
Service:管理我们的API或者Upstream Server,Service主要属性是url,端口,协议等
Upstream:位于Kong之后的服务/API,多实例部署实现负载均衡
Plugin:提供高级功能并扩展Gateway。例如身份认证,速率限制等。
安装Kong
官方文档:https://konghq.com/install/#kong-community
大家可以安装企业版或者开源版,我这次安装企业版,但只使用其中的开源功能
#拉镜像
docker pull kong/kong-gateway:2.6.0.0-alpine #打标签
docker tag kong/kong-gateway:2.6.0.0-alpine kong-ee #创建网络
docker network create kong-ee-net #运行数据库容器
docker run -d --name kong-ee-database --network=kong-ee-net -p 5432:5432 -e "POSTGRES_USER=kong" -e "POSTGRES_DB=kong" -e "POSTGRES_PASSWORD=kong" postgres:9.6 #数据库迁移
docker run --rm --network=kong-ee-net -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-ee-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_PASSWORD={PASSWORD}" kong-ee kong migrations bootstrap #运行Kong
docker run -d --name kong-ee --network=kong-ee-net -e "KONG_PROXY_LISTEN=0.0.0.0:8000,0.0.0.0:9080 http2" -e "KONG_DATABASE=postgres" -e "KONG_PG_HOST=kong-ee-database" -e "KONG_PG_PASSWORD=kong" -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" -e "KONG_PROXY_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" -e "KONG_ADMIN_LISTEN=0.0.0.0:8001" -e "KONG_ADMIN_GUI_URL=http://{HOSTNAME}:8002" -p 8000:8000 -p 8443:8443 -p 8001:8001 -p 8444:8444 -p 8002:8002 -p 8445:8445 -p 8003:8003 -p 8004:8004 -p 9080:9080 kong-ee
安装可视化界面Konga
官方源码:https://github.com/pantsel/konga
docker pull pantsel/konga docker run -d -p 1337:1337 --network kong-ee-net -e "TOKEN_SECRET=kongtoken" -e "DB_ADAPTER=postgres" -e "DB_HOST=kong-ee-database" -e "DB_USER=kong" -e "DB_PASSWORD=kong" --name konga pantsel/konga
访问localhost:1337,新建用户,登录后创建连接:test/http://192.168.43.94:8001,指定kong api的端口8001

Kong代理HTTP服务
我们用的演示项目是https://github.com/cysnet/gateway-aspnetcore-demo,其中包含以下内容
- Http服务:Server1与Server2
- Grpc服务:GrpcService1与GrpcService2
- Grpc客户端:GrpcClient
- IdentityServer4服务:Idstest
- 日志服务:LogServer
1.代理Http服务我们用Server1,启动Server1

2.通过admin api在Kong中创建Service,也可使用可视化界面Konga创建
POST http://192.168.43.94:8001/services --data name=server1 --data url='http://192.168.43.94:5000’
3.通过admin api创建路由,也可使用可视化界面Konga创建
http://192.168.43.94:8001/services/server1/routes --data 'paths[]=/http1'--data name=http1
4.测试

Kong代理Grpc服务
1.代理Grpc我们用GrpcService1,启动GrpcService1

2.通过admin api在Kong中创建Service,也可使用可视化界面Konga创建
POST 192.168.43.96:8001/services --data name=gserver1 --data protocol=grpc --data host=192.168.43.94 --data port=6001
3.通过admin api创建路由,也可使用可视化界面Konga创建
POST 192.168.43.94:8001/services/gserver1/routes --data protocols[]=grpc --data name=r-gserver1 --data paths[]=/greet
4.测试,运行GrpcClient

Kong负载Http服务
1.启动Server1与Server2

2.通过admin api在Kong中创建upstreams,也可使用可视化界面Konga创建
POST http://192.168.43.94:8001/upstreams --data name=u-http1
3.为u-http1创建target,指向server1与server2
POST http://192.168.43.94:8001/upstreams/u-http1/targets --data target='192.168.43.94:5000’
POST http://192.168.43.94:8001/upstreams/u-http1/targets --data target='192.168.43.94:5001'
4.修改http1 service的指向,让其指向u-htttp1这个upstream
PATCH http://192.168.43.94:8001/services/server1 --data host='u-http1’
5.测试,调用以下api
http://192.168.43.94:8000/http1/Name

Kong负载Grpc服务
1.启动GrpcService1与GrpcService2

2.通过admin api在Kong中创建upstreams,也可使用可视化界面Konga创建
POST http://192.168.43.94:8001/upstreams --data name=u-gserver1
3.为u-gserver1创建target,指向GrpcService1与GrpcService2
POST http://192.168.43.94:8001/upstreams/u-gserver1/targets --data target='192.168.43.94:6001’
POST http://192.168.43.94:8001/upstreams/u-gserver1/targets --data target='192.168.43.94:6002'
4.修改gserver1 service的指向,让其指向u-gserver1这个upstream
PATCH http://192.168.43.94:8001/services/gserver1 --data host=‘u-gserver1’
5.测试,运行GrpcClient


集成IdentityServer4实现JWT认证
1.给server1开启jwt插件
POST http://localhost:8001/services/server1/plugins -d “name=jwt ” –d “config.key_claim_name=client_id”
2.创建consumer
POST localhost:8001/consumers -d "username=c-server1"
3.获取ids4证书公钥与私钥
openssl安装https://slproweb.com/products/Win32OpenSSL.html
openssl pkcs12 -in chester.pfx -nocerts -nodes -out private_pc.key
从密钥对中提取私钥(头部格式:-----BEGIN RSA PUBLIC KEY-----)
openssl rsa -in private_pc.key -out private.pem
从密钥对提取公钥(头部格式:-----BEGIN PUBLIC KEY-----)
openssl rsa -in private_pc.key -pubout -out public.key
4.为C-server1创建凭证
POST localhost:8001/consumers/c-server1/jwt -d "algorithm=RS256" -d "key=big_cat" -d "secret=xxxxxx" -d "rsa_public_key=xxxxxxxxx“

5.启动id4test获取jwttoken

6.调用api验证token

RateLimit限流插件
POST http://<admin-hostname>:8001/plugins --data name=rate-limiting --data config.minute=5 --data config.policy=redis --data redis_host=192.168.43.102 --data limit_by=ip –data redis_password=123456
多次调用触发则触发限流

Cache插件
POST http://localhost:8001/plugins --data name=proxy-cache --data config.content_type="text/plain; charset=utf-8" --data config.cache_ttl=30 --data config.strategy=memory
多次调用X-Cache-Status=Hit则命中缓存成功

日志插件
启动LogServer

开启日志插件
POST http://localhost:8001/services/server1/plugins --data "name=http-log" --data "config.http_endpoint=http://192.168.43.94:5555/Log" --data "config.method=POST"
请求http://192.168.43.94:8000/http1/Name,查看LogServer输出

30分钟通过Kong实现.NET网关的更多相关文章
- 30分钟学会XAML
1.狂妄的WPF 相对传统的Windows图形编程,需要做很多复杂的工作,引用许多不同的API.例如:WinForm(带控件表单).GDI+(2D图形).DirectX API(3D图形)以及流媒体和 ...
- Shell脚本编程30分钟入门
Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...
- JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)
前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue ...
- 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world
2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...
- 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- 30分钟?不需要,轻松读懂IL
先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理由就是一个 ...
- 【grunt第二弹】30分钟学会使用grunt打包前端代码(02)
前言 上一篇博客,我们简单的介绍了grunt的使用,一些基础点没能覆盖,我们今天有必要看看一些基础知识 [grunt第一弹]30分钟学会使用grunt打包前端代码 配置任务/grunt.initCon ...
- Objective-C 30分钟入门教程
Objective-C 30分钟入门教程 我第一次看OC觉得这个语言的语法有些怪异,为什么充满了@符号,[]符号,函数调用没有()这个,但是面向对象的高级语言也不外乎类,接口,多态,封装,继承等概念. ...
- AngularJS 30分钟快速入门【译】
引用自:http://www.revillweb.com/tutorials/angularjs-in-30-minutes-angularjs-tutorial/,翻译如下: 简介 我三年前开始使用 ...
随机推荐
- windows 中cmd一些特殊命令
chcp 65001 就是换成UTF-8代码页 chcp 936 可以换回默认的GBK chcp 437 是美国英语 shutdown -s -t 60 60秒后关机 shutdown /a ...
- 什么是云效 Projex,云效Projex企业级高效研发项目管理平台
云效项目协作Projects是一款企业级高效研发项目管理平台, 提供了快速实践的敏捷研发项目管理机制,提供对需求.迭代.缺陷各个维度的协同管理以及相关的统计报告,让研发团队高效协作.践行敏捷并持续交付 ...
- gin 源码阅读(2) - http请求是如何流入gin的?
推荐阅读: gin 源码阅读(1) - gin 与 net/http 的关系 本篇文章是 gin 源码分析系列的第二篇,这篇文章我们主要弄清一个问题:一个请求通过 net/http 的 socket ...
- verifycode验证码模版
# -*- coding:utf-8 -*- from django.shortcuts import HttpResponse def verifycode(request): # 引入绘图模块 f ...
- 『GoLang』错误处理
Go 没有像 Java 和 .NET 那样的 try/catch 异常机制:不能执行抛异常操作.但是有一套 defer-panic-and-recover 机制. Go 的设计者觉得 try/catc ...
- 【Vue】淘气三千问之 data为什么是函数而不是对象?这河狸吗
朋友,当你提出以上问题的时候建议你先去复习下原型链的知识 但是我好人做到底直接就讲了吧,我们先看一下下面的这段代码: function Component () { this.data = this. ...
- python3使用imaplib获取邮件
imaplib 获取邮件,email解析邮件config文件中存有路径 1 # config.py 2 FILE_PATH_PREFIX = os.getcwd() + '/static/' 3 FI ...
- 鸿蒙源码分析系列(总目录) | 百万汉字注解 百篇博客分析 | 深入挖透OpenHarmony源码 | v8.23
百篇博客系列篇.本篇为: v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 百篇博客分析 | 51.c.h .o 百篇博客.往期回顾 在给OpenHarmony内核源码加注过程中,整理出以下 ...
- 常见JS
1.获取当前月份第一天 var date = new Date(); var year = date.getFullYear(); var month = date.getMonth() + 1; v ...
- CefSharp基于.Net Framework 4.0 框架编译
CefSharp基于.Net Framework 4.0 框架编译 本次源码使用的是Github上CefSharp官方的79版本源码 准备 IDE Visual Studio 2017 Enterpr ...