功能
请求路由和校验过滤
整合
Zuul 和 Eureka 进行整合,将 Zuul 自身注册为 Eureka 服务治理中的服务,同时从 Eureka 中获得其他微服 务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。 注意:Zuul服务终还是会注册进Eureka
image.png
实战
建工程gateway
导依赖
<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>
<!--zuul路由网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
yml
server:
port: 7001
spring:
application:
name: microservice-zuul-gateway
eureka:
client:
registerWithEureka: true # 服务注册开关
fetchRegistry: true # 服务发现开关
serviceUrl: # 客户端(服务提供者)注册到哪一个Eureka Server服务注册中心,多个用逗号分隔
# 单机版 Eureka 服务注册中心
#defaultZone: http://localhost:6001/eureka
# 集群版 Eureka 服务注册中心
defaultZone: http://eureka6001.com:6001/eureka,http://eureka6002.com:6002/eureka
instance:
instanceId: ${spring.application.name}:${server.port} # 指定实例ID,就不会显示主机名了
preferIpAddress: true #访问路径可以显示IP地址
zuul:
routes:
provider-product: # 路由名称,名称任意,路由名称唯一
path: /product/** # 访问路径
serviceId: microservice-product # 指定服务ID,会自动从Eureka中找到此服务的ip和端口
stripPrefix: false # 代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时请求 /product/get/1,代理转发到/get/1
# 如果多个服务需要经过路由,则同povider-product方式继续添加,例如:
#provider-order:
#path: /order/**
#serviceId: microservice-order
#stripPrefix: false
启动测试
image.png
注册成功
测试 通过7001 访问
使用路由访问 (注意是 7001 端口), 当前要加上服务名
http://localhost:7001/microservice-product/product/get/1
配置路由映射
- 隐藏了真实的路径 保护作用
去掉服务名 - stripPrefix是否去掉访问路径前缀 一般false
zuul:
routes:
provider-product: # 路由名称,名称任意,路由名称唯一
path: /product/** # 访问路径
serviceId: microservice-product # 指定服务ID,会自动从Eureka中找到此服务的ip和端口
stripPrefix: false # 代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时请求 /product/get/1,代理转发到/get/1
就没有服务的名字了
http://localhost:7001/product/get/1
过滤器实战
返回值的不同
filterType:
返回字符串代表过滤器的类型,返回值有:
- pre:在请求路由之前执行
- route:在请求路由时调用
- post:请求路由之后调用, 也就是在route和errror过滤器之后调用
- error:处理请求发生错误时调用
filterOrder:
此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。
shouldFilter:返回Boolean值,判断该过滤器是否执行。返回true表示要执行此过虑器,false不执行。
run:过滤器的业务逻辑。
话不多说直接上码
package com.mengxuegu.springcloud.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component //一定不要少了
public class LoginFilter extends ZuulFilter {
Logger logger = LoggerFactory.getLogger(getClass());
/**
* 返回值可取:
* - pre:在请求路由之前执行
* - route:在请求路由时调用
* - post:请求路由之后调用, 也就是在route和errror过滤器之后调用
* - error:处理请求发生错误时调用
* @return
*/
@Override
public String filterType() {
return "pre"; //
}
@Override
public int filterOrder() {
return 1; //返回值是int,会根据返回值进行定义过滤器的执行顺序,值越小优先级越大
}
@Override
public boolean shouldFilter() {
return true; //当前过滤器是否被执行,true则执行,false不执行
}
//定义 过滤功能
@Override
public Object run() throws ZuulException {
//1.获取请求上下文
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
//如果说请求带了token值,则表示已经登录过
if(token == null) {
logger.warn("此操作需要先登录系统");
//没有登录 过,则不进行路由转发
context.setSendZuulResponse(false);//拒绝访问
context.setResponseStatusCode(200); //响应状态码
try {
context.getResponse().getWriter().write("token is empty...");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//通过,会进行路由转发
logger.info("通过,会进行路由转发");
return null;
}
}
这句代码用来设置是否转发
context.setSendZuulResponse(false);//拒绝访问
网友评论