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

目录
  • 网关的作用
  • Spring Cloud 网关组件Zuul介绍
  • Zuul网关实战
    • 1、创建服务
    • 2、创建配置文件
    • 3、创建Zuul过滤器
    • 4、编写启动类
    • 5、启动验证
  • 总结

网关的作用

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

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

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

本文将先着重介绍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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringCloud Zuul服务功能与使用方法解析

    Zuul是什么? Zuul包含了对请求的路由和过滤两个最主要的功能: 其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验.服务聚合等功能的基础. Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得. 注意:Zuul服务最终还是会注册进Eureka 提供=代理+路由+过滤三大功能 •创建项目,

  • SpringCloud Zuul的使用简介

    目录 简介 使用 简介 Zuul是Spring Cloud全家桶中的微服务API网关. 所有从设备或网站来的请求都会经过Zuul到达后端的Netflix应用程序 Zuul 主要提供路由(请求转发)和过滤 Zuul 最终会注入Eureka 提供: 代理,过滤和路由三大功能 使用 导入依赖 <!--zuul组件.zuul需要注册至eureka中--> <dependency> <groupId>org.springframework.cloud</groupId>

  • SpringCloud zuul 网关如何解决跨域问题

    跨域 在SpringCloud中 zuul 和springboot 要同时配置才能实现网关处理跨域 解决Access to XMLHttpRequest at 'http://192.168.2.173:8001/energy-base/groupType/getPageByType?timestamp=1557886425725' from origin 'http://localhost:3000' has been blocked by CORS policy: The 'Access-C

  • 解决springcloud Zuul丢失Cookie的问题

    springcloud 配置智能路由zuul 后 转发请求指定的方法后会导致 cookie 无法获取的问题,主要解决方法是 再application 配置文件中加入 sensitive-headers: zuul: routes: yyxt: path: /** serviceId: com.modou.dpt sensitive-headers: custom-sensitive-headers: true 我的是这样的,具体原理是zuul 中 sensitiveHeaders的默认值初始值是

  • SpringCloud如何实现Zuul集群(负载均衡)

    目录 前言: 一.使用 Nginx+Zuul 实现网关集群 1.创建Eurek注册中心.会员服务.订单服务 (略) 2. 创建Zuul服务 3. 下载Nginx服务器 二. 测试 三.补充 Nginx和网关的区别在什么地方? Nginx也可以实现网关,为什么不用Nginx实现网关呢? 关于Nginx负载均衡故障转移: 前言: 在微服务架构中,有一个组件可以说是必不可少的,那就是微服务网关,微服务网关处理了负载均衡,缓存,路由,访问控制,服务代理,监控,日志等.API网关在微服务架构中正是以微服务

  • SpringCloud Zuul实现负载均衡和熔断机制方式

    一.场景 笔者就Zuul网关下实现其负载均衡与熔断机制(雪崩)进行实践,前提是已经导入zuul相关依赖 springboot版本:1.5.9.RELEASE springcloud版本:Dalston.SR5 <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artif

  • SpringCloud Zuul基本使用方法汇总

    SpringCloud Zuul 是SpringCloud系列的网关实现,具有均衡负载,将非业务性校验剥离出来,使微服务专注于业务的一个组件 使用Zuul网关后,所有的请求都通过网络进行转发,所以所有的请求都隐藏了自己的主机及端口信息,而是统一使用Zuul网关的主机及端口号作为请求入口,Zuul网关在收到请求后,会根据serviceId自动发现目标微服务地址,然后将请求转发到目标微服务上进行处理. Zuul仍然是开箱即用工具系列,因此仍然适用4部曲套路: 1. 引入依赖: spring-clou

  • SpringCloud之Zuul网关原理及其配置讲解

    目录 一.Zuul网关的作用 二.Zuul网关的应用 1.网关访问方式 2.网关依赖注入 3.网关启动器 4.网关全局变量配置 5.Zuul网关配置总结 三.Zuul网关过滤器 3.1过滤器实现方式 3.2 过滤器的生命周期 四.Zuul网关的容错(与Hystrix的无缝结合) 4.1Zuul中的服务降级处理 4.2 代码示例 五.Zuul网关的限流保护 5.1 全局限流配置 5.2 局部限流配置 5.3 限流参数简介 六.Zuul网关性能调优:网关的两层超时调优 Zuul是spring clo

  • SpringCloud网关(Zuul)如何给多个微服务之间传递共享参数

    目录 1.使用场景 解决方案1 解决方案2 2.代码实现 3.成果展现 4.总结 1.使用场景 因为最近项目需要国际化,但是以前国际化的语言切换是放置在未进行微服务化之前的一个独立的SpringBoot服务之中. 目前由于业务的需要和不同模块能够复用的要求目前已经拆分为如下服务:zuul网关服务.**dx服务(包含主要服务).**ai(一些推荐的AI服务).message(消息咨询服务).forum(论坛版块服务)等等. 如果还是按照以前的的方式只切换 **dx服务 之中的语言:其他微服务是不知

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

    目录 网关的作用 Spring Cloud 网关组件Zuul介绍 Zuul网关实战 1.创建服务 2.创建配置文件 3.创建Zuul过滤器 4.编写启动类 5.启动验证 总结 网关的作用 微服务架构中,服务实例的地址可能经常会发生变化,所以我们不能直接将服务的地址暴露出来.如果每一个微服务都直接暴露接口,会导致一系列的问题,比如调用过于复杂,涉及到账户.权限不能统一处理等.另外基于高内聚低耦合的设计准则来讲,我们也应该将内部系统和外部系统做切割. 因此,这时就需要有一个独立的组件来处理外部的请求

  • SpringCloud超详细讲解微服务网关Gateway

    目录 前言 微服务网关GateWay介绍 GateWay特性介绍 Gateway 中的相关术语 Gateway实战 1.创建项目gateway 2.创建启动类 3.新增配置文件 4.编程方式实现路由 5.启动验证 总结 前言 上一篇:微服务网关Zuul 上文中,我们介绍了微服务网关Zuul,Zuul 是 Netflix 公司开源的产品,被称为第一代网关,也是 Spring Cloud 前几个版本默认使用的一款提供动态路由微服务网关组件,但是随着 Netflix 公司一系列的停更事件,在最新的 S

  • SpringCloud超详细讲解Feign声明式服务调用

    目录 入门案例 @FeignClient注解详解 Feign Client的配置 Feign请求添加headers 负载均衡 (Ribbon) 容错机制 Hystrix支持 Sentinel支持 Feign开启容错机制支持后的使用方式 请求压缩feign.compression 日志级别 入门案例 在服务消费者导入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>

  • SpringCloud超详细讲解负载均衡组件Ribbon源码

    目录 前言 项目实战 创建项目 启动项目验证 源码分析 选择服务 地址替换 总结 前言 上一篇文章中我们通过自己开发了一个负载均衡组件,实现了随机算法的负载均衡功能,如果要实现其他算法,还需要修改代码增加相应的功能.这一篇文章,我们将介绍一个更简单的负载均衡实现,使用**@LoadBalanced**注解实现负载均衡的功能. 项目实战 创建项目 同样的,我们的项目现在依然有一个registry注册中心,一个provider服务提供者,接下来,我们再次修改一下consumer服务消费者的代码: @

  • 超详细讲解SpringCloud Commons公共抽象的用法

    目录 Spring Cloud Commons公共抽象 @EnableDiscoveryClient 服务注册ServiceRegistry RestTemplate的负载均衡 RestTemplate的失败重试 本期主角——Spring Cloud Commons:公共抽象 Spring Cloud Commons公共抽象 Spring Cloud将服务发现.负载均衡和断路器等通用模型封装在一个公共抽象中,可以被所有的Spring Cloud客户端使用,不依赖于具体的实现(例如服务发现就有Eu

  • SpringCloud Nacos配置中心管理超详细讲解

    目录 一.Nacos配置管理 1.1 统一配置管理 1.1.1在nacos中添加配置文件 1.1.2 从微服务拉取配置 1.2 配置热更新 1.2.1 方式一 1.2.2 方式二 1.3 配置共享 一.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来用 1.1 统一配置管理 当微服务部署越来越多,达到数十,数百时,逐个修改微服务配置就会很麻烦,且容易出错.我们需要一种统一配置管理方案,可以集中管理所有实例的配置. Nacos一方面更可以将配置集中管理另一方面在配置变更时,及

  • SpringCloud Nacos作为配置中心超详细讲解

    目录 前言 Nacos配置模型 配置介绍 实际演练 前言 在单体架构的时候我们可以将配置写在配置文件中,但有⼀个缺点就是每次修改配置都需要重启服务才能生效. 当应用程序实例比较少的时候还可以维护.如果转向微服务架构有成百上千个实例,每修改⼀次配置要将全部实例重启,不仅增加了系统的不稳定性,也提高了维护的成本. 那么如何能够做到服务不重启就可以修改配置?所有就产生了四个基础诉求: 需要支持动态修改配置 需要动态变更有多实时 变更快了之后如何管控控制变更风险,如灰度.回滚等 敏感配置如何做安全配置

  • SpringCloud Feign超详细讲解

    目录 一.什么是Feign 二.Feign能干什么 三.Feign的使用步骤 1.新建一个module 2.配置Pom.xml 3.配置applicatin.yaml 4.配置configBean 5.配置Controller类 6.配置启动类 7.改动API 1)引入Feign依赖 2)配置Service 3)注意 四.结果 一.什么是Feign Feign是声明式Web Service客户端,它让微服务之间的调用变得更简单,类似controller调用service.SpringCloud集

  • 超详细讲解Linux DHCP服务

    目录 一.DHCP服务(动态主机配置协议) 1.背景 2.概述 3.优点 4.DHCP报文类型 5.DHCP 的分配方式 二.安装 DHCP 服务器 1.DHCP 服务软件 2.主配置文件 三.配置步骤 1.使用 DHCP 动态的给 PC 机分配 IP 地址 ① eNSP ②虚拟机 ③验证 ④进入命令行"ipconfig"测试 一.DHCP服务(动态主机配置协议) 1.背景 1.手动设置工作量大且容易冲突 2.用DHCP可以减少工作量和避免地址冲突 2.概述 作用:为局域网内的电脑分配

  • SpringCloud OpenFeign超详细讲解模板化远程通信的实现

    目录 1. openFeign实现 1.1 pom依赖 1.2 yaml配置 1.3 客户端调用代码 1.4.服务端暴露接口 1.5.测试日志 1. openFeign实现 基于spring-boot-starter-parent 2.6.8,spring-cloud-dependencies 2021.0.3,一个order服务一个user服务 1.1 pom依赖 <!--nacos服务注册与发现--> <dependency> <groupId>com.alibab

随机推荐