当前位置: 移动技术网 > IT编程>开发语言>Java > SpringCloud学习笔记(6):使用Zuul构建服务网关

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

2019年09月19日  | 移动技术网IT编程  | 我要评论

吴秀波胡子被剪,生命禅院论坛,成都东站火车时刻表

简介

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访问提供者和直接访问提供者的结果:

其他常用配置

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://www.lhsxpumps.com/_localhost:8088/actuator/routes/details,显示路由列表信息如下:

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请求生命周期图

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过滤器将会执行,控制台输出:你好,小明。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网