zuul接口網關
- 攔截所有請求,網關進行請求轉發(類似nginx反向代理)
- 路由分發
- 請求參數驗證(token)
- 不必再每個子產品配置攔截器
zuul網關現實
- 搭建環境,項目依賴
<groupId>com.link</groupId>
<artifactId>zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zuul</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.link</groupId>
<artifactId>springcloud01</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
- 項目配置
server:
port: 8884
spring:
application:
name: service-zuul
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
# zuul路由分發,類似代理作用
# 以: /api-a/ 到 service-ribbon服務
# 例:http://localhost:8886/api-a/getUserList
# ==> http://service-ribbon的位址/getUserList
zuul:
routes:
api-a:
path: /api-a/**
serviceId: service-ribbon
api-b:
path: /api-b/**
serviceId: service-feign
- 配置網關過濾器
- 網關攔截參數
@Component
public class MyFilter extends ZuulFilter {
private static Logger log = LoggerFactory.getLogger(MyFilter.class);
/**
* 路由時過濾類型,分四種:
* pre:路由前
* routing:路由時
* post:路由後
* error:發送錯誤
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 過濾的順序
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 是否過濾請求:
* 邏輯判斷,是否要過濾
* true: 過濾,執行過濾邏輯
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 過濾器的具體邏輯
* 進行權限校驗:
* 此處url不帶token将被攔截
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
Object accessToken = request.getParameter("token");
if(accessToken == null) {
log.warn("token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is empty");
}catch (Exception e){
}
return null;
}
log.info("ok");
return null;
}
}
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient
public class ZuulApplication {}
- 啟動服務
service-ribbon
service-feign
server-zuul
效果:
http://localhost:8884/api-a/getUserList ==> http://service-ribbon的位址/getUserList
http://localhost:8884/api-b/getUserList ==> http://service-feign的位址/getUserList