Springcloud1---->Zuul网关

news/2025/3/16 12:30:12/

目录

  • 简介
  • 加入zuul后的架构
  • 快速入门
    • 添加Zuul依赖
    • 编写zuul启动类
    • 编写zuul配置文件
    • 编写路由规则
  • 面向服务的路由
    • 添加Eureka客户端依赖
    • 开启Eureka客户端发现功能
    • 添加Eureka配置,获取服务信息
    • 修改映射配置,通过服务名称获取
  • 简化的路由配置
  • 过滤器
    • 使用场景
    • 自定义过滤器

简介

在这里插入图片描述

加入zuul后的架构

在这里插入图片描述
不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都会经过Zuul这个网关,然后再由网关来实现 鉴权、动态路由等等操作。Zuul就是我们服务的统一入口。

快速入门

创建zuul服务

添加Zuul依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>

编写zuul启动类

通过 @EnableZuulProxy 注解开启Zuul的功能:

@SpringBootApplication
@EnableZuulProxy //开启zuul
public class ZuulServiceApplication {public static void main(String[] args) {SpringApplication.run(ZuulServiceApplication.class);}
}

编写zuul配置文件

server:port: 10000
spring:application:name: zuul-service

编写路由规则

zuul:routes:user-service:  #没用path: /user-service/**  # 服务实例IDurl: http://127.0.0.1:8080 # 服务代理的具体地址order-service: #没用path: /order-service/**  # 服务实例IDurl: http://127.0.0.1:9090 # 服务代理的具体地址

面向服务的路由

在刚才的路由规则中,我们把路径对应的服务地址写死了!如果同一服务有多个实例的话,这样做显然就不合理了。
我们应该根据服务的名称,去Eureka注册中心查找 服务对应的所有实例列表,然后进行动态路由才对!

添加Eureka客户端依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

开启Eureka客户端发现功能

在zuul服务启动类加注解@EnableDiscoveryClient //开启euerka客户端发现功能

@SpringBootApplication
@EnableDiscoveryClient //开启euerka客户端发现功能
@EnableZuulProxy //开启zuul
public class ZuulServiceApplication {public static void main(String[] args) {SpringApplication.run(ZuulServiceApplication.class);}
}

添加Eureka配置,获取服务信息

#    Eureka配置-- 目前先注册自己保证不报错
eureka:client:service-url:defaultZone: http://localhost:10086/eureka

修改映射配置,通过服务名称获取

因为已经有了Eureka客户端,我们可以从Eureka获取服务的地址信息,因此映射时无需指定IP地址,而是通过服务名称来访问,而且Zuul已经集成了Ribbon的负载均衡功能。

