欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringCloud学习笔记(6):使用Zuul构建服务网关

程序员文章站 2022-07-01 23:30:52
简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强。服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可。相对于内部服务而言,能够防止其被外部客户端直接访问而暴露服务的敏感信息,起到了保护作用。除此之外, ......

简介

zuul是netflix提供的一个开源的api网关服务器,springcloud对zuul进行了整合和增强。服务网关zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可。相对于内部服务而言,能够防止其被外部客户端直接访问而暴露服务的敏感信息,起到了保护作用。除此之外,zuul还可以实现身份认证、数据监控、动态路由等功能。

项目介绍

  1. sc-parent,父模块(请参照springcloud学习笔记(1):eureka注册中心)
  2. sc-eureka,注册中心(请参照springcloud学习笔记(1):eureka注册中心)
  3. sc-provider,提供者(请参照springcloud学习笔记(1):eureka注册中心)
  4. sc-gateway,服务网关

使用zuul构建服务网关

1.在父模块下创建子模块项目sc-gateway,pom.xml:

<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelversion>4.0.0</modelversion>
  <parent>
    <groupid>com.cf</groupid>
    <artifactid>sc-parent</artifactid>
    <version>0.0.1-snapshot</version>
  </parent>
  <artifactid>sc-gateway</artifactid>
  
  <dependencies>
    <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>
  </dependencies>
</project>

2.创建启动类gateway.gatewayapplication:

package gateway;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
import org.springframework.cloud.netflix.zuul.enablezuulproxy;

@springbootapplication
@enablezuulproxy
public class gatewayapplication {
    public static void main(string[] args) {
        springapplication.run(gatewayapplication.class, args);
    }
}

@enablezuulproxyh和@enablezuulserver:

  1. @enablezuulproxy是@enablezuulserver的超集,@enablezuulproxy包含@enablezuulserver导入的所有过滤器。

  2. @enablezuulproxy使用反向代理,@enablezuulserver不使用任何代理。

3.创建application.yml:

server:
  port: 8088

spring:
  application:
    name: sc-gateway
    
eureka:
  client:
    serviceurl:
      defaultzone: http://localhost:8080/eureka/  

zuul:
  routes:
    sc-provider: /sp/** #将serviceid为sc-provider的服务映射到/sp/**路径

4.测试

依次启动注册中心sc-eureka、提供者sc-provider、网关sc-gateway,以下是通过zuul访问提供者和直接访问提供者的结果:
SpringCloud学习笔记(6):使用Zuul构建服务网关

其他常用配置

1.忽略指定服务

zuul:
  ignored-services: serviceid1,serviceid2 #忽略服务serviceid1,serviceid2

2.忽略所有服务,只代理指定的服务

zuul:
  ignored-services: '*' #*为忽略所有服务,只代理sc-provider服务
  routes:
    sc-provider: /sp/** 

3.指定访问路径前缀,设置之后只能通过带前缀访问

zuul:
  prefix: /yc 
  routes:
    sc-provider: /sp/** 

4.指定服务的url

zuul:
  routes:
    sc-provider:
      path: /sp/**
      url: http://localhost:8081 #指定服务sc-provider的url,不从eureka注册中心获取。

这种配置方式不会作为hystrixcommand执行,也不会使用ribbon来平衡多个url的负载。要实现这些目标,可以使用静态服务器列表(listofservers)或者指定serviceid。

5.指定敏感header,防止敏感header外泄

zuul:
  routes:
    sc-provider:
      path: /sp/**
      sensitiveheaders: cookie,set-cookie,authorization #将会覆盖全局zuul.sensitiveheaders的值
      url: http://localhost:8081

如果要设置全局的敏感header可以设置zuul.sensitiveheaders的值。cookie,set-cookie,authorization为sensitiveheaders的默认值,如果不想设置敏感header,可以把sensitiveheaders设置成空列表:

zuul:
  routes:
    sc-provider:
      path: /sp/**
      sensitiveheaders: 
      url: http://localhost:8081

6.忽略header

zuul:
  ignoredheaders: header1, header2 #header1和header2将不会传播到其他的微服务中

zuul的路由端点

当@enablezuulproxy和spring boot actuator配合使用时,zuul会暴露一个路由管理端点/routes,通过这个路由端点可以查看到zuul当前映射的路由列表信息。

1.修改sc-gateway的pom.xml,新增spring boot actuator依赖:

    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-actuator</artifactid>
    </dependency>

2.修改sc-gateway的application.yml,开启/routes端点的访问:

management:
  endpoints:
    web:
      exposure:
        include: 'routes'

3.访问/routes端点

依次启动注册中心sc-eureka、提供者sc-provider、网关sc-gateway,然后访问http://localhost:8088/actuator/routes/details,显示路由列表信息如下:

SpringCloud学习笔记(6):使用Zuul构建服务网关

zuul过滤器

zuul的核心是一系列过滤器,它们能够在http请求和响应路由期间执行一系列操作。zuul提供了一个框架来动态读取、编译和运行这些过滤器,过滤器之间不直接通信,它们通过对每个请求惟一的requestcontext共享数据。

1.zuul过滤器类型

  • pre filters:在请求路由到具体的服务之前执行。
  • routing filters:用于将请求路由到微服务。
  • post filters:在请求路由到微服务之后执行。
  • error filters:在其他阶段发生错误时执行。

2.zuul过滤器特性

  • type:zuul过滤器的类型,决定过滤器在请求的哪个阶段起作用。
  • execution order:规定过滤器的执行顺序,值越小,越先执行。
  • criteria:filter执行所需的条件。
  • action:如果满足条件,则执行的操作。

3.zuul请求生命周期图

SpringCloud学习笔记(6):使用Zuul构建服务网关

4.自定义zuul过滤器

新建类gateway.filter.myzuulfilter:

package gateway.filter;
import javax.servlet.http.httpservletrequest;
import com.netflix.zuul.zuulfilter;
import com.netflix.zuul.context.requestcontext;
import com.netflix.zuul.exception.zuulexception;

public class myzuulfilter extends zuulfilter{
    
    /**
     * 具体执行逻辑
     */
    @override
    public object run() throws zuulexception {
        requestcontext ctx = requestcontext.getcurrentcontext();
        httpservletrequest request = ctx.getrequest();
        if (request.getparameter("name") != null) {
            system.out.println("你好," + request.getparameter("name"));
        }
        return null;
    }

    /**
     * 判断你该过滤器是否要执行
     */
    @override
    public boolean shouldfilter() {
        return true;
    }

    /**
     * 过滤器执行顺序
     */
    @override
    public int filterorder() {
        return 1;
    }

    /**
     * 过滤器类型
     */
    @override
    public string filtertype() {
        return "pre";
    }
}

启动类gatewayapplication中添加配置:

    @bean
    public myzuulfilter myzuulfilter(){
        return new myzuulfilter();
    }

依次启动注册中心sc-eureka、提供者sc-provider、网关sc-gateway,然后访问http://localhost:8088/sp/book/list?name=小明,myzuulfilter过滤器将会执行,控制台输出:你好,小明。