网站首页 > 技术文章 正文
什么是 Zuul
- Spring Cloud Zuul 是整合Netflflix公司的 Zuul开源项目(官方:https://github.com/Netflflix/zuul);
- Zuul 包含了对请求路由和校验过滤两个最主要的功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,
客户端请求网关/api/product,通过路由转发到 product 服务
客户端请求网关/api/order,通过路由转发到 order 服务
而过滤功能则负责对请求的处理过程进行干预,是实现请求校验等功能的基础.
- Zuul 和 Eureka 进行整合,将 Zuul 自身注册为 Eureka 服务治理中的服务,同时从 Eureka 中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul服务最终还是会注册进Eureka
Zuul 路由功能实战
新建 cyz-cloud-zuul-gateway
配制pom.xml文件
<dependencies>
<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>
</dependencies>
配置application.properties文件
server.port=7001
spring.application.name=zuul-gateway
#服务注册,false表示不将自已注册到Eureka服务中
eureka.client.register-with-eureka=true
#服务发现,false表示自己不从Eureka服务中获取注册信息
eureka.client.fetch-registry=true
#Eureka客户端与Eureka服务端的交互地址,集群版配置对方的地址,单机版配置自 己(如果不配置则默认本机8761端口)
eureka.client.service-url.defaultZone=http://cyz01.com:6001/eureka/,http://cyz02.com:6002/eureka/
eureka.instance.instance-id=${spring.application.name}:${server.port}
eureka.instance.prefer-ip-address=true
#路由名称,名称任意,路由名称唯一# 访问路径
zuul.routes.provider-product.path=/product/**
#指定服务ID,会自动从Eureka中找到此服务的ip和端口
zuul.routes.provider-product.service-id=cyz-provider
#代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时 请求 /product/get/1,代理转发到/get/1
zuul.routes.provider-product.strip-prefix=false
# 如果多个服务需要经过路由,则同povider-product方式继续添加,例如:
# provider-order: #path: /order/** #serviceId: microservice-order #stripPrefix: false
配置启动类
//开启zuul的功能
@EnableZuulProxy
@SpringBootApplication
public class ZuulGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulGatewayApplication.class,args);
}
}
测试zuul是否已被注册
测试zuul路由服务是否注册进Eureka注册中心
1. 启动2个 eureka
2. 启动服务提供者:cyz-cloud-provider-hystrix
3. 启动路由:cyz-cloud-zuul-gateway
4. 效果如下:http://cyz01.com:6001/
5. 不用路由直接访问
访问:http://localhost:8001/product/get/1
6. 使用路由访问 (注意是 7001 端口), 当前要加上服务名
访问:http://localhost:7001/cyz-provider/product/get/1?token=uieie
路由转发映射配置
在 application.properties配置文件中追加部分
#路由名称,名称任意,路由名称唯一# 访问路径
zuul.routes.provider-product.path=/product/**
#指定服务ID,会自动从Eureka中找到此服务的ip和端口
zuul.routes.provider-product.service-id=cyz-provider
#代理转发时去掉前缀,false:代理转发时不去掉前缀 例如:为true时 请求 /product/get/1,代理转发到/get/1
zuul.routes.provider-product.strip-prefix=false
# 如果多个服务需要经过路由,则同povider-product方式继续添加,例如:
#zuul.routes.provider-order.path=/order/**
#zuul.routes.provider-order.service-id=cyz-order
#zuul.routes.provider-order.strip-prefix=false
测试zuul路由功能
1. 基于上面8.2.5测试启动的服务中, 重启路由:microservice-cloud-10-zuul-gateway-7001
2. 未配置路由转发映射, 通过路由请求方式 :
http://localhost:7001/cyz-provider/product/get/1
3. 已配置路由转发映射, 通过路由请求方式 :
http://localhost:7001/product/get/1
只要接收到/product开头的路径,就会转发到 cyz-cloud-provider-hystrix 服务。
Zuul 过滤器实战
Zuul核心就是过虑器,通过过虑器实现请求过虑,身份校验等。
自定义过滤器
- 自定义过虑器需要继承 ZuulFilter,ZuulFilter是一个抽象类,需要覆盖它的4个方法,如下:
fifilterType:返回字符串代表过滤器的类型,返回值有:
pre:在请求路由之前执行
route:在请求路由时调用
post:请求路由之后调用,也就是在route和errror过滤器之后调用
error:处理请求发生错误时调用
fifilterOrder:此方法返回整型数值,通过此数值来定义过滤器的执行顺序,数字越小优先级越高。
shouldFilter:返回Boolean值,判断该过滤器是否执行。返回true表示要执行此过虑器,false不执行。
run:过滤器的业务逻辑。
- 自定义过滤器 LoginFilter
继承 ZuulFilter
在类上添加 @Component 注解 (一定不要少了)
实现抽象方法
package com.cyz.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;
/**
* @author Cyz
* @description
* @date 2022/5/4 20:58
*/
@Component
public class LoginFilter extends ZuulFilter {
Logger logger = LoggerFactory.getLogger(getClass());
@Override
public String filterType() {
//请求路由前调用
return "pre";
}
@Override
public int filterOrder() {
//int值来定义过滤器的执行顺序,数值越小优先级越高
return 1;
}
@Override
public boolean shouldFilter() {
//该过滤器是否执行,true执行,false不执行
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
//获取请求参数token的值
String token = request.getParameter("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("ok");
return null;
}
}
测试功能
1. 启动2个 eureka
2. 启动服务提供者:cyz-cloud-provider-hystrix
3. 启动路由:cyz-cloud-zuul-gateway
4. 通过路由(7001)访问服务提供者:
不带 token参数访问:http://localhost:7001/product/get/1
带 token参数访问:http://localhost:7001/product/get/1?token=cyz
带上token校验通过放行。
参考源码:https://gitee.com/cyzgw/spring-cloud.git
原文链接:cyz
猜你喜欢
- 2024-11-22 SpringCloud——zuul权限校验、接口限流
- 2024-11-22 Spring Cloud源码分析(四)Zuul:核心过滤器
- 2024-11-22 Spring Cloud Zuul 学习+实践
- 2024-11-22 SpringCloud网关及Zuul项目搭建,你确定你了解?
- 2024-11-22 springcloud-zuul微服务网关高可用的场景概述
- 2024-11-22 24岁秃头程序员带你深入学习微服务网关Zuul源码解析,不来别后悔
- 2024-11-22 SpringCloud微服务架构篇6:Zuul路由规则
- 2024-11-22 Spring Cloud Zuul的学习
- 2024-11-22 springcloud(十一):服务网关Zuul高级篇
- 2024-11-22 SpringCloud系列之Zuul网关和Zuul过滤器
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)