大家好,又见面了,我是你们的朋友全栈君。
Zuul与Spring Cloud Gateway作用差不多,推荐还是使用Spring Cloud Gateway
,毕竟是Spring家族的,优先级高一些。他们都和Nginx一样,主要是用于服务器的反向代理;只要是反向代理,那么久可以提供路由、监控、弹性、安全等功能;一般也是说是网关,因为数据的入口都从这么流入流出。
Zuul 的核心是过滤器,通过这些过滤器我们可以扩展出很多功能,比如:
添加依赖配置,修改pom.xml文件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
添加配置信息,修改文件application.properties
spring.application.name=zuul-demo
server.port=2103
zuul.routes.test.path=/test/* zuul.routes.test.url=http://192.168.1.244:8081
激活zuul,添加启动注解@EnableZuulProxy
@EnableZuulProxy
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
测试,应用主机rest服务接口
测试代理网关
集成 Eureka,使用注册服务名称转发
修改文件application.properties
spring.application.name=zuul-demo
server.port=2103
#zuul.routes.test.path=/test/* #zuul.routes.test.url=http://192.168.1.244:8081 eureka.client.serviceUrl.defaultZone=http://192.168.1.244:8761/eureka/
启动Eureka
测试网关
默认的转发规则就是API 网关地址+访问的服务名称+接口 URI
默认规则举例:
eg. 上述我们访问的测试地址:http://localhost:2103/eureka-provider-app/hello
zuul.routes.test.path=/test/* zuul.routes.test.url=http://192.168.1.244:8081
我们将服务/test开头的接口都转发到http://192.168.1.244:8081上
zuul.prefix=v1.0
基于Servlet实现过滤器,实现参考类com.netflix.zuul.http.ZuulServlet
,方法service
,流程如下图所示
对应代码
try {
preRoute();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
route();
} catch (ZuulException e) {
error(e);
postRoute();
return;
}
try {
postRoute();
} catch (ZuulException e) {
error(e);
return;
}
举例说明一下,定义一个token过滤器(随便找了一个实现类,如DebugFilter,仿写即可)
public class TokenFilter extends ZuulFilter {
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
String token = request.getHeader("H-TOKEN-X");
if (StringUtils.isBlank(token) || token.length() < 10) {
currentContext.setSendZuulResponse(false);
currentContext.getResponse().setContentType("application/json; charset=utf-8");
currentContext.setResponseBody("invalide token.");
}
return null;
}
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 1;
}
}
将对象注入到spring容器中
@Configuration
public class FilterConfig {
@Bean
public TokenFilter tokenFilter() {
return new TokenFilter();
}
}
测试,Token成功案例
测试,Token失败案例
说明error类型,可以对异常进行处理,但是最终会跳转到/error uri
实际开发中参考例子开发即可,更升入理解可以研究类FilterProcessor
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170624.html原文链接:https://javaforall.cn