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

原理

86ed19e071b87ce885451dfb812a00f8.png

客户端请求到达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/kongadocker 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

e83368b5c0c0c2b49d841fcf3dcd2787.png

Kong代理HTTP服务

我们用的演示项目是https://github.com/cysnet/gateway-aspnetcore-demo,其中包含以下内容

  • Http服务:Server1与Server2

  • Grpc服务:GrpcService1与GrpcService2

  • Grpc客户端:GrpcClient

  • IdentityServer4服务:Idstest

  • 日志服务:LogServer

1.代理Http服务我们用Server1,启动Server1

3eda41892c82539a902ec2a584ae485b.png

 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.测试

1d7a1d1884e3136e8ba514c539dfae0e.png

Kong代理Grpc服务

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

bd61df89fc24124d7baa1b0f812f2163.png

 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

43c91885e53683a073446bc77ac597ca.png

Kong负载Http服务

1.启动Server1与Server2

5f267b9089310c5aebc8122f382c5f19.png

 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

ee5bb111f9c4e6ab18c62870b756163b.png

Kong负载Grpc服务

1.启动GrpcService1与GrpcService2

42b22f5bf4f5ea071f540d4798782b3a.png

 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

bf536d37a91c00f3d308ede401714770.png

集成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“

815ad7dae448057024489d9fc6033a32.png

 5.启动id4test获取jwttoken

886b6ba747eca2aba3e9c820df6c4ff3.png

 6.调用api验证token

29a297f134bda1a8123052591e3c1bf1.png

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

多次调用触发则触发限流

a2b96f2a3a456cf10abba475058a0bec.png

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则命中缓存成功

354c5335edb3e3f0f6f5920cf4f8601a.png

日志插件

启动LogServer

f35a5104982191074252a88793219085.png

 开启日志插件

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输出

71fc79bc8bbfd1325261c8f90d0c813f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Proxy模式简介和用例

在软件系统中&#xff0c;有些对象有时候由于某些原因&#xff08;比如对象创建开销很大&#xff0c;或者某些操作需要安全控制&#xff0c;或者需要进程外的访问&#xff09;&#xff0c;如果直接访问会给使用者或者系统结构带来很多麻烦&#xff0c;这时可以在客户程序和目标…

struts2中jsp页面上验证码的生成

如何在jsp页面中显示验证码&#xff1a; 验证码&#xff1a;<img class"yzm_img" align"middle" id"validateImage" src"p_w_picpathCode.action" width"150" height"40" οnclick"this.srcp_w_picpathCo…

挑战程序设计竞赛部分题目选择排序、二分查找找出下标、深度优先算法、求三角形max周长、蚂蚁算法、操作excel

