迅驰互联网站建设网络推广怎么样,sem优化,公司注册代理免费,绿色大气网站模板什么是api网关
前面我们聊过sentinel#xff0c;用来限流熔断和降级#xff0c;如果你只有一个服务#xff0c;用sentinel自然没有问题#xff0c;但是如果是有多个服务#xff0c;特别是微服务的兴起#xff0c;那么每个服务都使用sentinel就给系统维护带来麻烦。那么网…什么是api网关
前面我们聊过sentinel用来限流熔断和降级如果你只有一个服务用sentinel自然没有问题但是如果是有多个服务特别是微服务的兴起那么每个服务都使用sentinel就给系统维护带来麻烦。那么网关是个啥东西呢简单来说网关就是一个服务器也是所有服务的唯一入口。api网关不仅可以实现系统层面的限流熔断等技术还可以提供服务发现负载均衡协议转换流量管理黑白名单反爬策略身份验证灰度发布监控缓存等等功能。
在没有引入网关之前为了保障交互的安全每个服务都需要自己实现一套权限校验Auth、日志、限流、监控等方案。这样就不太好各种成本很高。 引入网关之后呢像鉴权、监控、安全、限流、日志、缓存等等方案都可以统一由网关实现。各个服务只需要专注于自己的业务实现就OK。
实现网关的技术有哪些
那么现在有哪些成熟的api网关技术呢我们通过表格了解一下结合github我们也能看到kong是当之无愧的网关一哥收获的start接近37k生态也很不错。它是基于nginxlua实现的。和go相关的有goku manba tyk等
kong
Kong是一个开源的API网关它是一个针对API的一个管理工具。你可以在那些上游服务之前额外地实现一些功能。 Kong本身是一款基于OpenRestyNginx Lua模块编写的高可用、易扩展的由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的能提供易于使用的RESTful API来操作和配置API管理系统所以它可以水平扩展多个Kong服务器通过前置的负载均衡配置把请求均匀地分发到各个Server来应对大批量的网络请求。
kong有三个重要组件我们在后面使用中会用到
Kong Server 基于nginx的服务器用来接收API请求。Apache Cassandra/PostgreSQL 用来存储操作数据。Kong dashboard官方推荐UI管理工具当然也可以使用 restfull 方式 管理admin api。
kong的安装
接下来我们通过docker来快速安装kong看看kong长什么样子
下载kong镜像
docker pull kong:1.5.0-alpine给镜像打tag
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
kong 1.5.0-alpine a79fdd990557 4 years ago 129MB
$ docker tag a79fdd990557 kong-oss创建一个专属的网络空间kong及其相关的容器均加入到这个网络中方便容器间的相互发现和互通
docker network create kong-ee-net创建数据卷用于将容器的目录挂载到宿主上防止容器被删后数据丢失。
docker volume create kong-volume启动kong依赖的db容器运行postgresql数据库注意--networkkong-ee-net用于指定网络-v kong-volume:/var/lib/postgresql/data是用来指定目录挂载即数据卷
docker run -d --name kong-ee-database \--networkkong-ee-net \-p 5432:5432 \-v kong-volume:/var/lib/postgresql/data \-e POSTGRES_USERkong \-e POSTGRES_DBkong \-e POSTGRES_PASSWORDkong \postgres:9.6初始化kong需要的数据库和网络
docker run --rm --networkkong-ee-net \-e KONG_DATABASEpostgres \-e KONG_PG_HOSTkong-ee-database \-e KONG_PG_PASSWORDkong \-e KONG_PASSWORDkong \kong-oss kong migrations bootstrap我们可以通过datatrip看一下链接信息如下就是我们初始化的时候填写的信息 数据库依赖已经启动接下来我们启动kong ,有几个对外暴露的端口号我们需要了解一下 接收客户端流量的端口proxy 部分 :8000 —— http 端口 :8443 —— https 端口admin API 端口admin 部分 :8001 —— http 端口 :8444 —— https 端口 启动kong ,在该命令中我们给kong指定了数据库相关信息指定了相关暴露的接口
docker run -d --name kong \--networkkong-ee-net \-e KONG_DATABASEpostgres \-e KONG_PG_HOSTkong-ee-database \-e KONG_PG_USERkong \-e KONG_PG_PASSWORDkong \-e KONG_CASSANDRA_CONTACT_POINTSkong-database \-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_LISTEN0.0.0.0:8001, 0.0.0.0:8444 ssl \-p 8000:8000 \-p 8443:8443 \-p 8001:8001 \-p 8444:8444 \kong-oss:latest接下来我们访问8001端口验证一下 kong是支持可视化管理的我们通过安装konga来实现
konga
同样我先创建数据卷
docker volume create konga-postgresql初始化数据库和网络
docker run -d --name konga-database \--networkkong-ee-net \-p 5433:5432 \-v konga-postgresql:/var/lib/postgresql/data \-e POSTGRES_USERkonga \-e POSTGRES_DBkonga \-e POSTGRES_PASSWORDkonga \postgres:9.6配置konga的数据库信息和网络
docker run --rm --networkkong-ee-net \
pantsel/konga:latest \
-c prepare \
-a postgres \
-u postgres://konga:kongakonga-database:5432/konga启动konga
docker run -d -p 1337:1337 \--name konga \--networkkong-ee-net \-e DB_ADAPTERpostgres \-e DB_URIpostgres://konga:kongakonga-database:5432/konga \-e NODE_ENVproduction \-e DB_PASSWORDkonga \pantsel/konga至此服务启动完毕分别是kong kong-database konga konga-database 接下来我们访问konga http://127.0.0.1:1337/register,我们一路点击并注册 前面我们启动kong的时候指定过-e KONG_ADMIN_LISTEN0.0.0.0:8001, 0.0.0.0:8444 ssl \这里我们把admin-api配置进去,我们查看一下kong的ip是什么并配置上去
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
6c651fea33e2 bridge bridge local
d1762f271faa host host local
d919b20bcd75 kong-ee-net bridge local
eacd36da5200 none null local
$ docker network inspect kong-ee-net kong的基本讲解
我们在前面创建链接之后进入以下页面那么我们左侧菜单栏都代表什么东西
SERVICE
service里面下面有一句说明Service entities, as the name implies, are abstractions of each of your own upstream services. Examples of Services would be a data transformation microservice, a billing API, etc. 说这是一个服务实例是您自己的上游服务。说白了kong既然是一个服务网关那么一个请求过来kong必然要去转发到对应的上游服务那么这个转发规则是什么我们就是通过service配置来实现的。这个规则可以对应一个route也可以对应多个route
Route
route 相当于nginx里面location他负责将实际的 request 映射到 service。 实际上是通过定义一些规则来匹配客户端的请求每个路由都会关联一个service并且service可以关联多个route。当匹配到客户端的请求时每个请求都会被代理到其配置的Service中。Route作为客户端的入口通过将Route和Service的松耦合可以通过hosts path等规则的配置最终让请求到不同的Service中。比如goods相关的服务我们的route就匹配规则可能就是/good,订单相关的匹配规则可能就是另一个serviceroute对应/order
配置service和route
接下来我们通过实例来更好的理解一下service和route 我们现在有一个这样的服务获取博客详情http://192.168.11.20:8082/v1/blog/detail?id12那么我们怎么通过网关去访问呢
创建service 我们也可以通过api发送http请求来添加service
curl -i -X POST http://localhost:8001/services/ \-d nameapi-service \-d urlhttp://192.168.11.20:8082添加route ,这里面的path是什么转发规则呢就是比如 path是/,那么我就把/后面的path转发过去同样的如果你的path是 /v1那么转发的时候就会把v1后面的转发过去我们举个例子 通过kong访问接口http://127.0.0.1:8000/v1/blog/detail?id12 这个时候我上游服务把路径改了改成了http://192.168.11.20:8082/blog/detail?id12没有v1了还能访问的通吗上游服务返回404了。那么怎么办 我们修改route的配置增加对新路由的兼容,我们再次访问 上游服务的日志其实这也说明网关的另一个作用内部uri的变更不影响kong对外提供服务。 同样我们也可以使用admin api添加route
curl -i -X POST http://localhost:8001/services/api-service/routes \-d nametest1 \-d paths[]/test1 \-d strip_pathfalse如果路由重复会添加错误
{message:UNIQUE violation detected on {name\test1\},name:unique constraint violation,fields:{name:test1},code:5}TARGET
target 可以说就是我们的服务实例我们在上面例子中直接通过ip端口的方式绑定了实例但是我们知道一个服务可能有很多个实例也就是多个节点。多个节点的话kong是如何实现负载均衡的呢这里就要用到stream
UPSTREAM
upstream就是一个虚拟的服务可以用于配置多个target用来实现负载均衡。
接下来我们通过一张图来了解一下这四个核心元素的关系
总结
好了上面我们聊了kong的作用安装以及简单的使用也了解了kong的一些组件和kong的核心对象。下一篇文章中将会举例负载均衡和插件的使用