閘道器服務Zuul
阿新 • • 發佈:2018-12-11
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的服務