zuul:routes:order-service:path: /1/**#url: order-service  #无负载serviceId: order-service #有负载

简化的路由配置

我们关于user-service的配置可以简化为一条:

zuul:routes:order-service: /1/**user-service: /2/**

省去了对服务名称的配置。

过滤器

Zuul作为网关的其中一个重要功能,就是实现请求的鉴权。而这个动作我们往往是通过Zuul提供的过滤器来实现的。

使用场景

场景非常多:

  • 请求鉴权:一般放在pre类型,如果发现没有访问权限,直接就拦截了
  • 异常处理:一般会在error类型和post类型过滤器中结合来处理。
  • 服务调用时长统计:pre和post结合使用。

自定义过滤器

接下来我们来自定义一个过滤器,模拟一个登录的校验。基本逻辑:如果请求中有access-token参数,则认为请求有效,放行。
创建一个LoginFilter:

@Component
@Log4j2
public class LoginFilter extends ZuulFilter {@Overridepublic String filterType() {return FilterConstants.PRE_TYPE;}@Overridepublic int filterOrder() {return -1;}@Overridepublic boolean shouldFilter() {return true;}@SneakyThrows@Overridepublic Object run() throws ZuulException {log.warn("========================================");//1)获取Zuul提供的请求上下文对象RequestContext ctx = RequestContext.getCurrentContext();//2)从上下文中获取request对象HttpServletRequest request = ctx.getRequest();HttpServletResponse response = ctx.getResponse();response.setContentType("application/json;charset=utf-8");// 3) 从请求中获取token//获取tokenString token = request.getHeader("token");log.info("token:{}",token);String requestURI = request.getRequestURI();if(requestURI.equals("/1/login")){return null;}//判断token是否正常if(StringUtils.isEmpty(token)){Result result = new Result(401,"token丢失");String json = new ObjectMapper().writeValueAsString(result);// 没有token,登录校验失败,拦截ctx.setSendZuulResponse(false);// 返回401状态码(未授权)。也可以考虑重定向到登录页。ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());ctx.setResponseBody(json);//拦截//return false;}//处理token是否有效boolean b = JwtUtil.checkToken(token);if(!b){Result result = new Result(401,"token失效");String json = new ObjectMapper().writeValueAsString(result);// 没有token,登录校验失败,拦截ctx.setSendZuulResponse(false);// 返回401状态码(未授权)。也可以考虑重定向到登录页。ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());ctx.setResponseBody(json);//拦截//return false;}return null;}
}

http://www.ppmy.cn/news/92800.html

相关文章

【Python】字符串操作

知识目录 一、写在前面✨二、字符串逆序三、打印菱形四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;很高兴再次跟大家见面。&#xff08;相遇就是缘分啊&#xff09; 今天跟大家分享的文章是 Python中的字符串操作 &#xff0c;希望能帮助…

一图看懂 typing_extensions 模块:允许在旧版Python上启用、实验新的类型系统特性,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 typing_extensions 模块&#xff1a;允许在旧版Python上启用、实验新的类型系统特性&#xff0c;资料整理笔记&#xff08;大全&#xff09; &#x1f9ca;摘要&#x1f9c…

【C++】容器篇(一)—— vector 的基本概述以及模拟实现

前言&#xff1a; 在之前&#xff0c;我们已经对 string类进行了基本的概述&#xff0c;并且手动的实现了string类中常用的接口函数。本期&#xff0c;我将带领大家学习的是STL库中的一个容器 -- vector 的学习。相比于之前的string类&#xff0c;本期的 vector 相对来说实现起…

凭据收集工具 Legion 瞄准额外的云服务

黑客在受感染的 Web 服务器上部署的名为 Legion 的商业恶意软件工具最近已更新&#xff0c;可以提取额外云服务的凭据以通过 SSH 进行身份验证。 这个基于 Python 的脚本的主要目标是获取存储在电子邮件提供商、云服务提供商、服务器管理系统、数据库和支付系统的配置文件中的…

数字电路基础

目录 一、不同进制之间的转换 二、逻辑代数基础 三、门电路 四、组合逻辑电路 五、半导体存储电路 六、时序电路 一、不同进制之间的转换 二-十转换&#xff1a; 十-二转换&#xff1a; 二-十六转换 十六-二转换 八-二转换 二-八转换 十六-十转换&#xff1a; 先转换成…

c++primer 第12章 动态内存

文章目录 第12章 动态内存12.1 动态内存与智能指针12.1.1 share_ptr类12.1.2 直接管理内存12.1.3 shared_ptr和new结合使用12.1.4 智能指针和异常12.1.5 unique_ptr12.1.6 weak_ptr 12.2 动态数组12.2.1 new和数组12.2.2 allocator类 12.3 使用标准库&#xff1a;文本查询程序1…

系统集成项目管理工程师 下午 真题 及考点(2018年下半年)

文章目录 一&#xff1a;第4章 项目管理一般知识&#xff0c;项目管理办公室的职责。第6章 项目整体管理二&#xff1a;第5章 项目立项管理。第14章 项目采购管理&#xff0c;采购文件。第13章 项目合同管理&#xff0c;按项目 付款方式 划分的合同分类三&#xff1a;第9章 项目…

全网最火爆,性能测试-测试用例与测试方法总结(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试用例 无…