我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringCloud超详细讲解微服务网关Zuul

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringCloud超详细讲解微服务网关Zuul

网关的作用

微服务架构中,服务实例的地址可能经常会发生变化,所以我们不能直接将服务的地址暴露出来。如果每一个微服务都直接暴露接口,会导致一系列的问题,比如调用过于复杂,涉及到账户、权限不能统一处理等。另外基于高内聚低耦合的设计准则来讲,我们也应该将内部系统和外部系统做切割。

因此,这时就需要有一个独立的组件来处理外部的请求,这个组件就是服务网关。服务网关就是为了简化前端的调用逻辑,通常情况下也会实现相关的认证逻辑,根据外部不同的请求响应不同的数据,从而简化内外部系统之间调用的复杂度。

服务网关负责服务请求路由、组合及协议转换。客户端的所有请求都首先经过服务网关,然后由它将请求路由到合适的微服务。服务网关经常会通过调用多个微服务并合并结果来处理一个请求,它可以在系统外部与内部响应之间友好的转换。

本文将先着重介绍Zuul组件。

Spring Cloud 网关组件Zuul介绍

Zuul 是 Netflix 公司开源的产品,被称为第一代网关,也是 Spring Cloud 前几个版本默认使用的一款提供动态路由微服务网关组件。Zuul 接收所有外来请求,并将请求转发到对应的后端服务。作为一个前置服务,Zuul 旨在实现动态路由,监控,弹性和安全性等功能。

Zuul 提供了不同类型的 filter 用于处理请求,这些 filter 可以让我们实现以下功能:

  • 权限控制和安全性:可以识别认证需要的信息和拒绝不满足条件的请求。
  • 监控:与边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  • 动态路由:根据需要动态地路由请求到后台的不同集群。
  • 压力测试:逐渐增加指向集群的流量,以了解性能。
  • 负载均衡:为每一种负载类型分配对应容量,并弃用超出限定值的请求
  • 静态资源处理:直接在 zuul 处理静态资源的响应,从而避免其转发到内部集群。

Zuul网关实战

之前的介绍中,我们启动了注册中心registry,dms服务,和app服务,请求时,直接调用了app服务的接口,app服务又调用了dms服务:

加上网关服务之后,就会变成如下:

接下来,我们创建zuul服务:

1、创建服务

创建子模块zuul,pom.xml引入eureka-client 和zuul的依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!-- zuul路由 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

2、创建配置文件

server:
  port: 8004
spring:
  application:
    name: zuul

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/
feign:
  hystrix:
    enabled: true
