博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringCloud学习笔记(6):使用Zuul构建服务网关
阅读量:4611 次
发布时间:2019-06-09

本文共 4844 字,大约阅读时间需要 16 分钟。

简介

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

项目介绍

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

使用Zuul构建服务网关

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

4.0.0
com.cf
sc-parent
0.0.1-SNAPSHOT
sc-gateway
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-netflix-zuul

2.创建启动类gateway.GatewayApplication:

package gateway;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.zuul.EnableZuulProxy;@SpringBootApplication@EnableZuulProxypublic 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: 8088spring:  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访问提供者和直接访问提供者的结果:

945558-20190919181038731-869391677.jpg

其他常用配置

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依赖:

org.springframework.boot
spring-boot-starter-actuator

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,显示路由列表信息如下:

945558-20190919181053934-125212178.jpg

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

945558-20190919181947025-820309017.jpg

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

转载于:https://www.cnblogs.com/seve/p/11551546.html

你可能感兴趣的文章
Git强制推送命令
查看>>
HCL实验一
查看>>
数据结构之数组实现栈
查看>>
硬件——nrf51822第三篇,按键控制小灯
查看>>
拜师鸟哥之linux学习体会(7)——linux磁盘与文件系统管理
查看>>
编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第4章编程练习4
查看>>
鸡兔同笼问题
查看>>
JavaScript总结
查看>>
钢笔工具路径描边技巧 课时1:8选区路径之间的转换
查看>>
程序员的十层楼
查看>>
PAT 1059. C语言竞赛
查看>>
LeetCode 561. Array Partition I
查看>>
jquery工作原理解析
查看>>
Spring官网改版后下载
查看>>
unity 中的协程
查看>>
简单ajax分页 jQuery实现动态创建Dom
查看>>
Data truncation: Data too long for column 'gender' at row 1 出现的原因
查看>>
Leetcode problems classified by company 题目按公司分类(Last updated: October 2, 2017)
查看>>
CNN结构的历史进程
查看>>
最大流相关
查看>>