spring cloud学习笔记五 网关服务zuul
网关服务是指,客户端发送的请求不用直接访问特定的微服务接口,而且是经过网关服务的接口进行交互,网关服务再去到特定的微服务中进行调用。
网关服务的路由功能和Nginx的反向代理一样,所有的服务都先会来访问特定的服务器,然后通过这个服务器再去转发到指定的服务,这样对外界来说访问的是一个映射地址,真实的接口地址是不会暴露外界。
路由功能能够很好的帮助我们现在集群的流量,比如弃用超出限定值的请求和对请求量大的集群扩容。
除了路由功能,网关服务还为我们提供了过滤器功能,通过过滤器我们就可以鉴权验证。
一、spring cloud zuul路由配置
1.导入maven
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zuul</artifactId> <version>1.3.5.RELEASE</version> </dependency>
2.在启动类上加上注解:@EnableZuulProxy ,表示这是一个网关服务
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication //这是一个网关服务 @EnableZuulProxy public class ZuulDemoApplication { public static void main(String[] args) { SpringApplication.run(ZuulDemoApplication.class, args); } }
3.配置application.properties文件,zuul中路由功能主要是通过配置application文件来操作,所以这个demo选用了properties文件格式,这是因为properties文件格式理解起来更容易一些。
spring.application.name=zuulDemo
server.port=8000
#这里的配置表示,访问/user直接重定向到eureka中的zuulFictitious这个serviceId,其中user是自定义的字段,但是这个字段必须唯一
zuul.routes.user.path=/user/**
zuul.routes.user.serviceId=zuulFictitious
二、spring cloud zuul过滤器
1.spring cloud zuul过滤器是创建一个实现类继承ZuulFilter这个类,这个类中有4个方法需要我们去实现:
import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import javax.servlet.http.HttpServletRequest; public class ZuulDemoFilter extends ZuulFilter { //设置过滤器的类型,一共有4种 //pre:可以在请求被路由之前调用 //route:在路由请求时候被调用 //post:在route和error过滤器之后被调用 //error:处理请求时发生错误时被调用 @Override public String filterType() { return "pre"; } //设置滤器执行的顺序,依靠数值从小到大开始执行,0是最先执行的 @Override public int filterOrder() { return 0; } //是否执行过滤器,true表示可以执行,这个可以通过代码逻辑来关闭过滤器 @Override public boolean shouldFilter() { return true; } //过滤器的具体执行逻辑,如权限验证 @Override public Object run() { return null; } }
2.配置完成后,还需要将过滤器在主启动类中注入
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication //这是一个网关服务 @EnableZuulProxy public class ZuulDemoApplication { public static void main(String[] args) { SpringApplication.run(ZuulDemoApplication.class, args); } @Bean public ZuulDemoFilter zuulDemoFilter (){ return new ZuulDemoFilter (); } }