热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

zuul开发实战(限流,超时解决)

什么是网关APIGateway,是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能提供路由请求、鉴权、监控、缓存

什么是网关
  API Gateway,是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求、鉴权、监控、缓存、限流等功能
  统一接入
    * 智能路由
    * AB测试、灰度测试
    * 负载均衡、容灾处理
    * 日志埋点(类似Nignx日志)
  流量监控
    * 限流处理
    * 服务降级
  安全防护
    * 鉴权处理
    * 监控
    * 机器网络隔离
主流的网关
  zuul:是Netflix开源的微服务网关,和Eureka,Ribbon,Hystrix等组件配合使用,Zuul 2.0比1.0的性能提高很多
  kong: 由Mashape公司开源的,基于Nginx的API gateway
  nginx+lua:是一个高性能的HTTP和反向代理服务器,lua是脚本语言,让Nginx执行Lua脚本,并且高并发、非阻塞的处理各种请求

1. zuul路由案例:
  1. 导入依赖

<parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.0.3.RELEASEversion><relativePath/> parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-dependenciesartifactId><version>Finchley.RELEASEversion><type>pomtype><scope>importscope>dependency>dependencies>dependencyManagement><properties><project.build.sourceEncoding>UTF-8project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding><java.version>1.8java.version>properties><dependencies><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-starter-netflix-zuulartifactId>dependency>dependencies><build><plugins><plugin><groupId>org.springframework.bootgroupId><artifactId>spring-boot-maven-pluginartifactId>plugin>plugins>build>

View Code

  2. 注册到eureka

server:port: 9000#服务的名称
spring:application:name: api_gatway#指定注册中心地址ַ
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/

  3. 主函数开启zuul注解&#xff0c;并且启动

&#64;SpringBootApplication
&#64;EnableZuulProxy
// 开启网关代理
public class ApiGatwayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatwayApplication.class, args);}
}

测试&#xff1a;可以看到服务都已经注册到eureka上了&#xff0c;我们不用配置任何路由规则就可以直接通过注册的服务名称来路由

2. 自定义路由规则&#xff1a;

#自定义路由映射(配置文件加入这段配置就好了)
zuul:routes:order
-service: /apigateway/order/** #配置后就不能通过serverName访问了。product-service: /apigateway/product/**#忽略满足条件的服务(即&#xff1a;忽略所有-service结尾的服务)ignored-patterns: /*-service/**#解决http请求头为空的问题 (值为空就好了)sensitive-headers:

 

 3. 自定义过滤器url校验 / 限流&#xff1a;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
import org.springframework.http.HttpStatus;
/*** 拦截指定url, 进行参数校验*/
&#64;Component
public class UrlFilter extends ZuulFilter {// private String pre_filterType &#61; PRE_TYPE; // 前置过滤器(url之前执行)
// private String post_filterType &#61; POST_TYPE; // 后置过滤器
// private String error_filterType &#61; ERROR_TYPE;// 异常过滤器/*** 过滤器类型* &#64;return*/&#64;Overridepublic String filterType() {return PRE_TYPE;}/*** 过滤器顺序(多个过滤器时, 越小的越先执行)* &#64;return*/&#64;Overridepublic int filterOrder() {return 3;}/*** 过滤器是否生效* 为false时就不会走run()里面的业务逻辑* &#64;return*/&#64;Overridepublic boolean shouldFilter() {RequestContext requestContext &#61; RequestContext.getCurrentContext();HttpServletRequest request &#61; requestContext.getRequest();// System.out.println(request.getRequestURI());// System.out.println(request.getRequestURL());if ("/apigateway/order/api/v1/order/find".equalsIgnoreCase(request.getRequestURI())){return true;}return false;}/*** 业务逻辑* &#64;return* &#64;throws ZuulException*/&#64;Overridepublic Object run() throws ZuulException {System.out.println("拦截逻辑");RequestContext requestContext &#61; RequestContext.getCurrentContext();HttpServletRequest request &#61; requestContext.getRequest();//token对象String id &#61; request.getHeader("id");if(StringUtils.isBlank((id))){id &#61; request.getParameter("id");}//如果id参数为null就程序停止, 同时返回 HttpStatus.UNAUTHORIZED 状态码if (StringUtils.isBlank(id)) {requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());}return null;}
}

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
import org.springframework.http.HttpStatus;
import com.google.common.util.concurrent.RateLimiter;
/*** 网关限流*/
&#64;Component
public class RequestFilter extends ZuulFilter {//每秒产生1000个令牌private static final RateLimiter RATE_LIMITER &#61; RateLimiter.create(1000);&#64;Overridepublic String filterType() {return PRE_TYPE;}&#64;Overridepublic int filterOrder() {return -4;}&#64;Overridepublic boolean shouldFilter() {return true;}&#64;Overridepublic Object run() throws ZuulException {RequestContext requestContext &#61; RequestContext.getCurrentContext();System.out.println("获取令牌");boolean tryAcquire &#61; RATE_LIMITER.tryAcquire();// 如果获取不到就直接停止if(!tryAcquire){requestContext.setSendZuulResponse(false);requestContext.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());}return null;}
}

