前言
这一篇主要介绍如何构建服务网关,以及通过过滤器拦截请求。
正文
第一步,依赖
Maven的.pom文件中网关所需依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.3.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
第二步,配置
定义配置文件,命名为application.yml或application.properties均可。
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8762/eureka/
server:
port:
8888
spring:
application:
name: zuul
zuul:
routes:
provider:
path: /provider/**
serviceId: provider
consumer:
path: /consumer/**
serviceId: consumer
当访问/provider/getInfo的时候,网关会根据连接找到对应的【provider】Service对应的getInfo方法进行调用并返回结果。
第三步,过滤器
package com.silence.spring.cloud.zuul.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
public class MyZuulFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return false;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object token = request.getParameter("token");
if (token != null) {
return null;
}
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("auth fail!");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
当系统需要对请求的URL进行拦截时,可以继承ZuulFilter,时而对拦截的URL进行处理,比如token验证等等。
第四步,启动
构建启动类:
package com.silence.spring.cloud.zuul;
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;
@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
验证
同样,查看注册中心http://localhost:8762/,如果出现如下图,证明连接注册中心成功。
启动运行后,键入http://localhost:8888/consumer/printInfo 链接,可以获取与运行http://localhost:7000/printInfo 链接相同的结果: