使用网关优点:
易于监控。可在微服务网关收集监控数据并将其推送到外部系统进行分析。
易于认证。可在微服务网关上进行认证。然后再将请求转发到后端的微服务,而无须在每个微服务中进行认证。
减少了客户端与各个微服务之间的交互次数。
新建子工程模块zull-demo
在pom.xml中添加eureka依赖和zuul依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--zuul路由网关,springboot,2.0.3才有,要么在这加版本,要么在父工程把springboot改成2.0.3-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
</dependencies>
添加配置文件application.yml
###服务器启动端口号
server:
port: 9000
###服务名称(服务注册到eureka名称)
spring:
application:
name: 6ms-zuul
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka
zuul:
routes:
###路由名称:随便起
###意思就是服务器启动的时候,请求/api-order/**,实际上就是访问6ms-order的服务,不管访问/api-order/**还是6ms-order都会进网关
api-order:
path: /api-order/**
serviceId: 6ms-order
api-user:
path: /api-user/**
serviceId: 6ms-user
创建启动类
@SpringBootApplication
//开启zuul功能
@EnableZuulProxy
@EnableEurekaClient
public class ZuulApp {
public static void main(String[] args) {
SpringApplication.run(ZuulApp.class,args);
}
}
过滤器
Filter的四个方法,FilterType,filterOrder,shouldFilter,run。
pre、post和error。分别代表前置过滤,后置过滤和异常过滤。
@Component
public class MyFilter1 extends ZuulFilter {
@Override
public String filterType() {
//前置过滤器
return FilterConstans.PRE_TYPE;
}
@Override
public int filterOrder() {
//优先级,数字越大,优先级越低
return 0;
}
@Override
public boolean shouldFilter() {
//是否执行该过滤器,true代表需要过滤
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info("send {} request to {}", request.getMethod(), request.getRequestURL().toString());
//获取传来的参数accessToken
Object accessToken = request.getParameter("accessToken");
if(accessToken == null) {
log.warn("access token is empty");
//过滤该请求,不往下级服务去转发请求,到此结束
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody("{\"result\":\"accessToken为空!\"}");
ctx.getResponse().setContentType("text/html;charset=UTF-8");
return null;
}
//如果有token,则进行路由转发
log.info("access token ok");
//这里return的值没有意义,zuul框架没有使用该返回值
return null;
}
}