首先提供帮助类 可能这个类还需要更新 、求最大值、求最小值、选择排序、二分查找找出下标、二分查找排好序列里面是否有那个值 public class Util {//求最大值public static int maxValue(int a,int b) {int max =0;if (a > b) {max = a;} else {max = b;}return max;}//求…

nginx php oracle,第8天 ORACLE安装及NGINX整合PHP环境

oracle 11g安装在centos5.9x64下过程1.先检查是否安装开发工具、JAVA、ksh等&#xff0c;及其它如下yum search检查&#xff0c;若没有安装&#xff0c;则用yum groupinstall 开发工具 开发库 Java开发yum install pdkshyum install sysstatyum install libaio-develyum insta…

这个小姐姐真的很火辣......

1 穿着十分火辣的美女...▼2 你还有理了&#xff1f;▼3 学生&#xff1a;我们要把老师照片挂墙上&#xff01;▼4 喜悦中带着阵阵悲伤...▼5 你瞅啥&#xff1f;瞅你咋地&#xff01;▼6 一时竟没发现哪里不对▼7 老板&#xff0c;我们KTV最漂亮的都在这了▼你点的每个赞…

RPC调用框架比较分析

什么是RPC&#xff1a; RPC&#xff08;Remote Procedure Call Protocol&#xff09;——远程过程调用协议&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的协议。 简言之&#xff0c;RPC使得程序能够像访问本地系统资源一样&am…

VS扩展CodeMaid代码整理插件

CodeMaid是Visual Studio的开源扩展&#xff0c;用于清理和简化我们的C&#xff03;&#xff0c;C &#xff0c;F&#xff03;&#xff0c;VB&#xff0c;PHP&#xff0c;PowerShell&#xff0c;JSON&#xff0c;XAML&#xff0c;XML&#xff0c;ASP&#xff0c;HTML&#xff0…

hibernate中的id特殊属性hilo剖解(多用于继承关系)

hilo是hibernate中最长用的一种生成方式&#xff0c;hibernate给出了hilo 和 seqhilo两种生成器&#xff0c;他们的分别向下面一样配置 Hilo配置代码 <id name"id" type"int" column"id"> <generator class"hilo"> <…

Centos5 install vnc

2019独角兽企业重金招聘Python工程师标准>>> 很详细的install steps: http://wiki.centos.org/HowTos/VNC-Server#head-76401321dae4d80916a7fd7e710272a9b85c9485 ---------------------------------------------------------------------------------------------…

搜索引擎(lucene)

专辑&#xff1a;Lucene (全文检索工具)从入门到精通简介:Lucene是apache软件基金会4 jakarta项目组的一个子项目&#xff0c;是一个开放源代码的全文检索引擎工具包&#xff0c;即它不是一个完整的全文检索引擎&#xff0c;而是一个全文检索引擎的架构&#xff0c;提供了完整的…

自动摘要php,修改DEDECMS文章自动摘要长度或者取掉文章摘要

首先&#xff0c;应该在系统→系统基本参数→其它选项“自动摘要长度” 中可以设置&#xff0c;但最高只能实现250&#xff0c;根本没用&#xff0c;所以现在总结一下几种方法方法一&#xff1a;第一步进数据库 找到表 dede_archives 下的字段 description 点更改,修改长度 或 …

解决PKIX:unable to find valid certification path to requested target 的问题

问题的根本是&#xff1a; 缺少安全证书时出现的异常。 解决问题方法&#xff1a; 将你要访问的webservice/url....的安全认证证书导入到客户端即可。 以下是获取安全证书的一种方法&#xff0c;通过以下程序获取安全证书&#xff1a; /** Copyright 2006 Sun Microsystems, In…

北大学霸隐居20年,王青松花光350万后,如今怎么样了?

全世界只有3.14 % 的人关注了爆炸吧知识传说我国&#xff0c;本科生遍地走&#xff0c;研究生多如狗。但一估算&#xff0c;从1977年高考恢复以来&#xff0c;国内现在的本科率竟然还不到5%。这样一想&#xff0c;30多年前的本科生数量肯定更少&#xff0c;也更珍贵。如果是北大…

如何在 Dapper.NET 中使用事务?

咨询区 Amit&#xff1a;我的项目中使用 dapper.net 做数据库连接框架&#xff0c;有一个需求需要在多个表上执行多次插入操作&#xff0c;我想把它 事务化&#xff0c;但我看 dapper 并没有提供类似的方式。请问我该如何使用 dapper 来做这项工作呢&#xff1f;回答区 Newteq …

文件给制实施规定的实例(GB8567-88)

尽管在文件编制中存在着很多灵活性&#xff0c;然而&#xff0c;文件的编制确实是非常必要的&#xff0c;其意义如前所述。为了控制这种灵活性&#xff0c;保证文件编制能达到应该达到的目的&#xff0c;对于具体的软件开发任务&#xff0c;应编制的文件的种类、详细程度应取决…

python 内存数据库下载,Python 文件存储和数据库

Python 中数据存储的方式和其他语言没什么区别&#xff0c;主要分为两个方面&#xff1a;文件存储和数据库存储。文件存储文件存储的方法也分为很多种&#xff0c;主要包括&#xff1a;Python 内置方法NumPy 模块方法os 模块方法csv 模块方法Python 内置方法在不需要借助任何外…

c#10中的namespace

A、namespace是c#用来管理类型隔离的关键字&#xff0c;在不同的namespace下可以相同名称的类型&#xff0c;并且namespace是可以嵌套的。Demo01.csnamespace NameSpaceDemo {internal class Demo01Class{ }namespace NSDemo01{internal class Demo01Class{}}namespace NSDemo…

岛国小姐姐来例假时,男朋友背着她偷偷查手机......

1 大猪蹄子们都好好学学▼2 人形扫地机&#xff1f;&#xff1f;&#xff1f;▼3 妈&#xff0c;看下你儿子大学四年积攒的宝藏▼4 你以为养老院很无聊&#xff1f;▼5 这个事是全世界统一的吗&#xff1f;▼6 爸爸&#xff1a;今天做个温柔的人吧▼7 那些隐藏在民间的车…

mysql-普通查询(General Query)慢查询(Slow Query)相关日志配置

2019独角兽企业重金招聘Python工程师标准>>> 配置 配置方法一: 服务启动时 # vi /etc/my.cnf ... log-outputTABLE,FILE general-log1 slow-query-log1# systemctl restart mysqldlog-output默认是FILE,还有个值是NONE,就不输出日志了.我这里演示的是表和日志文件都…

eclipse myeclipse 快捷键

MyEclipse 快捷键1(CTRL) ------------------------------------- Ctrl1 快速修复 CtrlD: 删除当前行 CtrlQ 定位到最后编辑的地方 CtrlL 定位在某行 CtrlO 快速显示 OutLine CtrlT 快速显示当前类的继承结构 CtrlW 关闭当前Editer CtrlK 快速定位到下一个 CtrlE…