SpringCloud学习笔记(6):使用Zuul构建服务网关
简介
zuul是netflix提供的一个开源的api网关服务器,springcloud对zuul进行了整合和增强。服务网关zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可。相对于内部服务而言,能够防止其被外部客户端直接访问而暴露服务的敏感信息,起到了保护作用。除此之外,zuul还可以实现身份认证、数据监控、动态路由等功能。
项目介绍
- sc-parent,父模块(请参照springcloud学习笔记(1):eureka注册中心)
- sc-eureka,注册中心(请参照springcloud学习笔记(1):eureka注册中心)
- sc-provider,提供者(请参照springcloud学习笔记(1):eureka注册中心)
- 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:
@enablezuulproxy是@enablezuulserver的超集,@enablezuulproxy包含@enablezuulserver导入的所有过滤器。
@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://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过滤器将会执行,控制台输出:你好,小明。
上一篇: python3 基础语法(二)
下一篇: netty入门(一)