1. 程式人生 > >閘道器服務Zuul

閘道器服務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抽象類

@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

@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的服務