Spring Cloud Zuul 路由网关及服务过滤
2020-04-12 16:07:14来源:博客园 阅读 ()
Spring Cloud Zuul 路由网关及服务过滤
Zuul 简介
Zuul
的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如 /api/admin
转发到到 Admin 服务,/api/member
转发到到 Member 服务。Zuul
默认和 Ribbon
结合实现了负载均衡的功能。
引入依赖
在 pom.xml
中主要添加 spring-cloud-starter-netflix-eureka-server
和 spring-cloud-starter-netflix-zuul
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
相关配置
在 application.yml
中主要添加 Zuul
路由配置
zuul:
routes:
api-a:
path: /api/ribbon/**
serviceId: hello-spring-cloud-web-admin-ribbon
api-b:
path: /api/feign/**
serviceId: hello-spring-cloud-web-admin-feign
路由说明:
- 以 /api/ribbon 开头的请求都转发给 spring-cloud-web-admin-ribbon 服务
- 以 /api/feign 开头的请求都转发给 spring-cloud-web-admin-feign 服务
在 Application
入口类中添加 @EnableZuulProxy
注解开启 zuul
功能
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
配置网关路由失败时的回调
创建 WebAdminFeignFallbackProvider
回调类
/**
* 路由 hello-spring-cloud-web-admin-feign 失败时的回调
*/
@Component
public class WebAdminFeignFallbackProvider implements FallbackProvider {
@Override
public String getRoute() {
// ServiceId,如果需要所有调用都支持回退,则 return "*" 或 return null
return "hello-spring-cloud-web-admin-feign";
}
/**
* 如果请求服务失败,则返回指定的信息给调用者
* @param route
* @param cause
* @return
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
return new ClientHttpResponse() {
/**
* 网关向 api 服务请求失败了,但是消费者客户端向网关发起的请求是成功的,
* 不应该把 api 的 404,500 等问题抛给客户端
* 网关和 api 服务集群对于客户端来说是黑盒
* @return
* @throws IOException
*/
@Override
public HttpStatus getStatusCode() throws IOException {
return HttpStatus.OK;
}
@Override
public int getRawStatusCode() throws IOException {
return HttpStatus.OK.value();
}
@Override
public String getStatusText() throws IOException {
return HttpStatus.OK.getReasonPhrase();
}
@Override
public void close() {
}
@Override
public InputStream getBody() throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> map = new HashMap<>();
map.put("status", 200);
map.put("message", "无法连接");
return new ByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8"));
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
// 和 getBody 中的内容编码一致
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
return headers;
}
};
}
}
测试路由访问
依次运行 EurekaApplication
> ServiceAdminApplication
> WebAdminRibbonApplication
> WebAdminFeignApplication
> ZuulApplication
各服务
- 访问:http://localhost:8769/api/ribbon/hi?message=zuul
浏览器显示
port : 8763,message : zuul
- 访问:http://localhost:8769/api/feign/hi?message=zuul
浏览器显示
port : 8763,message : zuul
至此说明 Zuul 的路由功能配置成功。
使用 Zuul 的服务过滤功能
Zuul
不仅仅只是路由,还有很多强大的功能。比如用在安全验证方面。
创建服务过滤器
/**
* Zuul 的服务过滤演示
*/
@Component
public class LoginFilter extends ZuulFilter {
private static final Logger logger = LoggerFactory.getLogger(LoginFilter.class);
/**
* 配置过滤类型,有四种不同生命周期的过滤器类型
* 1. pre:路由之前
* 2. routing:路由之时
* 3. post:路由之后
* 4. error:发送错误调用
* @return
*/
@Override
public String filterType() {
return "pre";
}
/**
* 配置过滤的顺序
* @return
*/
@Override
public int filterOrder() {
return 0;
}
/**
* 配置是否需要过滤:true/需要,false/不需要
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
* 过滤器的具体业务代码
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String token = request.getParameter("token");
if (token == null) {
logger.warn("Token is empty");
context.setSendZuulResponse(false);
context.setResponseStatusCode(401);
try {
context.getResponse().getWriter().write("Token is empty");
} catch (IOException e) {
}
} else {
logger.info("OK");
}
return null;
}
}
测试过滤器
- 访问:http://localhost:8769/api/feign/hi?message=zuul
网页显示
Token is empty
- 访问:http://localhost:8769/api/feign/hi?message=zuul&token=1
网页显示
port : 8763,message : zuul
- 文章作者:彭超
- 本文首发于个人博客:https://antoniopeng.com/2019/11/16/springcloud/SpringCloudZuul%E8%B7%AF%E7%94%B1%E7%BD%91%E5%85%B3%E5%8F%8A%E6%9C%8D%E5%8A%A1%E8%BF%87%E6%BB%A4/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 彭超 | Blog!
原文链接:https://www.cnblogs.com/antoniopeng/p/12687618.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:磁力搜索网站导航2020年更新
下一篇:JVM类加载过程详细分析
- Spring系列.ApplicationContext接口 2020-06-11
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 给你一份超详细 Spring Boot 知识清单 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
- 掌握SpringBoot-2.3的容器探针:实战篇 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash