博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Cloud 核心组件——网关
阅读量:5090 次
发布时间:2019-06-13

本文共 5757 字,大约阅读时间需要 19 分钟。

网关(API Gateway)是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能。

它主要有以下几个功能:

1)统一接入:智能路由;AB测试、灰度测试;负载均衡、容灾处理;日志埋点(类似 Nginx 日志)

2)流量监控:限流处理;服务降级

3)安全防护:鉴权处理;监控;机器网络隔离

主流的网关有以下这些:

1)Zuul:是 Netflix 开源的微服务网关,和 Eureka,Ribbon,Hystrix 等组件配合使用,Zuul 2.0 比 1.0 的性能提高很多

2)Kong: 由 Mashape 公司开源的,基于 Nginx 的 API gateway

3)Nginx+Lua:是一个高性能的 HTTP 和反向代理服务器,Lua 是脚本语言,让 Nginx 执行 Lua 脚本,并且高并发、非阻塞的处理各种请求

 

1. Zuul 网关基本使用

第一步:加入依赖

使用 IDEA 创建 Spring Boot 项目时,添加以下两个依赖

第二步:启动类加入注解 @EnableZuulProxy,默认集成断路器 @EnableCircuitBreaker

@SpringBootApplication@EnableZuulProxypublic class ApiGatewayApplication {    public static void main(String[] args) {        SpringApplication.run(ApiGatewayApplication.class, args);    }}

第三步:我们可以通过网关访问之前的项目

Zuul 默认访问规则为:http://gateway:port/service-id/**

例子:

这里需要注意:我们可以通过网关去访问服务,但服务基本的访问,我们还是可以访问的,网关只是多加了一层

比如访问:,还是可以的

当然,我们可以自定义路由转发:

