一、为什么需要网关?
安全性:
1.最主要的一点是网关可以将所有服务的API接口统一聚合,并统一对外暴露。外界系统调用API接口时,都是由网关对外暴露的API接口,外界系统不需要知道微服务系统中各个服务之间相互调用的复杂性。微服务系统也保护了七内部微服务单元的API接口,防止其被外部直接调用,导致服务的敏感信息泄露。
2.网关可以做用户身份认证和权限认证,防止非法请求操作API接口,对服务器起到保护作用。
性能:
1.zuul、ribbon、eureka相结合,可以实现路由和负载均衡的功能,zuul可以将请求流量按照默认轮询策略分发到集群状态下的不同服务实例。
作用:
1.可以实现负载均衡、路由转发、实时日志输出、权限控制、系统监控等
2.可以实现流量监控,在高流量的情况下,对服务进行降级

二、网关框架分类
1.Netflix Zuul,zuul是spring cloud的一个推荐组件,https://github.com/Netflix/zuul
    --本博客讲解Zuul
2.Kong kong是基于Nginx+Lua进行二次开发的方案, https://konghq.com/
3.orange,这个开源程序是国人开发的, http://orange.sumory.com/

三、怎么使用网关(Zuul)==>实战?
1.jar包依赖

<groupId>com.suning.drp</groupId>
     <artifactId>drp-gateway</artifactId>
     <version>0.0.1</version>
     <packaging>war</packaging>    <parent>
         <artifactId>drp-parent</artifactId>
         <groupId>com.suning.drp</groupId>
         <version>0.0.1</version>
            <relativePath>../drp-parent/pom.xml</relativePath>
     </parent>
     
     <dependencies>
         <!-- spring boot 1.X版本所依赖的zuul -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-zuul</artifactId>
         </dependency>
         <!-- spring boot 2.X版本所依赖的zuul -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
         </dependency>
         <!-- SpringBoot整合eureka客户端 -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
         </dependency>
     </dependencies>

2.配置文件

### eureka注册服务中心
     server.port=80
     eureka.client.serviceUrl.defaultZone=${eurekaServiceDefaultZone}
         ### eurekaServiceDefaultZone取值不同环境下的值,例子取的生产中的值,vars.prd.properties
         eurekaServiceDefaultZone=http://10.235.5.28:8080/eureka,http://10.235.5.29:8080/eureka,http://10.235.5.30:8080/eureka
     
     ### 网关名称
     spring.application.name=tigbs-gateway
     ### 反向代理,将服务的IP隐藏,通过项目名访问
     ### 以/cms/访问的请求地址转发到管理端
     zuul.routes.cms.path=/cms/**
     zuul.routes.cms.serviceId=drp-cms
     ### 以/portal/访问的请求地址转发到管理端
     zuul.routes.portal.path=/portal/**
     zuul.routes.portal.serviceId=drp-portal


3.启动类

// EnableZuulProxy开启zuul功能
 @EnableZuulProxy 
 // EnableEurekaClient将网关服务当做客户端注册到eureka服务中心
 @EnableEurekaClient
 @SpringBootApplication
 public class GateWayServiceApplication extends SpringBootServletInitializer {    public static void main(String[] args) {
         SpringApplication.run(GateWayServiceApplication.class, args);
     }    @Override     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
         return builder.sources(GateWayServiceApplication.class);
     }
 }


4.业务代码--验证用户在客户端是否有登陆
@Component

public class TokenFilter extends ZuulFilter {
     //具体过滤的逻辑
     public Object run() throws ZuulException {
         // 获取上下文
         RequestContext currentContext = RequestContext.getCurrentContext();
         HttpServletRequest request = currentContext.getRequest();
         String userToken = request.getParameter("userToken");
         if (StringUtils.isEmpty(userToken)) {
             currentContext.setSendZuulResponse(false);
             currentContext.setResponseStatusCode(401);
             currentContext.setResponseBody("userToken is empty");
             return null;
         }
         // 否则正常执行业务逻辑.....
         return null;
     }    // 判断过滤器是否生效,为true,说明需要过滤,则执行run()
     public boolean shouldFilter() {
         return true;
     }    // 过滤器的执行顺序。当请求在一个阶段的时候存在多个多个过滤器时,需要根据该方法的返回值依次执行
     // 优先级为0,数字越小,越早执行该过滤器
     public int filterOrder() {
         return 0;
     }    // 过滤器类型:pre,post,routing,error四种。 pre表示在请求之前进行拦截
     public String filterType() {
         return "pre";
     }}