API网关--nisbos-gateway
<h2>1、nisbos-gateway简介</h2>
<p>nisbos-gateway是基于springcloud gateway基础进行二次封装的API网关,它旨在帮助业务开发人员能够快速上手api网关的相关功能,无需进行代码开发。目前nisbos-gateway集成的功能有动态路由、请求日志记录、jwt鉴权、基于ip和uri限流等</p>
<h2>2、nisbos-gateway快速入门</h2>
<blockquote>
<p>2.1 路由转发</p>
</blockquote>
<p>业务开发人员有两种方式来进行实现路由转发,一种直接使用nisbos平台开发人员已经集成好的nisbos-gateway环境。通过访问http://10.1.4.70:8000/业务服务的spring application name/接口名称的方式,这样就能够直接定位到具体的业务服务</p>
<p><strong>注</strong>:10.1.4.70:8000为nisbos平台开发人员部署nisbos-gateway的地址,后续地址也许会改变</p>
<p>另外一种方式是自建nisbos-gateway,业务开发人员向nisbos平台申请nisbos-gateway.jar。因为nisbos-gateway使用apollo来管理配置,并配合eureka来做路由分发。因此在自建nisbos-gateway之前,请确保已经安装好apollo环境和eureka环境,同时在apollo portal界面上创建一个项目,其app.id为<strong>nisbos-gateway</strong>。并且在创建好的nisbos-gateway namespace为<strong>application.properties</strong>的面板上指定<strong>eureka.serverUrl</strong> = 具体eureka的服务端地址。最后通过java -jar的方式启动nisbos-gateway,其命令如下</p>
<pre><code class="language-shell">java -jar -Dapollo.meta=你安装的apollo configserver地址 nisbos-gateway.jar</code></pre>
<p>通过访问http://你部署的nisbos-gateway地址/业务服务的spring application name/接口名称的方式,这样就能够直接定位到具体的业务服务</p>
<blockquote>
<p>2.2、动态路由</p>
</blockquote>
<p>通过在apollo portal上的面板配置路由信息即可,如下</p>
<pre><code class="language-shell"># gateway路由配置
# 指定路由ID
spring.cloud.gateway.routes[0].id = nisbos-eureka-client
# 指定要跳转的路由地址
spring.cloud.gateway.routes[0].uri = lb://nisbos-eureka-client
# 配置符合路由正则请求的地址进行跳转
spring.cloud.gateway.routes[0].predicates[0] = Path=/nisbos-eureka-client/**
# 配置请求过滤器,下面的例子,业务服务通过request.getParameter("foo"),可以拿到bar
spring.cloud.gateway.routes[0].filters[0] = AddRequestParameter=foo, bar</code></pre>
<blockquote>
<p>2.3、限流</p>
</blockquote>
<p>a、ip限流</p>
<p>通过在apollo portal上的面板配置如下内容即可</p>
<pre><code class="language-shell"># gateway限流配置
spring.cloud.gateway.routes[3].id = nisbos-eureka-client-limiter
spring.cloud.gateway.routes[3].uri = lb://nisbos-eureka-client
spring.cloud.gateway.routes[3].predicates[0] = Path=/ipLimiter
# 配置限流过滤器
spring.cloud.gateway.routes[3].filters[0].name = RequestRateLimiter
#允许用户每秒处理多少个请求
spring.cloud.gateway.routes[3].filters[0].args[redis-rate-limiter.replenishRate] = 1
#令牌桶的容量,允许在一秒钟内完成的最大请求数
spring.cloud.gateway.routes[3].filters[0].args[redis-rate-limiter.burstCapacity] = 4
#用于限流的键的解析器的 Bean 对象的名字,使用 SpEL 按名称引用
spring.cloud.gateway.routes[3].filters[0].args[key-resolver] = #{@ipKeyResolver}</code></pre>
<p>b、uri限流</p>
<p>通过在apollo portal上的面板配置如下内容即可</p>
<pre><code class="language-shell"># gateway限流配置
spring.cloud.gateway.routes[3].id = nisbos-eureka-client-limiter
spring.cloud.gateway.routes[3].uri = lb://nisbos-eureka-client
spring.cloud.gateway.routes[3].predicates[0] = Path=/ipLimiter
# 配置限流过滤器
spring.cloud.gateway.routes[3].filters[0].name = RequestRateLimiter
#允许用户每秒处理多少个请求
spring.cloud.gateway.routes[3].filters[0].args[redis-rate-limiter.replenishRate] = 1
#令牌桶的容量,允许在一秒钟内完成的最大请求数
spring.cloud.gateway.routes[3].filters[0].args[redis-rate-limiter.burstCapacity] = 4
#用于限流的键的解析器的 Bean 对象的名字,使用 SpEL 按名称引用
spring.cloud.gateway.routes[3].filters[0].args[key-resolver] = #{@uriKeyResolver}</code></pre>
<blockquote>
<p>2.4、请求日志记录</p>
</blockquote>
<p>nisbos-gateway默认集成,当有服务访问时,会有如下日志产生</p>
<pre><code class="language-shell">21:00:40 [reactor-http-nio-4] INFO c.n.gateway.filter.AccessLogFilter - Request Info [ ;header=[Host:"localhost:8000", Connection:"keep-alive", Cache-Control:"max-age=0", Upgrade-Insecure-Requests:"1", User-Agent:"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36", Sec-Fetch-Dest:"document", Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", Sec-Fetch-Site:"none", Sec-Fetch-Mode:"navigate", Sec-Fetch-User:"?1", Accept-Encoding:"gzip, deflate, br", Accept-Language:"zh-CN,zh;q=0.9"];params=;address=0:0:0:0:0:0:0:162434;method=GET;url=/nisbos-eureka-client/hello ]Response Info [ status=200 OK;header=[Vary:"Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers", Content-Type:"text/html;charset=UTF-8", Content-Length:"12", Date:"Thu, 11 Jun 2020 13:00:40 GMT"];responseResult=hello:张三 ]
</code></pre>
<blockquote>
<p>2.5、jwt鉴权</p>
</blockquote>
<p>nisbos-gateway默认集成,请求的服务的header必须带上jwt token,否则会无法校验通过。可以通过在apollo portal配置需要绕过jwt校验的链接或者服务,其配置如下</p>
<pre><code class="language-shell">#jwt可跳过验证的链接
jwt.skip-auth-urls[0] = /login
jwt.skip-auth-urls[1] = /doc.html
jwt.skip-auth-urls[2] = /swagger-ui.html
jwt.skip-auth-urls[3] = /v2/api-docs
jwt.skip-auth-urls[4] = /toLogin
jwt.skip-auth-urls[5] = /demo
jwt.skip-auth-urls[6] = /api/oms/seckill/seckillByCode</code></pre>
<h2>3、Q&A</h2>
<blockquote>
<p>3.1 如何修改nisbos-gateway默认端口?</p>
</blockquote>
<p>可以采用指定端口方式启动,启动命令如下</p>
<pre><code class="language-shell">java -jar -Dserver.port=8083 -Dapollo.meta=http://10.1.4.70:8080 nisbos-gateway.jar</code></pre>
<blockquote>
<p>3.2 能否在nisbos-gateway运行时,动态启动或者禁用请求日志?</p>
</blockquote>
<p>目前不支持。原因是目前请求日志的过滤器请求,是通过@ConditionalOnProperty注解指定,目前apollo不支持@ConditionalOnProperty动态修改。建议不要禁用该功能,因为开启该日志可以针对请求进行分析。如果确实想禁用,可以以如下的方式进行启动</p>
<pre><code class="language-shell">java -jar -DaccessLog.enabled=false -Dapollo.meta=http://10.1.4.70:8080 nisbos-gateway.jar</code></pre>
<blockquote>
<p>3.3 能否在nisbos-gateway运行时,动态启动或者禁用jwt功能?</p>
</blockquote>
<p>目前不支持。原因和3.2一样。可以通过在apollo portal面板上指定需要绕过验证的链接或者服务。配置如下:</p>
<pre><code class="language-shell">#jwt可跳过验证的链接
jwt.skip-auth-urls[0] = /login</code></pre>
<p>如果确实想禁用该功能,可以以如下的方式进行启动</p>
<pre><code class="language-shell">java -jar -Djwt.enabled=false -Dapollo.meta=http://10.1.4.70:8080 nisbos-gateway.jar</code></pre>