共计 4173 个字符,预计需要花费 11 分钟才能阅读完成。
前言
本文采用 Spring cloud 本文为 2.1.8RELEASE,version=Greenwich.SR3
本文基于前两篇文章 eureka-server、eureka-client、eureka-ribbon 和 eureka-feign 的实现。
参考
- eureka-server
- eureka-client
- eureka-ribbon
- eureka-feign
概念
Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,例如将请求 /api/goods 转发到商品服务上、/api/order 转发到订单服务上等。
Zull 默认和 Ribbon 结合实现了负载均衡功能。
创建 Zuul 工程
1.1 创建 sping boot 工程:eureka-zuul
1.2 添加 pom.xml 相关依赖
<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>
1.3 application 添加配置信息
spring:
application:
name: eureka-zuul
server:
port: 8400
eureka:
instance:
hostname: localhost
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
client:
service-url:
defaultZone: http://eureka1.server.com:8701/eureka/,http://eureka2.server.com:8702/eureka/,http://eureka3.server.com:8703/eureka/
zuul:
routes:
eureka-ribbon: #对应服务名称, 可以自定义(最好保持一致)path: /ribbon/*
serviceId: eureka-ribbon #对应服务名称
eureka-feign:
path: /eureka-feign/*
serviceId: eureka-feign #对应服务名称
1.4 启动类 EurekaZuulApplication 增加注解
package spring.cloud.demo.eurekazuul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class EurekaZuulApplication {public static void main(String[] args) {SpringApplication.run(EurekaZuulApplication.class, args);
}
}
@EnableZuulProxy: 开启 Zuul 网关注解
1.5 启动 eureka-zuul 服务
打开浏览器,分别输入 http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello, 显示结果分别如下:
可以看到 Zuul 按照路由转发的配置规则,把 /ribbon/ 的请求转发到 eureka-ribbon 服务上,把 /eureka-feign/ 的请求转发到 eureka-feign 的服务上。
至此,一个简单基于 Zuul 路由网关就搭建完成了。
彩蛋
添加自定义过滤器
Zuul 过滤器有四种类型分别是
- pre 路由前
- route 路由时
- post 路由完毕
- error 发生错误时
创建自定义过滤器 filter
package spring.cloud.demo.eurekazuul.fillter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 简单 filter 过滤器
* @auther: maomao
* @DateT: 2019-09-17
*/
public class CommonFilter extends ZuulFilter {
/**
* 在请求被路由之前调用
* @return
*/
@Override
public String filterType() {return "pre";}
/**
* filter 执行顺序,通过数字指定 , 优先级为 0,数字越大,优先级越低
* @return
*/
@Override
public int filterOrder() {return 0;}
/**
* 是否执行该过滤器,此处为 true,说明需要过滤
* @return
*/
@Override
public boolean shouldFilter() {return true;}
@Override
public Object run() throws ZuulException {RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
// 获取请求参数
String token = request.getParameter("token");
// 校验 token 是否可以通过
if (StringUtils.isNotBlank(token) && token.equals("maomao")) {requestContext.setSendZuulResponse(true);
requestContext.setResponseStatusCode(200);
requestContext.set("code", 1);
} else {requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(401);
HttpServletResponse response = requestContext.getResponse();
response.setHeader("content-type", "text/html;charset=utf-8");
requestContext.setResponseBody("网关认证失败,停止路由");
requestContext.set("code", 0);
}
return null;
}
}
将过滤器加入 Bean,增加 Config 类
package spring.cloud.demo.eurekazuul.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import spring.cloud.demo.eurekazuul.fillter.CommonFilter;
/**
* @auther: maomao
* @DateT: 2019-09-17
*/
@Configuration
public class ZuulFilterConfig {
@Bean
public CommonFilter commonFilter() {return new CommonFilter();
}
}
启动工程
在浏览器分别输入 http://localhost:8400/ribbon/sayHello,http://localhost:8400/eureka-feign/feign/sayHello, 显示结果如下:
显示结果证明,过滤器已经生效。因为过滤 CommonFilter 中要求输入参入带 token=maomao,所以请求被拦截,Zuul 停止转发。
在浏览器中 URL 中增加 token 参数,显示如下:
显示结果证明,在 token 正确的情况下,Zuul 转发成功。
至此,自定义的过滤器就演示完成。
总结
本文要实现了简单的 Zuul 路由转发应用。
代码地址
gitHub 地址
<center><font color=red>《Srping Cloud 2.X 小白教程》目录 </font></center>
- spring cloud 2.x 版本 Eureka Server 服务注册中心教程
- spring cloud 2.x 版本 Eureka Client 服务提供者教程
- spring cloud 2.x 版本 Ribbon 服务发现教程 (内含集成 Hystrix 熔断机制)
- spring cloud 2.x 版本 Feign 服务发现教程 (内含集成 Hystrix 熔断机制)
- spring cloud 2.x 版本 Zuul 路由网关教程
- spring cloud 2.x 版本 config 分布式配置中心教程
- spring cloud 2.x 版本 Hystrix Dashboard 断路器教程
转载请注明出处,
- 联系方式:4272231@163.com
转载请注明出处,联系方式:4272231@163.com