微服务架构整理-(十二springcloud实战之zuul网关)(代码片段)

浦江之猿 浦江之猿     2022-11-29     726

关键词:

SpringCloud实战之Zuul网关

Zuul概念

Zuul是Netflix旗下的又一重要成员,是一个基于 JVM 路由和服务端的网关和负载均衡器,是一个提供路由、监控、弹性、安全等方面的服务框架。其核心是过滤器,通过这些过滤器我们可以扩展出很多功能,例如:

  • 动态路由
    动态地将客户端的请求路由到后端不同的服务,做一些逻辑处理,比如聚合多个服务的数据返回。
  • 请求监控
    可以对整个系统的请求进行监控,记录详细的请求响应日志,可以实时统计出当前系统的访问量以及监控状态。
  • 认证鉴权
    对每一个访问的请求做认证,拒绝非法请求,保护好后端的服务,所有的请求通过Zuul进行认证鉴权,无需在每个微服务中进行。
  • 压力测试
    有些系统上线前,需要进行压力测试来验证系统的稳定性和可靠性,以便系统能更好的应对可种促销活动,尤其是现在的双11,双12等活动。当并发量达到一定量级时,这些请求能否有效的转发到对应的服务上,都可以在事先通过Zuu进行压力测试。
  • 灰度发布
    灰度发布可以保证系统的平稳过度,在初始灰度的时候就可以发现、调整问题,以降低新特性对整个系统的影响度。

Zuul构建网关

Zuul的网关功能非常强大,这里通过一个简单的例子,通过zuul网关路由到之前的微服务中。

创建Spring Boot 工程

springboot版本:2.2.6.RELEASE 。工程名:zuul。启动类为:ZuulApplication

添加依赖

需要添加2个依赖,分别为eureka,zuul.

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

添加注解

启动类上添加@EnableZuulProxy注解

@SpringBootApplication
//开启
@EnableZuulProxy
public class ZuulApplication 

	public static void main(String[] args) 
		SpringApplication.run(ZuulApplication.class, args);
	

添加配置文件

需要在配置文件中添加基础配置,eureka,路由规则等。

基础配置

配置端口号与服务名

server:
  port: 9008 #端口
spring:
  favicon:
    enabled: false
  application:
    name: service-zuul #服务名称

注册Eureka

由于serice-zuul也是一个微服务因此也需要注册到Eureka中

#配置eureka server
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #注册到两个eureka上
      defaultZone: http://localhost:9005/eureka/,http://localhost:9006/eureka/

添加路由规则

