java微服务之springcloud快速入门day02zuul网关,面向服务的路由,zuul过滤器(代码片段)

蓝盒子bluebox 蓝盒子bluebox     2022-12-08     691

关键词:

Java 微服务之 SpringCloud快速入门day02 (三)Zuul网关

一、简介

1、相关概念

官网:https://github.com/Netflix/zuul

在这里插入图片描述
Zuul:维基百科:
电影《捉鬼敢死队》中的怪兽,Zuul,在纽约引发了巨大强乱。
事实上,在微服务架构中,Zuul就是守门的大Boss!一夫当关,万夫莫开!

Zuul是 Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用。Zuul的核心是一系列的过滤器,这些过滤器可以完成以下功能。

  • 身份认证与安全:识别每个资源的验证要求,并拒绝那些与要求不符的请求。
  • 审查与监控:在边缘位置追踪有意义的数据和统计结果,从而带来精确的生产视图。
  • 动态路由:动态地将请求路由到不同的后端集群。
  • 压力测试:逐渐增加指向集群的流量,以了解性能。
  • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
  • 静态响应处理:在边缘位置直接建立部分响应,从而避免其转发到内部集群。

Spring Cloud对Zuul进行了整合与增强。

目前,Zuul使用的默认HTTP客户端是ApacheHTTP Client,

也可以使用RestClient或者okhttp3.OkHttpClient。

如果想要使用RestClient,可以设置ribbon.restclient.enabled=true;想要使用okhttp3.0kHttpClient,
可以设置rib-bon.okhttp.enabled=true.

网管的核心功能是:过滤和路由

2、Zuul加入后的架构

在这里插入图片描述
不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。

一切对服务的请求都会经过Zuul这个网关,然后再由网关来实现鉴权、动态路由等等操作。

Zuul就是我们服务的统一入口。

二、Zuul快速入门

1、新建工程

填写基本信息:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、引入依赖

在这里插入图片描述

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            <version>2.0.1.RELEASE</version>

        </dependency>

</dependencies>

3、创建启动类

在这里插入图片描述
在这里插入图片描述

package com.itzheng;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@EnableZuulProxy
@SpringBootApplication
public class GatewayApplication 
    public static void main(String[] args) 
        SpringApplication.run(GatewayApplication.class);
    


4、编写配置文件

在这里插入图片描述
在这里插入图片描述

server:
  port: 10010