zuul:  routes:    product-service: /apigateway/**

这样就可以通过自定义的路径进行访问

如果不想让默认的服务对外暴露接口,可以进行环境隔离配置:

server:  port: 9000#服务的名称spring:  application:    name: api-gateway#指定注册中心地址eureka:  client:    serviceUrl:      defaultZone: http://localhost:8761/eureka/ #自定义路由映射zuul:  routes:    product-service: /apigateway/**  #统一入口为上面的配置,其他入口忽略(我们可以通过规则,屏蔽掉某些服务)  ignored-patterns: /*-service/**  #忽略整个服务,不对外提供接口(我们可以直接屏蔽掉某个服务)  #ignored-services: product-service

注意: 

1)如果自定义多个服务的访问地址,地址不能重复,否则后定义的会覆盖之前定义的。如下所示,多个服务地址应该不一样

zuul:  routes:    order-service: /apigateway/order/**    product-service: /apigateway/product/**

2)我们经过网关这一层到具体的服务里面,会发现请求头无法获取到,这是因为 Zuul 默认过滤掉了请求头,所以服务访问不到,我们需要去除掉这个默认设置

#自定义路由映射zuul:  routes:    order-service: /apigateway/order/**    product-service: /apigateway/product/**  #统一入口为上面的配置,其他入口忽略  ignored-patterns: /*-service/**  #处理http请求头为空的问题  sensitive-headers:

 

2. 自定义 Zuul 过滤器实现登录鉴权

新建一个 filter 包,在包里新建一个类,实现 ZuulFilter,重写里面的方法。在类顶部加注解 @Component,让 Spring Boot 扫描。

package com.jwen.apigateway.filter;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.apache.commons.lang.StringUtils;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;/** * 登录过滤器 */@Componentpublic class LoginFilter  extends ZuulFilter {    /**     * 过滤器类型,前置过滤器     * @return     */    @Override    public String filterType() {        return PRE_TYPE;    }    /**     * 过滤器顺序,越小越先执行     * @return     */    @Override    public int filterOrder() {        return 4;    }    /**     * 过滤器是否生效     * @return     */    @Override    public boolean shouldFilter() {        RequestContext requestContext = RequestContext.getCurrentContext();        HttpServletRequest  request = requestContext.getRequest();        //System.out.println(request.getRequestURI()); ///apigateway/product/api/v1/product/list        //System.out.println(request.getRequestURL()); //http://localhost:9000/apigateway/product/api/v1/product/list        //ACL        if ("/apigateway/order/api/v1/order/save".equalsIgnoreCase(request.getRequestURI())){            return true;        }else if ("/apigateway/order/api/v1/order/list".equalsIgnoreCase(request.getRequestURI())){            return true;        }else if ("/apigateway/order/api/v1/order/find".equalsIgnoreCase(request.getRequestURI())){            return true;        }        return false;    }    /**     * 业务逻辑     * @return     * @throws ZuulException     */    @Override    public Object run() throws ZuulException {        //JWT        RequestContext requestContext =  RequestContext.getCurrentContext();        HttpServletRequest  request = requestContext.getRequest();        //token对象        String token = request.getHeader("token");        if(StringUtils.isBlank((token))){            token  = request.getParameter("token");        }        //登录校验逻辑  根据公司情况自定义 JWT        if (StringUtils.isBlank(token)) {       requestContext.setSendZuulResponse(false);            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());        }        return null;    }}

 

3. 自定义 Zuul 过滤器实现限流

使用谷歌 Guava 框架

package net.xdclass.apigateway.filter;import com.google.common.util.concurrent.RateLimiter;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.ZuulException;import org.springframework.http.HttpStatus;import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;/** * 订单限流 */@Componentpublic class OrderRateLimiterFilter extends ZuulFilter {    //每秒产生1000个令牌    private static final RateLimiter RATE_LIMITER = RateLimiter.create(1000);    @Override    public String filterType() {        return PRE_TYPE;    }    @Override    public int filterOrder() {        return -4;    }    @Override    public boolean shouldFilter() {        RequestContext requestContext = RequestContext.getCurrentContext();        HttpServletRequest request = requestContext.getRequest();        //只对订单接口限流        if ("/apigateway/order/api/v1/order/save".equalsIgnoreCase(request.getRequestURI())){            return true;        }        return false;    }    @Override    public Object run() throws ZuulException {        RequestContext requestContext = RequestContext.getCurrentContext();        if(!RATE_LIMITER.tryAcquire()){            requestContext.setSendZuulResponse(false);            requestContext.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());        }        return null;    }}

注意:网关也是可以启用多个节点的,达到集群的目的 

 

4. Zuul微服务网关集群搭建

使用 Nginx+Lvs+Keepalive 

参考资料:

 

本文的示例承接上文:

转载于:https://www.cnblogs.com/jwen1994/p/11441947.html

你可能感兴趣的文章
图形学-剔除
查看>>
人生哲学
查看>>
JAVA调用.NET的WEBSERVICE
查看>>
Selenium+Python浏览器调用:Firefox
查看>>
nohup 详解
查看>>
树莓派实现摄像头监控(使用motion和mjpg-streamer)
查看>>
《转》推荐系统经典论文文献及业界应用
查看>>
webpack的像素转vw单位的loader插件
查看>>
javascript高级程序设计一书----关于创建和对象继承的总结
查看>>
媒体电话
查看>>
Web开发者欣喜若狂的40个UI设计工具和资源
查看>>
整数拼数 C语言版
查看>>
在固定宽度 下计算出实际的行高
查看>>
hdu 1873 看病要排队
查看>>
scope_ref的实现
查看>>
从零开始系列之vue全家桶(1)安装前期准备nodejs+cnpm+webpack+vue-cli+vue-router
查看>>
ASP.NET缓存 Cache之数据缓存
查看>>
bzoj3529: [Sdoi2014]数表
查看>>
SSH三大框架 整合必备jar包
查看>>
什么是电子商务?电子商务面临的几个关键问题及解决办法?电子商务的核心是什么?B2C电子商务运营的核心是什么 ?...
查看>>