SpringCloud之Zuul(微服务网关)
在上面我们学习了 Eureka 之后我们知道了服务提供者是消费者通过[Eureka] Server进行访问的,即[Eureka] Server是服务提供者的统一入口。那么整个应用中存在那么多消费者需要用户进行调用,这个时候用户该怎样访问这些消费者工程呢?当然可以像之前那样直接访问这些工程。但这种方式没有统一的消费者工程调用入口,不便于访问与管理,而 Zuul 就是这样的一个对于消费者的统一入口。
一.Zull是什么?
Zuul网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能,提供路由请求、鉴权、监控、缓存、限流等功能
1.其中路由能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一的入口的基础,
2.过滤器功能则负责对请求的处理过程进行干预,是实现请求验证、服务聚合等功能的基础
3.Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,
同时从Eureka中获取其他微服务的信息,也既以后的访问微服务都是通过Zuul跳转后获得
主流网关
zuul
:Netflix开源的微服务网关,和Eureka
,Ribbon
,Hystrix等组件配合使用
.
kong
nginx
+lua
GateWay
二.zuul原理
三.自定义Zuul过滤器实现登录鉴权
@Component
public class AuthZuulFilter extends ZuulFilter {
@Override
public String
filterType() {
return FilterConstants
.PRE_TYPE
;
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
RequestContext requestContext
= RequestContext
.getCurrentContext();
HttpServletRequest request
= requestContext
.getRequest();
String token
= request
.getHeader("token");
return StringUtils
.hasLength(token
);
}
@Override
public Object
run() throws ZuulException
{
RequestContext requestContext
= RequestContext
.getCurrentContext();
HttpServletRequest request
= requestContext
.getRequest();
System
.out
.println("执行token鉴权........................");
requestContext
.setSendZuulResponse(false);
System
.out
.println("aaaaa");
requestContext
.setResponseStatusCode(HttpStatus
.UNAUTHORIZED
.value());
try {
requestContext
.getResponse().getWriter().write("no unauthorized");
} catch (IOException e
) {
e
.printStackTrace();
}
return null
;
}
}
四.yml配置(定制路由匹配规则以及携带Cookie)
server:
port: 9000
spring:
application:
name: zuul
-server
eureka:
client:
registerWithEureka: true
fetchRegistry: true
serviceUrl:
defaultZone: http
://localhost
:8761/eureka/
zuul:
sensitiveHeaders:
ignoredPatterns: /*
-server/**
routes:
order-server-route:
path: /order/**
serviceId: order
-server
product-server-route:
path: /product/**
serviceId: product
-serve
启动类
@SpringBootApplication
@EnableZuulProxy
public class ZuulMain9000 {
public static void main(String
[] args
) {
SpringApplication
.run(ZuulMain9000
.class, args
);
}
}
五.小结
1.Zuul网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层
,
处理非业务功能
,提供路由请求、鉴权、监控、缓存、限流等功能
2.Zuul包含了对请求的路由和过滤两个最主要的功能
3.Zuul网关默认会过滤掉Cookie与敏感的HTTP头信息
(这个需要我们额外配置
)
4.访问方式统一通过网关ip端口和要访问的服务名及参数路径和参数
例
:http
://localhost
:9000/order
-server
/orders
/save
/1/1