zuul:
  routes:
    app: #活动
      path: /app/** #配置请求URL的请求规则
      serviceId: app #指定Eureka注册中心中的服务id
    dms: #活动
      path: /dms/** #配置请求URL的请求规则
      serviceId: dms #指定Eureka注册中心中的服务id
logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n'

3、创建Zuul过滤器

public class MyZuulFilter extends ZuulFilter {
//    pre :可以在请求被路由之前调用
//    route :在路由请求时候被调用
//    post :在route和error过滤器之后被调用
//    error :处理请求时发生错误时被调用
    @Override
    public String filterType() {
        return "pre";// 前置过滤器
    }
    //通过int值来定义过滤器的执行顺序,优先级为0,数字越大,优先级越低
    @Override
    public int filterOrder() {
        return 0;
    }
    //返回一个boolean类型来判断该过滤器是否要执行,所以通过此函数可实现过滤器的开关
    @Override
    public boolean shouldFilter() {
        return true;//此处为true,说明需要过滤
    }
    //过滤器的具体逻辑。
    @Override
    public Object run() throws ZuulException {
        // 获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        String accessToken = request.getParameter("accessToken");
        if (StringUtils.isEmpty(accessToken)) {
            //setSendZuulResponse(false)令zuul过滤该请求,不进行路由
            currentContext.setSendZuulResponse(false);
            //设置返回的错误码
            currentContext.setResponseStatusCode(401);
            currentContext.setResponseBody("AccessToken is null");
            return null;
        }
        System.out.println("获取到AccessToken为:"+accessToken);
        // 否则正常执行业务逻辑.....
        return null;
    }
}

4、编写启动类

注意增加@EnableZuulProxy注解

@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }
}

5、启动验证

这个时候,我们将直接请求app的接口地址,改成网关zuul的地址和端口:http://localhost:8004/app/index

可以看到,请求中没有token访问授权认证失败!

总结

总结下网关的作用:

  • 简化客户端调用的复杂度,统一处理外部请求。
  • 数据的裁剪和聚合,根据不同的接口需求,对数据加工后对外提供接口
  • 多平台的支持,对不同的客户端提供不同的网关支持。
  • 遗留系统的微服务化改造,可以作为新老系统的中转组件。
  • 统一处理调用过程中的安全、权限问题。

到此这篇关于SpringCloud超详细讲解微服务网关Zuul的文章就介绍到这了,更多相关SpringCloud Zuul内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringCloud超详细讲解微服务网关Zuul

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringCloud超详细讲解微服务网关Zuul基础

这篇文章主要介绍了SpringCloud Zuul微服务网关,负载均衡,熔断和限流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-11-13

SpringCloud微服务网关Zuul的作用是什么

这篇文章主要介绍“SpringCloud微服务网关Zuul的作用是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringCloud微服务网关Zuul的作用是什么”文章能帮助大家解决问题。网关
2023-07-02

Java微服务NacosConfig配置中心超详细讲解

配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护
2023-02-09

超详细讲解Linux DHCP服务

目录一、DHCP服务(动态主机配置协议)1.背景2.概述3.优点4.DHCP报文类型5.DHCP 的分配方式二、安装 DHCP 服务器1.DHCP 服务软件2.主配置文件三、配置步骤1.使用 DHCP 动态的给 PkHmtPjC 机分配 I
2022-06-04

SpringCloud分布式微服务云架构 第五篇: 路由网关(zuul)(Finchley版本)

SpringCloud分布式微服务云架构 第五篇: 路由网关(zuul)(Finchley版本)在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现、服务消费、负载均衡、断路器、智能路由、配置管理等,了解springcloud架构
2023-06-05

关于SpringCloud的微服务以及组件详解

这篇文章主要介绍了关于SpringCloud的微服务以及组件详解,是一个更高层次的、架构视角的综合性大型项目,他的目标是构建一套标准化的微服务解决方案,需要的朋友可以参考下
2023-05-20

Spring Cloud Gateway 服务网关的部署与使用详细讲解

这篇文章主要介绍了Spring Cloud Gateway 服务网关的部署与使用详细介绍,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-14

JavaFeign微服务接口调用方法详细讲解

现如今微服务架构十分流行,而采用微服务构建系统也会带来更清晰的业务划分和可扩展性。java如果使用微服务就离不开springcloud,我这里是把服务注册到nacos上,各个服务之间的调用使用feign
2023-01-29

SpringCloud实现服务调用feign与熔断hystrix和网关gateway详细分析

这篇文章主要介绍了SpringCloud实现服务调用feign与熔断hystrix和网关gateway,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2023-05-14

阿里云服务器网关超时解决方法详解

阿里云服务器网关是一款高性能的API网关,能够有效提高服务的可用性和稳定性。然而,有时在使用过程中可能会遇到网关超时的问题,这可能会影响到服务的正常运行。本文将详细介绍阿里云服务器网关超时的解决方法。一、阿里云服务器网关超时问题的原因阿里云服务器网关超时问题可能由多种原因导致,包括:网络问题:网络延迟或不稳定可能
阿里云服务器网关超时解决方法详解
2023-11-20

Java微服务Filter过滤器集成Sentinel实现网关限流过程详解

这篇文章主要介绍了Java微服务Filter过滤器集成Sentinel实现网关限流过程,首先Sentinel规则的存储默认是存储在内存的,应用重启之后规则会丢失。因此我们通过配置中心Nacos保存规则,然后通过定时拉取Nacos数据来获取规则配置,可以做到动态实时的刷新规则
2023-02-10

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录