解决zuul超时问题&#xff0c;  完整配置文件  (设置ribbon  hystrix  zuul 超时时间&#xff0c;最好超时时间值比被代理的服务要大。ps: 不需要添加其他依赖包&#xff0c;就一个zuul依赖就好了)

server:port: 9000spring:application:name: api_gatway# eureka注册地址
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/ribbon:ReadTimeout: 7000 #超时时间ConnectTimeout: 2000 #连接时间MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用OkToRetryOnAllOperations: false #是否所有操作都重试#解决hystrix&#43;feign超时设置
feign:hystrix: #开启feign支持hystrix (注意:一定要开启&#xff0c;旧版本默认支持&#xff0c;新版本默认关闭)enabled: truehystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 7000# &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;
# 不配置路由规则&#xff0c;默认可以用服务注册名称来路由
# 商品服务&#xff1a;http://localhost:9000/product-service/api/v1/product/list
# 订单服务&#xff1a;http://localhost:9000/order-service/api/v1/order/find?id&#61;3# 自定义路由规则
zuul:routes:order-service: /apigateway/order/**product-service: /apigateway/product/**# 禁止对product-service服务路由 (支持多个&#xff0c;逗号隔开就好了)#ignored-services: product-service# 禁止对所有-service结尾的服务路由ignored-patterns: /*-service/**# 解决http请求头为空的问题 (值为空就好了)sensitive-headers:#ignored-headers: accept-language 路由时&#xff0c;不向第三方传递请求头#sensitive-headers: COOKIE 路由时&#xff0c;不向第三方传递COOKIEhost:socket-timeout-millis: 7000connect-timeout-millis: 7000# 经过上面的自定义路由之后# 访问product-service http://localhost:9000/apigateway/product/api/v1/product/list# 访问order-service http://localhost:9000/apigateway/order/api/v1/order/find?id&#61;3


转:https://www.cnblogs.com/wlwl/p/10413151.html



推荐阅读
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 近年来,BPM(业务流程管理)系统在国内市场逐渐普及,多家厂商在这一领域崭露头角。本文将对当前主要的BPM厂商进行概述,并分析其各自的优势。目前,市场上较为成熟的BPM产品主要分为两类:一类是综合型厂商,如IBM和SAP,这些企业在整体解决方案方面具有明显优势;另一类则是专注于BPM领域的专业厂商,它们在特定行业或应用场景中表现出色。通过对比分析,本文旨在为企业选择合适的BPM系统提供参考。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 本文深入解析了Spring Cloud路由网关Zuul的核心功能及其典型应用场景。通过对方志朋老师教材的学习和实践,详细探讨了Zuul在微服务架构中的重要作用,包括请求路由、过滤器链管理以及服务动态扩展等关键特性。同时,结合实际案例,展示了Zuul在高并发和复杂业务场景下的应用优势,为读者提供了全面的技术参考。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 本文深入解析了Java面向对象编程的核心概念及其应用,重点探讨了面向对象的三大特性:封装、继承和多态。封装确保了数据的安全性和代码的可维护性;继承支持代码的重用和扩展;多态则增强了程序的灵活性和可扩展性。通过具体示例,文章详细阐述了这些特性在实际开发中的应用和优势。 ... [详细]
  • 微信小程序实现类似微博的无限回复功能,内置云开发数据库支持
    本文详细介绍了如何利用微信小程序实现类似于微博的无限回复功能,并充分利用了微信云开发的数据库支持。文中不仅提供了关键代码片段,还包含了完整的页面代码,方便开发者按需使用。此外,HTML页面中包含了一些示例图片,开发者可以根据个人喜好进行替换。文章还将展示详细的数据库结构设计,帮助读者更好地理解和实现这一功能。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • Spring Boot 和 Spring Cloud 是 Spring 生态系统中的重要组成部分,各自具有独特的特性和应用场景。Spring Boot 通过简化配置和自动配置机制,显著提高了开发和部署效率,减少了传统 Spring 应用中繁琐的 XML 配置文件需求。而 Spring Cloud 则在此基础上进一步提供了分布式系统的解决方案,包括服务发现、配置管理、断路器等高级功能,适用于微服务架构的构建和管理。本文将深入探讨两者的核心差异,并分析其各自的最佳应用场景。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
author-avatar
carmen青春-潮人帮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有