- 新建module:service-zuul,并在父pom.xml中添加模块
- 修改service-zuul对应的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.springcloud</groupId>
<artifactId>eureka</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.springcloud</groupId>
<artifactId>service-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>service-zuul</name>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
- 在启动类中添加注解@EnableZuulProxy,@EnableEurekaClient
- 修改application.xml
spring:
application:
name: service-zuul
server:
port: 8766
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
zuul:
routes:
api-a:
path: /api-a/**
serviceId: service-ribbon
api-b:
path: /api-b/**
serviceId: service-feign
- 依次启动eureka-server,eureka-client,service-feign,service-ribbon,service-zuul,并通过service-zuul来访问service-feign与service-ribbon对应的服务。
- 服务过滤,安全验证等,由于zuul的核心是一系列的filters, 其作用可以类比servlet框架的Filter,或者AOP。新建一个filter继承ZuulFilter,并重写过滤逻辑。
@Component
public class MyFilter extends ZuulFilter {
private static Logger logger = LoggerFactory.getLogger(MyFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext rc = RequestContext.getCurrentContext();
HttpServletRequest request = rc.getRequest();
logger.info(String.format("%s————%s", request.getMethod(), request.getRequestURL().toString()));
Object accessToken = request.getParameter("token");
if (accessToken == null) {
logger.warn("token is empty!");
rc.setSendZuulResponse(false);
rc.setResponseStatusCode(401);
try {
rc.getResponse().getWriter().write("token is empty!");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
logger.info("success");
return null;
}
}
- 重启service-zuul服务,得到如下图结果