zuul:
  routes:
    hehe:
      path: /user-service/**  #设置凡是路径以这个开头路径都配置到8082
      url: http://127.0.0.1:8082

5、启动测试项目

在这里插入图片描述
访问项目http://localhost:10010/user-service/user/9
在这里插入图片描述

6、引入eureka依赖

在这里插入图片描述

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

在application.yml当中配置eureka并完善zuul的请求路径
在这里插入图片描述

server:
  port: 10010
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
zuul:
  routes:
    haha:
      path: /user-service/**  #设置凡是路径以这个开头路径都配置到8082
      serviceId: user-service

7、重新启动运行

在这里插入图片描述

8、优化application.yml配置文件

server:
  port: 10010
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
zuul:
  routes:
    user-service: /user-service/**  #设置凡是路径以这个开头路径都配置到8082   键是user-service 值是/user-service/**

凡是访问/user-service/**这个路径的都会访问user-service这个服务
重新运行并访问
在这里插入图片描述
在这里插入图片描述

9、查看Zuul是否可以代理consumer在不配置的情况下直接访问对应的路径:可以直接访问成功( demo):Zuul默认为所有的微服务都配置了对应的映射

在这里插入图片描述

spring:
  application:
    name: gateway
zuul:
  routes:
    user-service: /user/**
  ignored-services:
    - consumer-service

重新运行并访问
在这里插入图片描述
http://localhost:10010/user/user/9

在这里插入图片描述

http://localhost:10010/consumer/consumer/9

在这里插入图片描述

10、设置路由前缀

(1)继续完善application.yml

在这里插入图片描述

zuul:
  routes:
    user-service:
      path: /user/**
      serviceId: user-service
      strip-prefix: false
(2)重新运行并访问

在这里插入图片描述
http://localhost:10010/user/9
在这里插入图片描述

(3)继续简化上述文件

在这里插入图片描述

server:
  port: 10010
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
spring:
  application:
    name: gateway
zuul:
  routes:
    user-service: /user/**
  ignored-services:
    - consumer-service
  strip-prefix: false

三、Zuul过滤器

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

1、ZuulFilter

ZuulFilter是过滤器的顶级父类。在这里我们看一下其中定义的4个最重要的方法:

public abstract ZuulFilter implements IZuulFilter
	
	abstract public String filterType();//过滤器类型
	
	abstract public int filterOrder();//过滤器顺序(值越大优先级越低,值越小优先级越高)

	boolean shouldFilter();//来自IZuulFilter,要不要过滤

	Object run() throws ZuulException;//IZuulFilter


  • shouldFilter:返回一个Boolean值,判断i该过滤器是否需要执行。返回true执行,返回false不执行。

  • run过滤器的具体业务逻辑。

  • filterlype:返回字符串,代表过滤器的类型。包含以下4种:

  • pre:请求在被路由之前执行

  • routing :在路由请求时调用

  • post:在routing和errror过滤器之后调用

  • error:处理请求时发生错误调用

  • filterOrder:通过返回的int值来定义过滤器的执行顺序,数字越小优先级越高。

2、过滤器执行生命周期:

这张是Zuul官网提供的请求生命周期图,清晰的表现了一次请求在各个过滤器的执行顺序。

在这里插入图片描述

  • 正常流程:
    。请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,
    执行请求,返回结果后,会到达post过滤器。而后返回响应。
  • 异常流程
    。整个过程中,pre或者routingi过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求
    交给POST过滤器,最后返回给用户。

。如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。

。如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,请求不会再到达POST
过滤器了。

所有内置过滤器列表
在这里插入图片描述

使用场景

场景非常多:

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

3、自定义过滤器

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

(1)定义过滤器类

引入依赖
在这里插入图片描述

		<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

在这里插入图片描述
在这里插入图片描述

package com.itzheng.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;

@Component  //添加该注解以后当前类会自动添加到Spring当中
public class LoginFilter extends ZuulFilter 
    //过滤类型
    @Override
    public String filterType() 
        return FilterConstants.PRE_TYPE;//前置过滤器
    
    //过滤级别
    @Override
    public int filterOrder() 
        return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
    
    //是否要过滤
    @Override
    public boolean shouldFilter() 
        return true;
    

    @Override
    public Object run() throws ZuulException 
        //获取请求上下文
        RequestContext ctx = RequestContext.getCurrentContext();
        //获取request
        HttpServletRequest request = ctx.getRequest();
        //判断请求参数access-token
        String token = request.getParameter("access-token");
        //判断是否存在
        if(StringUtils.isBlank(token))
            //不存在,未登录,则拦截
            ctx.setSendZuulResponse(false);//拦截
            //返回状态码403
            ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        
        return null;
    


(2)完善application.yml

在这里插入图片描述

server:
  port: 10010
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
spring:
  application:
    name: gateway
zuul:
  prefix: /api
  routes:
    user-service:
      path: /user/**
      serviceId: user-service
      strip-prefix: false
  ignored-services:
    - comsumer-service


(3)运行并测试

在这里插入图片描述
访问
http://localhost:10010/api/user/9
在这里插入图片描述
访问:http://localhost:10010/api/user/9?access-token=1
在这里插入图片描述

4、负载均衡和熔断

Zuul中默认就已经集成了Ribbon负载均衡和Hystix熔断机制。
但是所有的超时策略都是走的默认值,比如熔断超时时间只有1S,很容易就触发了。
因此建议我们手动进行配置;
在这里插入图片描述

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
ribbon:
  ConnectionTimeout: 500
  ReadTimeout: 2000
  MaxAutoRetriesNextServer: 0 #不重试

ribbon的超时时长,真实值是(read + connect)* 2,必须小于hystrix时长。

计算公式:

1、ribbonTimeout = (ribbonReadTimeout + ribbonConnectTimeout) * (maxAutoRetries + 1) *( maxAutoRetriesNextServer + 1 );

重新运行并测试
在这里插入图片描述
访问http://localhost:10010/api/user/9?access-token=1

在这里插入图片描述

5、Zuul的高可用性

启动多个Zwul服务,自动注册到Eureka,形成集群。如果是服务内部访问,你访问Zuul,自动负载均衡,没问题,但是,Zuul更多是外部访问,PC端、移动端等。他们无法通过Eureka进行负载均衡,那么该怎么办?
此时,我们会使用其它的服务网关,来对Zuul进行代理。比如: Nginx

Eureka、Ribbon、Hystix、Feign、Zuul

spring-cloud-config:统一配置中心,自动去Git拉取最新的配置,缓存。使用Git的Webhook钩子,去通知配置中心,说配置发生了变化,配置中心会通过消息总线去通知所有的微服务,更新配置。

在这里插入图片描述

spring-cloud-bus:消息总线

Spring-cloud-stream:消息通信

spring-cloud-hystrix-dashboard:容错统计,形成图形化界面

spring-cloud-sleuth:链路追踪结合Zipkin

java微服务之springcloud快速入门day01初始springcloud(代码片段)

一、SpringCloud的简介微服务是一种架构方式,最终肯定需要技术架构去实施。微服务的实现方式很多,但是最火的莫过于SpringCloud了。为什么?后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。... 查看详情

java微服务之springcloud快速入门day01eureka注册中心快速入门(代码片段)

一、Eureka注册中心简介1、认识Eureka首先我们来解决第一问题,服务的管理。问题分析在刚才的案例中,user-service对外提供服务,需要对外暴露自己的地址。而consumer(调用者)需要记录服务提供者的地址。将来地址出现... 查看详情

java微服务之springcloud快速入门day02zuul网关,面向服务的路由,zuul过滤器(代码片段)

Java微服务之SpringCloud快速入门day02(三)Zuul网关一、简介1、相关概念官网:https://github.com/Netflix/zuulZuul:维基百科:电影《捉鬼敢死队》中的怪兽,Zuul,在纽约引发了巨大强乱。事实上,在微服务架构中࿰... 查看详情

java微服务之springcloud快速入门day02zuul网关,面向服务的路由,zuul过滤器(代码片段)

Java微服务之SpringCloud快速入门day02(三)Zuul网关一、简介1、相关概念官网:https://github.com/Netflix/zuulZuul:维基百科:电影《捉鬼敢死队》中的怪兽,Zuul,在纽约引发了巨大强乱。事实上,在微服务架构中࿰... 查看详情

java微服务之springcloud快速入门day02hystrix线程隔离,服务降级(代码片段)

Hystrix1、简介Hystrix,英文意思是豪猪,全身都是刺,看起来就不好惹,是一种保护机制。Hystrix也是Netflix公司的一款组件。主页:https://github.com/Netflix/Hystrix那么Hystrix的作用是什么呢?具体要保护什么呢ÿ... 查看详情

java微服务之springcloud快速入门day02hystrix线程隔离,服务降级(代码片段)

Hystrix1、简介Hystrix,英文意思是豪猪,全身都是刺,看起来就不好惹,是一种保护机制。Hystrix也是Netflix公司的一款组件。主页:https://github.com/Netflix/Hystrix那么Hystrix的作用是什么呢?具体要保护什么呢ÿ... 查看详情

java微服务之springcloud快速入门day01系统架构的演变,服务调用方式(代码片段)

一、系统架构的演变1、集中式架构当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键。存在的问题&... 查看详情

java微服务之springcloud快速入门day01eureka注册中心高级部分(集群)(高可用)(代码片段)

接下来我们详细讲解Eureka的原理及配置。1、基础框架Eureka架构中的三个核心角色:服务注册中心Eureka的服务端应用,提供服务注册和发现功能,就是刚刚我们建立的eureka-server服务提供者提供服务的应用,可以是SpringBoo... 查看详情

java微服务之springcloud快速入门day01eureka注册中心高级部分(集群)(高可用)(代码片段)

接下来我们详细讲解Eureka的原理及配置。1、基础框架Eureka架构中的三个核心角色:服务注册中心Eureka的服务端应用,提供服务注册和发现功能,就是刚刚我们建立的eureka-server服务提供者提供服务的应用,可以是SpringBoo... 查看详情

springcloud微服务开发快速入门(代码片段)

...变6.微服务开发框架7.微服务需要学习什么?小结二、SpringCloud1.SpringCloud介绍2.SpringBoot与SpringCloud的区别3.服务拆分和远程调用实现远程调用案例案例需求注册RestTemplate实现远程 查看详情

springcloud微服务开发快速入门(代码片段)

...变6.微服务开发框架7.微服务需要学习什么?小结二、SpringCloud1.SpringCloud介绍2.SpringBoot与SpringCloud的区别3.服务拆分和远程调用实现远程调用案例案例需求注册RestTemplate实现远程 查看详情

java之springcloud微服务搭建(第一个阶段)springboot项目实现商品服务器端是调用(代码片段)

Java之SpringCloud微服务入门到精通Spring微服务快速入门(Eureka)一、Springcloud微服务概述1、微服务中的相关概念(1)服务注册与发现(2)负载均衡(3)熔断(4)链路追踪(5)API网关2... 查看详情

springcloud系列教程汇总整理手册

...系列之集成Dubbo的方式    >>sourcedownload2、微服务之SpringCloud2.1服务治理实现SpringCloud系列使用NetflixEureka进行服务治理2.2声明式服务调用SpringCloud系列之声明式服务调用NetflixFeign2.3客户端负载均衡SpringCloud系列之客户端负载均... 查看详情

springcloud微服务快速教程之gateway服务网关

...,是异步非阻塞网关,ZUUL2也是异步非阻塞的,但未纳入springcloud整合计划  基于WebFlux ,与spring-boot-starter-web冲突,要排除该依赖;ZUUL1是阻塞io的APIGateway;  性能上,自然是异步非阻塞的gateway胜出,不过实际项目中,... 查看详情

springcloud之zuul网关入门

SpringCloud实现微服务的架构基本成型:  使用SpringCloudNetflix中的Eureka实现了服务注册中心以及服务注册与发现;而服务间通过Ribbon或Feign实现服务的消费以及均衡负载。  为了使得服务集群更为健壮,使用Hystrix的融断机制来... 查看详情

springcloud实战微服务之——微服务简介以及入门使用(代码片段)

微服务概述微服务是什么?微服务解决了什么问题?微服务有什么特点?单体架构是什么?一个归档包包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的架构风格,我们称之为单... 查看详情

springcloud从入门到进阶——使用springboot搭建微服务

内容  SpringBoot整合SpringCloud的Eureka、Zuul等组件,快速实现简单易懂且具有服务熔断、负载均衡的分布式架构1.0,体验微服务的魅力。版本  IDE:IDEA2017.2.2x64  JDK:1.8.0_171  manve:3.3.3  SpringBoot:1.5.9.RELEASE  SpringCloud... 查看详情

springcloud微服务之跨服务调用后端接口

SpringCloud微服务系列博客:SpringCloud微服务之快速搭建EurekaServer:https://blog.csdn.net/egg1996911/article/details/78787540SpringCloud微服务之注册服务至EurekaServer:https://blog.csdn.net/egg1996911/article/details/78859200Sp 查看详情