网关服务Zuul

SpringCloud体系最常用网关组件为Zuul,网关Zuul通过配置文件约定的接口规则将请求转发到对应的微服务子项目去处理,这发挥的是其路由功能。除此之外,Zuul的路由功能可以处理前端的跨越问题。前端可以通过统一域名的请求,而实际的业务处理可能是在不同域名的服务下。Zuul网关还支持过滤器的处理,比如通过判断所有请求是否带临时票据token,token是否合法做权限拦截处理。

Zuul网关服务的使用需引入依赖

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

网关过滤器需继承ZuulFilter抽象类

package indi.lindl.gateway.filter;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

/**
 * 
 * @description: 权限过滤器
 * @copyright: Copyright (c) 2018
 * @author: LinDL
 * @version: 1.0
 * @date: 2018年7月28日 下午4:18:47
 */
@Component
public class PermissionFilter extends ZuulFilter{

    private static Logger logger=LoggerFactory.getLogger(PermissionFilter.class);
    @Override
    public Object run() {
        RequestContext ctx=RequestContext.getCurrentContext();
        HttpServletRequest request=ctx.getRequest();
        logger.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken=request.getParameter("token");
        if(accessToken==null) {
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
                ctx.getResponse().getWriter().write("token is empty");
            } catch (Exception e) {
                // TODO: handle exception
            }
            return null;
        }

        return null;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

}

启动类加@EnableZuulProxy注解,通过@Bean注册PermissionFilter

package indi.lindl.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

import indi.lindl.gateway.filter.PermissionFilter;

/**
 * 
 * @description: 网关服务启动类
 * @copyright: Copyright (c) 2018
 * @author: LinDL
 * @version: 1.0
 * @date: 2018年7月28日
 */
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
    @Bean
    public PermissionFilter registerPermissionFilter() {
        return new PermissionFilter();
    }
}

application.yml配置接口规则

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8888
spring:
  application:
    name: service-gateway
zuul:
  host:   
    socket-timeout-millis: 60000   
    connect-timeout-millis: 60000
  routes:
    api/user:
      path: /api/user/**
      serviceId: service-user
    api/order:
      path: /api/order/**
      serviceId: service-order
ribbon:   
  ReadTimeout: 60000   
  ConnectTimeout: 60000   
hystrix:   
  command:   
    default:   
      execution:   
        isolation:   
          thread:   
            timeoutInMilliseconds: 60000   

比如/api/user开头的接口请求的是service-user的服务,api/order开头的接口请求的是service-order的服务

猜你喜欢

转载自blog.csdn.net/u011731233/article/details/81263001