SpringCloud微服务(05):Zuul组件,实现路由网关控制
本文源码:GitHub·点这里 || GitEE·点这里
一、Zuul组件简介
1、基础概念
Zuul 网关主要提供动态路由,监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过zuul网关对用户的请求进行路由,转发到具体的后微服务模块中。
2、Zuul的作用
1)按照不同策略,将请求转发到不同的服务上去;
2)聚合API接口,统一对外暴露,提高系统的安全性;
3)实现请求统一的过滤,以及服务的熔断降级;
3、案例结构
启动顺序如下:
# 注册中心
node05-eureka-7001
# 两个服务提供者
node05-provider-6001
node05-provider-6002
# 网关控制
node05-zuul-7002
启动成功后,注册中心展示如下:
二、Zuul使用详解
1、核心依赖
<!-- 路由网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
2、核心配置文件
server:
port: 7002
spring:
application:
name: cloud-node05-parent
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://registry01.com:7001/eureka/
zuul:
# 前缀,可以用来做版本控制
prefix: /v1
# 禁用默认路由,执行配置的路由
ignored-services: "*"
routes:
# 配置6001接口微服务
pro6001:
serviceId: node05-provider-6001
path: /api-6001/**
# 配置6002接口微服务
pro6002:
serviceId: node05-provider-6002
path: /api-6002/**
- 启动类注解:@EnableZuulProxy
3、统一服务降级
实现FallbackProvider接口,自定义响应提示。
@Component
public class FallBackConfig implements FallbackProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(FallBackConfig.class) ;
@Override
public ClientHttpResponse fallbackResponse(Throwable cause) {
// 捕获超时异常,返回自定义信息
if (cause instanceof HystrixTimeoutException) {
return response(HttpStatus.GATEWAY_TIMEOUT);
} else {
return fallbackResponse();
}
}
private ClientHttpResponse response(final HttpStatus status) {
return new ClientHttpResponse() {
@Override
public HttpStatus getStatusCode() {
return status;
}
@Override
public int getRawStatusCode() {
return status.value();
}
@Override
public String getStatusText() {
return status.getReasonPhrase();
}
@Override
public void close() {
LOGGER.info("close");
}
@Override
public InputStream getBody() {
String message =
"{\n" +
"\"code\": 200,\n" +
"\"message\": \"微服务飞出了地球\"\n" +
"}";
return new ByteArrayInputStream(message.getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
@Override
public String getRoute() {
return "*";
}
@Override
public ClientHttpResponse fallbackResponse() {
return response(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
4、统一过滤器
继承ZuulFilter类,自定义过滤动作。
@Component
public class FilterConfig extends ZuulFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(FilterConfig.class) ;
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext requestContext = RequestContext.getCurrentContext() ;
try {
doBizProcess(requestContext);
} catch (Exception e){
LOGGER.info("异常:{}",e.getMessage());
}
return null;
}
public void doBizProcess (RequestContext requestContext) throws Exception {
HttpServletRequest request = requestContext.getRequest() ;
String reqUri = request.getRequestURI() ;
if (!reqUri.contains("getAuthorInfo")){
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(401);
requestContext.getResponse().getWriter().print("Path Is Error...");
}
}
}
5、测试流程
1)测试网关配置
访问如下接口,响应正常,说明网关配置生效:
http://localhost:7002/v1/api-6001/getAuthorInfo/1
http://localhost:7002/v1/api-6002/getAuthorInfo/2
2)测试服务降级
关闭6001服务,再次访问接口,提示信息如下,说明服务降级策略生效:
{
"code": 200,
"message": "微服务飞出了地球"
}
3)测试过滤器
因为请求URI不匹配getAuthorInfo,所以被拦截,说明过滤器略生效:
http://localhost:7002/v1/api-6001/
响应提示:
Path Is Error...
三、源代码地址
GitHub·地址
https://github.com/cicadasmile/spring-cloud-base
GitEE·地址
https://gitee.com/cicadasmile/spring-cloud-base
SpringCloud微服务(05):Zuul组件,实现路由网关控制的更多相关文章
- 【微服务】之五:轻松搞定SpringCloud微服务-调用远程组件Feign
上一篇文章讲到了负载均衡在Spring Cloud体系中的体现,其实Spring Cloud是提供了多种客户端调用的组件,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使 ...
- SpringCloud微服务架构分布式组件如何共享session对象
一.简单做一个背景说明1.为说明问题,本文简单微服务架构示例如下 2.组件说明分布式架构,每个组件都是集群或者主备.具体说明如下:zuul service:网关,API调用都走zuul service ...
- ⑤SpringCloud 实战:引入Zuul组件,开启网关路由
这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...
- SpringCloud微服务(04):Turbine组件,实现微服务集群监控
本文源码:GitHub·点这里 || GitEE·点这里 写在前面,阅读本文前,你需要了解熔断器相关内容 SpringCloud微服务:Hystrix组件,实现服务熔断 一.聚合监控简介 1.Dash ...
- ⑥SpringCloud 实战:引入gateway组件,开启网关路由功能
这是SpringCloud实战系列中第4篇文章,了解前面第两篇文章更有助于更好理解本文内容: ①SpringCloud 实战:引入Eureka组件,完善服务治理 ②SpringCloud 实战:引入F ...
- SpringCloud微服务:基于Nacos组件,整合Dubbo框架
源码地址:GitHub·点这里 || GitEE·点这里 一.基础组件简介 1.Dubbo框架 Dubbo服务化治理的核心框架,之前几年在国内被广泛使用,后续由于微服务的架构的崛起,更多的公司转向微服 ...
- 【微服务】之六:轻松搞定SpringCloud微服务-API网关zuul
通过前面几篇文章的介绍,我们可以轻松搭建起来微服务体系中比较重要的几个基础构建服务.那么,在本篇博文中,我们重点讲解一下,如何将所有微服务的API同意对外暴露,这个就设计API网关的概念. 本系列教程 ...
- SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
源码地址:GitHub·点这里||GitEE·点这里 一.基本简介 1.概念描述 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.包括核心的独立类库,监 ...
- springcloud微服务实战:Eureka+Zuul+Feign/Ribbon+Hystrix Turbine+SpringConfig+sleuth+zipkin
相信现在已经有很多小伙伴已经或者准备使用springcloud微服务了,接下来为大家搭建一个微服务框架,后期可以自己进行扩展.会提供一个小案例: 服务提供者和服务消费者 ,消费者会调用提供者的服务,新 ...
随机推荐
- 搭建react native所遇到的坑
一.所遇问题 在搭建react native环境中,遇到执行react native run-android命令出现如下问题 Could not resolve all dependencies f ...
- SpringCloud服务降级案列
一.什么是服务降级 所有的RPC技术里面服务降级是一个最为重要的话题,所谓的降级指的是当服务的提供方不可使用的时候,程序不会出现异常,而会出现本地的操作 二.服务降级案例 1.目录展示 2.导入依赖 ...
- ssm集成(maven)& 分模块开发--详细教程
1 maven版本的ssm 1.1 最简单的版本步骤: (1) 创建maven web项目 (2) 在pom.xml中导入依赖的jar包 (3) 再写配置文件: web.xml <!DOCTYP ...
- Nginx在开发中常用的基础命令
场景 Ubuntu Server 16.04 LTS上怎样安装下载安装Nginx并启动: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detai ...
- CentOS 7 离线环境安装nginx时报错:./configure: error: C compiler cc is not found
先说解决方法: 在nginx目录下,查看objs/autoconf.err文件,该文件记录了具体的错误信息 vi objs/autoconf.err 一般就是缺少一些文件,因为我的gcc.g++也是离 ...
- Redis学习(二)Redis的安装
Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择 ...
- 一起学SpringMVC之异常处理
在系统开发过程中,异常处理是不可避免,如果异常处理不好,会给用户造成很差的体验,本文主要讲解在SpringMVC开发过程中,异常处理的相关知识点,仅供学习分享使用,如有不足之处,还请指正. 概述 在S ...
- Navicat远程连接MySQL8,必知防坑策略
项目上线是每一个开发工程师面临收获前面抓紧时间开发的成果,但有时我们上线项目首先需要做一些相关的业务测试.通过Xshell远程连接后使用命令行的方式连接操作Mysql这个没什么太大的你问题.但每次通过 ...
- [转]企业创新平台—Power Platform 的架构与应用场景
本文转自:https://www.microsoft.com/china/events/video_311
- 修改so库中的依赖名
修改so库中的依赖名 在ArchLinuxArm上有一些针对aarch64, arm, armeabi-v7a等Android常用架构的so库可以下载,有时候可以省去很多编译时间,且都是编译optim ...