#配置路由规则
zuul:
  routes:
    api-monkey:
      path: /api-monkey/**
      serviceId: service-openfeign

以上配置,路由规则就是匹配所有符合/api-monkey/**的请求,只要路径中带有/api-monkey/都将被转发到service-openfeign服务上,至于service-openfeign服务的地址到底是什么则由eureka-server注册中心去分析,我们只需要写上服务名即可。

以当前搭建的项目为例,请求 http://localhost:9008/api-monkey/buy/1 接口则相当于请求 http://localhost:9007/buy/1 (service-openfeign服务的地址为 http://localhost:9007/buy/1), 路由规则中配置的api-monkey是路由的名字,可以任意定义,但是一组path和serviceId映射关系的路由名要相同。返回结果为:


    "id": 1,
    "name": "apple1",
    "price": 8000.00

说明API网关服务已经构建成功。

Zuul请求过滤

Zuul 就像一个安检站 ,所有请求都会经过这个安检站,安检站中需要对所有的请求按照一定的规则进行过滤。例如:请求验证,当验证通过了才可以进行转发。这里模拟一个带token的过滤,如果请求中没有token,则返回无效请求,反之进行跳转

定义过虑逻辑


@Component
//必须要继承ZuulFilter
public class OAuth2Filter extends ZuulFilter 

    @Override
    public Object run() throws ZuulException 
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String token = request.getParameter("token");
        if (token == null) 
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            ctx.addZuulResponseHeader("content-type", "text/html;charset=utf-8");
            ctx.setResponseBody("无效请求");
        
        return null;
    

    @Override
    public boolean shouldFilter() 
        return true;
    

    @Override
    public int filterOrder() 
        return 0;
    

    @Override
    public String filterType() 
        return "pre";
    


  • filterType方法的返回值为过滤器的类型,过滤器的类型决定了过滤器在哪个生命周期执行,pre 表示在路由之前执行过滤器,其他值还有 post 、error 、route和static,当然也可以自定义。
  • filterOrder方法表示过滤器的执行顺序,当过滤器很多时, 需要通过此方法的返回值来指定过滤器的执行顺序 。
  • shouldFilter方法用来判断过滤器是否执行,true表示执行,false 表示不执行。
  • run方法表示过滤的具体逻辑, 如果请求地址中携带了token参数的话,则认为是合法请求,否则为非法请求,如果是非法请求的话,首先设置ctx.setSendZuulResponse(false)表示不对该请求进行路由,然后设置响应码和响应值。这里只是个模拟,所以run方法的返回值目前暂时没有任何意义。

请求结果

  • http://localhost:9008/api-monkey/buy/1?token=123

    "id": 1,
    "name": "apple1",
    "price": 8000.00

  • http://localhost:9008/api-monkey/buy/1
    无效请求

Zuul路由规则

在上面的例子中,路由规则配的是:

#配置路由规则
zuul:
  routes:
    api-monkey:
      path: /api-monkey/**
      serviceId: service-openfeign

当访问地址符合/api-monkey/**规则的时候,会被自动定位到service-openfeign服务上。如果路由规则什么都不写,则zuul默认会路由到注册中心中的所有服务。格式为:域名/服务名/api地址
例如,本服务系统中可以向外提供服务的有service-openfeignservice-product,则对应的请求分别为:

  • http://localhost:9008/service-openfeign/buy/1?token=111
  • http://localhost:9008/service-product/product/1?token=111
    当然,也可以在配置文件中添加相应的路由规则
  • 忽略某个服务
zuul:
  ignored-services: service-product
  • 忽略某带某个关键字的api
zuul:
  ignored-patterns: /**/hello/**
  • 配置前缀
zuul:
  prefix:/v1

此时访问路径就变成:http://localhost:9008/v1/api-monkey/buy/1?token=123

  • 路由规则通配符
通配符含义举例备注
匹配任意单个字符/api-monkey/?可以匹配: /api-monkey/1
*匹配单路径任意数量字符/api-monkey/*可以匹配:/api-monkey/1,/api-monkey/22,/api-monkey/333 不可以匹配:/api-monkey/1/2/3
**匹配多路径任意单个字符/api-monkey/**可以匹配: /api-monkey/1,/api-monkey/1/22

总结

关于Zuul的基本知识点就介绍完了。最后,希望本文能帮助大家,祝大家在IT之路上少走弯路,一路绿灯不堵车,测试一性通过,bug秒解!
源码下载

高性能云服务器 精品线路独享带宽,毫秒延迟,年中盛惠 1 折起

微服务架构整理-(十二springcloud实战之zuul网关)(代码片段)

SpringCloud实战之Zuul网关Zuul概念Zuul构建网关创建SpringBoot工程添加依赖添加注解添加配置文件基础配置注册Eureka添加路由规则Zuul请求过滤定义过虑逻辑请求结果Zuul路由规则总结Zuul概念Zuul是Netflix旗下的又一重要成员,是一个... 查看详情

微服务架构整理-(十springcloud实战之hystrix[3])(代码片段)

SpringCloud实战之Hystrix[3]-看版监控前言搭建Dashboard服务创建springboot工程添加依赖配置启动类添加配置文件引用Dashboard服务添加Hystrix依赖添加springboot服务监控依赖配置springboot监控接口的访问权限结果总结前言当需要查看服务的状... 查看详情

微服务架构整理-(十springcloud实战之hystrix[3])(代码片段)

SpringCloud实战之Hystrix[3]-看版监控前言搭建Dashboard服务创建springboot工程添加依赖配置启动类添加配置文件引用Dashboard服务添加Hystrix依赖添加springboot服务监控依赖配置springboot监控接口的访问权限结果总结前言当需要查看服务的状... 查看详情

微服务架构整理-(六springcloud实战之ribbon)

SpringCloud实战之Ribbon负责均衡介绍Ribbon概念Ribbon中的负载均衡算法Ribbon使用添加一个服务提供者添加Ribbon区别服务提供者访问服务提供者运行结果总结负责均衡介绍负载均衡分为硬件负载均衡和软件负载均衡。常用见的如下:... 查看详情

微服务架构整理-(八springcloud实战之hystrix[1])(代码片段)

SpringCloud实战之Hystrix[1]-基本用法前言Hystrix概念Hystrix使用添加依赖配置启动类添加熔断机制服务降级超时异常总结前言我们知道,在微服务架构中,每个服务都是独立运行,服务与服务之间通过注册中心彼此发现和消... 查看详情

微服务架构整理-(八springcloud实战之hystrix[1])(代码片段)

SpringCloud实战之Hystrix[1]-基本用法前言Hystrix概念Hystrix使用添加依赖配置启动类添加熔断机制服务降级超时异常总结前言我们知道,在微服务架构中,每个服务都是独立运行,服务与服务之间通过注册中心彼此发现和消... 查看详情

微服务架构整理-(九springcloud实战之hystrix[2])

SpringCloud实战之Hystrix[2]-自定义异常熔断处理自定义熔断机制测试同步调用异步调用总结上文中,对异常处理是使用注解@HystrixCommand完成的,当然也可以不使用此注解来完成,我们可以自定义一个机制处理超时,... 查看详情

微服务架构整理-(六springcloud实战之ribbon)(代码片段)

SpringCloud实战之Ribbon负责均衡介绍Ribbon概念Ribbon中的负载均衡算法Ribbon使用添加一个服务提供者添加Ribbon区别服务提供者访问服务提供者运行结果总结负责均衡介绍负载均衡分为硬件负载均衡和软件负载均衡。常用见的如下:... 查看详情

微服务架构整理-(九springcloud实战之hystrix[2])(代码片段)

SpringCloud实战之Hystrix[2]-自定义异常熔断处理自定义熔断机制测试同步调用异步调用总结上文中,对异常处理是使用注解@HystrixCommand完成的,当然也可以不使用此注解来完成,我们可以自定义一个机制处理超时,... 查看详情

微服务架构整理-(十springcloud实战之hystrix[3])(代码片段)

SpringCloud实战之Hystrix[3]-看版监控前言搭建Dashboard服务创建springboot工程添加依赖配置启动类添加配置文件引用Dashboard服务添加Hystrix依赖添加springboot服务监控依赖配置springboot监控接口的访问权限结果总结前言当需要查看服务的状... 查看详情

微服务架构整理-(十一springcloud实战之openfeign)(代码片段)

SpringCloud实战之OpenFeignOpenFeign介绍实现消费者功能创建SpringBoot工程添加依赖添加注解声明服务在Controller中调用服务添加配置文件结果实现负载均衡功能实现熔断功能配置熔断开关实现回调函数获取异常信息总结OpenFeign介绍OpenFeig... 查看详情

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

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

springcloud微服务安全实战_6-1_微服务之间的通讯安全之概述

   到目前为止已经实现了一个基于微服务的,前后端分离(这里我用的jquery做的,并不是真的前后端分离,因为我不会vue和angular所以没用)的架构。在网关上做了限流、认证、审计、授权等安全机制,在前端应用上... 查看详情

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

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

微服务之springcloud实战:springcloudeureka服务治理

服务治理  SpringCloudEureka是SpringCloudNetflix微服务套件的一部分,它基于NetflixEureka做了二次封装,主要完成微服务的服务治理功能,SpringCloud通过为Eureka增加了SpringBoot自动化配置,只需要简单的依赖和配置就可完成Eureka整合搭建... 查看详情

微服务springcloud+docker入门到高级实战

第一章课程介绍和学习路线1、微服务架构SpringCloud课程介绍简介:课程介绍和课程大纲讲解,讲课风格和重点内容理解技巧2、技术选型和学后水平简介:课程所需基础和技术选型讲解,学完课程可以到达怎样的程度,第二章架... 查看详情

微服务springcloud+docker入门到高级实战(目录)

 第一章课程介绍和学习路线1、微服务架构SpringCloud课程介绍 简介:课程介绍和课程大纲讲解,讲课风格和重点内容理解技巧2、技术选型和学后水平 简介:课程所需基础和技术选型讲解,学完课程可以到达怎样的程度,第二... 查看详情

推荐7个牛哄哄springcloud实战项目(代码片段)

把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,这就是微服务架构的架构概念,通过将功能分解到各个离散的服务中以实现对解决方案的解耦。关于微服务相关的学习资料不多,而GitHub上的开源项目可以... 查看详情