spring cloud Zuul网关

1,Spring Cloud Zuul是什么

spring cloud Zuul是spring cloud基于Netflix Zuul做了封装的API网关。所谓API网关就是外部接口网关,主要包含对外部请求的代理、路由、过滤三大功能。

代理:指的就是采用代理路径屏蔽内部服务的服务名,避免直接暴露内部服务信息。

路由:指的就是Zuul通过在注册中心获取的服务信息,将请求转发到内部具体的内部服务(默认采用轮询的负载均衡策略)。Zuul的路由,由于是从注册中心动态获取的服务信息,所以,避免了服务集群扩展导致修改路由配置的问题,减少类似F5、Nginx等路由时需要维护的服务列表和服务地址信息。

过滤:就是指,在Zuul中,通过过滤器(ZuulFilter)实现的逻辑,决定是否转发客户端请求。;

2,Zuul网关实现(集群配置)

1,pom文件配置:

        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-zuulartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-eurekaartifactId>
        dependency>

2,应用启动类:

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

3,yaml配置:

server:
  port: 80
spring:
  application:
    name: api-gateway 
eureka:
  client: 
    service-url: 
      defaultZone: http://eurekaserver1:8081/eureka/,http://eurekaserver2:8082/eureka/,http://eurekaserver3:8083/eureka/    
  instance: 
    instance-id: ${spring.cloud.client.ipAddress}:${server.port} # 将Instance ID设置成IP:端口的形式;这个instance-id是服务实例在注册中心的唯一标识。
    prefer-ip-address: true     #访问路径可以显示IP地址  
#如下简单的配置zuul,实现代理,屏蔽了service-provider服务直接访问,对外暴露为serprovider;zuul默认对指定服务名的实例采用轮询负载均衡策略
zuul: 
  ignored-services: service-provider
  routes: 
    serprovider.serviceId: service-provider
    serprovider.path: /serprovider/**

4,添加自定义过滤器

自定义过滤器,从ZuulFileter继承,可以实现多个,注入容器,会自动被按序执行;

@component
public class PreFilter extends ZuulFilter{
    /**
     * true执行;false不执行;
     */
    @Override
    public boolean shouldFilter() {
        return true; 
    }

    /**
     * 过滤器类型
     * pre:路由之前调用。
     * routing:路由时候被调用。
     * error:发生错误时被调用。
     * post:后置过滤器。
     */
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    /**
     * 执行顺序
     */
    @Override
    public int filterOrder() {
        return 1;
    }

    /**
     * 执行过滤
     */
    @Override
    public Object run() {

        RequestContext ctx = RequestContext.getCurrentContext();  
        HttpServletRequest request = ctx.getRequest();  
        if (true == ctx.getSendZuulResponse()) {
            //根据request信息,处理业务判断
            //如果通过校验,则设置true;进行路由
            ctx.setSendZuulResponse(true);
            ctx.setResponseStatusCode(200);
            //如果校验不通过,则设置;不执行路由
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.setResponseBody("{\"result\":\"提示信息\"}");
        }
        return null;
    }
}

3,总结

Spring Cloud Zuul是高可用的API网关,和Eureka、Hystrix等可以很好的整合工作,可以代替Nginx等网关,也可以和Nginx等组合使用。

你可能感兴趣的:(IT研发技术类)