标签:网关 zuul service Spring Filter context import Zuul public
更多Spring与微服务相关的教程请戳这里 Spring与微服务教程合集
1、概述
1.1、什么是Zuul?
zuul是从设备和网站到后端应用程序所有请求的前门,为内部服务提供可配置的对外URL到服务的映射关系,基于JVM的后端路由器,其具备以下功能:
- 认证与鉴权
- 压力控制
- 金丝雀测试
- 动态路由
- 负载削减
- 静态响应处理
- 主动流量管理
底层基于servlet,本质组件是一系列Filter所构成的责任链,zuul的逻辑引擎和Filter可以用其它基于JVM的语言编写,比如Groovy
2、入门案例
2.1、准备工作
首先我们准备好服务service-a和eureka server
假设service-a服务的地址为http://localhost:8010,上下文为/service-a,并且暴露一个接口,其路径为/common/port
2.2、搭建zuul工程
2.2.1、pom.xml
<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>
2.2.2、application.yml
代表所有以/service-a开头的请求会被转发到service-a服务上
server:
port: 8040
servlet:
context-path: /zuul-server
spring:
application:
name: zuul-server
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:8000/eureka/
register-with-eureka: true
zuul:
routes:
service-a:
path: /service-a/**
serviceId: service-a
2.2.3、启动类
@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
public class ZuulServerApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulServerApplication.class, args);
}
}
2.3、访问测试
接下来,我们通过访问网关,将请求转发到service-a服务上
访问地址为:http://localhost:8040/zuul-server/service-a/service-a/common/port
- 红色部分是zuul的地址
- 蓝色部分是在application.yml中配置的zuul.routes.service-a.path的值,因此正好匹配上了,所以该请求会被转发到service-a服务
- 绿色部分就是service-a服务暴露出来的接口的路径
访问结果如果,可以看到网关将请求成功转发到service-a服务了
3、Zuul Filter
zuul核心逻辑是由一系列的Filter完成的。Filter之间不直接通信,而是在请求线程中通过RequestContext来共享状态,它的内部通过ThreadLocal实现。
Filter类型:
- pre
- route
- post
- error
在ZuulServlet类中定义了四种类型的Filter的执行时机,如下图所示。
可以通过继承ZuulFilter自定义FIlter,如下代码所示。
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class AuthFilter extends ZuulFilter {
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
System.out.println("this is auth filter!");
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
if(null != request.getParameter("token")){
System.out.println("存在token,token="+request.getParameter("token"));
context.set("success","true");
}else{
// 禁止访问
context.setSendZuulResponse(false);
context.set("success","false");
}
return null;
}
}
也可以通过Groovy语言来编写Zuul的filter,其优点是可以在不重启服务的情况下动态生效。
标签:网关,zuul,service,Spring,Filter,context,import,Zuul,public 来源: https://blog.51cto.com/u_14643435/2845383
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。