当前位置: 首页 > news >正文

SpringCloud-Gateway

什么是网关?

在这里插入图片描述

网关是一个服务,是访问内部系统的唯一入口,提供内部服务的路由中转,额外还可以在此基础上提供如身份验证、监控、负载均衡、限流、降级与应用检测等功能。

Spring Cloud Gateway 与 Zuul 对比

zuul1.x与zuul2.x

Zuul 1.x 基于同步 IO

zuul2.x

基于异步io

zuul1.x 对比 zuul2.x 性能提升

在这里插入图片描述

zuul 与Gateway对比

SpringCloud Gateway 使用

断言 predicates

多个断言可以配合使用

path断言

        predicates:- Path=/mg/**

Query断言

参数值可以写正则,也可以只写参数名

        predicates:- Query=foo,ba.

Method断言

        predicates:- Method=get

Host断言

  predicates:- Host=mashibing.com

Cookie断言

        predicates:- Cookie=name,yiming

基本路由

依赖

		<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

配置文件

spring:cloud:gateway:routes:- id: xxoorouteuri: http://localhost:8080  filters:- StripPrefix=2server:port: 80

整合Eureka

依赖

<!-- eureka-client -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId><version>4.0.0</version></dependency>

配置

spring:cloud:gateway:discovery:locator:// 开启从eureka 拉取服务列表  并自动映射enabled: trueapplication:name: myGateWay
eureka:client:service-url:defaultZone: http://euk1.com:7002/eureka/server:port: 80

负载均衡

spring:cloud:gateway:discovery:locator:enabled: trueroutes:- id: mdbpredicates:- Path=/mangodb/**uri: lb://MDBfilters:- StripPrefix=1application:name: myGateWayeureka:client:service-url:defaultZone: http://euk1.com:7002/eureka/server:port: 80

自定义负载均衡

配置
MDB:ribbon:NFLoadBalancerRuleClassName: com.mashibing.admin.MyRule
package com.mashibing.admin;import java.util.List;import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.Server;public class MyRule extends AbstractLoadBalancerRule{@Overridepublic Server choose(Object key) {// TODO Auto-generated method stubList<Server> list = this.getLoadBalancer().getReachableServers();System.out.println(list);// 各种逻辑~~~~System.out.println("xxoo");return list.get(0);}@Overridepublic void initWithNiwsConfig(IClientConfig clientConfig) {// TODO Auto-generated method stub}}

自定义路由

@Beanpublic RouteLocator routeLocator (RouteLocatorBuilder locatorBuilder) {return locatorBuilder.routes().route(p -> p.path("/xxoo").filters(f -> f.stripPrefix(1)).uri("http://mashibing.com")).route(p ->p.path("/go").filters(f -> f.stripPrefix(1)).uri("lb://MDB")).build();}

自定义过滤器

package com.mashibing.admin;import java.util.List;import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;import reactor.core.publisher.Mono;@Component
public class MyFilter implements Ordered,GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();MultiValueMap<String, String> queryParams = request.getQueryParams();List<String> list = queryParams.get("id");if (null == list || list.size() ==0) {// 非法请求System.out.println("不要~");//			exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//			
//			return exchange.getResponse().setComplete();DataBuffer dataBuffer = exchange.getResponse().bufferFactory().wrap("xiake~!!".getBytes());exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().writeWith(Mono.just(dataBuffer));}return chain.filter(exchange);}@Overridepublic int getOrder() {// TODO Auto-generated method stubreturn 0;}}

SpringCloud Gateway

在这里插入图片描述

路由

使用webflux

	@Beanpublic RouterFunction<ServerResponse> function(){RouterFunction<ServerResponse> route = RouterFunctions.route(RequestPredicates.path("/002"),req -> ServerResponse.ok().body(BodyInserters.fromValue("xxx")));return route;}

缓存

权重与灰度发布

随机算法

      routes:- id: w1predicates:- Path=/w/**- Weight=service,95uri: lb://MDBfilters:- StripPrefix=1- id: w2predicates:- Path=/w/**- Weight=service,5uri: lb://MDB2filters:- StripPrefix=1        

过滤器

SpringCloud Gateway用于拦截用户请求和链式处理,可以实现面向切面编程,在切面中可以实现与应用无关的需求,比如安全、访问超时等

有序

order值越小 优先级越高

	@Overridepublic int getOrder() {// TODO Auto-generated method stubreturn 110;}

限流

内置令牌桶 + Redis

pom

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency>
      routes:- id: w1predicates:- Path=/w/**uri: lb://MDB2filters:- StripPrefix=1- name: RequestRateLimiterargs:key-resolver: '#{@userKeyResolver}'redis-rate-limiter.replenishRate: 1redis-rate-limiter.burstCapacity: 3
public class RateLimitConfig {KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));}
}

整合GoogleGuava

DefaultRateLimiter

package com.mashibing.admin;import java.util.HashMap;
import java.util.Objects;import javax.validation.constraints.DecimalMin;import org.springframework.cloud.gateway.filter.ratelimit.AbstractRateLimiter;
import org.springframework.cloud.gateway.support.ConfigurationService;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;import com.google.common.util.concurrent.RateLimiter;import reactor.core.publisher.Mono;@Component
@Primary
public class DefaultRateLimiter extends AbstractRateLimiter<DefaultRateLimiter.Config> {public DefaultRateLimiter() {super(Config.class, "default-rate-limit", new ConfigurationService());}/*** 每秒一个请求,每秒发一个令牌*/private final RateLimiter limiter = RateLimiter.create(1);@Overridepublic Mono<Response> isAllowed(String routeId, String id) {Config config = getConfig().get(routeId);limiter.setRate(Objects.isNull(config.getPermitsPerSecond()) ? 1 : config.getPermitsPerSecond());boolean isAllow = limiter.tryAcquire();return Mono.just(new Response(isAllow, new HashMap<>()));}@Validatedpublic static class Config {@DecimalMin("0.1")private Double permitsPerSecond;public Double getPermitsPerSecond() {return permitsPerSecond;}public Config setPermitsPerSecond(Double permitsPerSecond) {this.permitsPerSecond = permitsPerSecond;return this;}}}

配置

      routes:- id: w1predicates:- Path=/w/**uri: lb://MDB2filters:- StripPrefix=1- name: RequestRateLimiterargs:rate-limiter: "#{@defaultRateLimiter}"key-resolver: "#{@userKeyResolver}"default-rate-limit.permitsPerSecond: 0.5

权限

写在filter中

hystrix

项目里讲

生命周期

在这里插入图片描述

Spring Cloud Gateway同zuul类似,有“pre”和“post”两种方式的filter。客户端的请求先经过“pre”类型的filter,然后将请求转发到具体的业务服务,比如上图中的user-service,收到业务服务的响应之后,再经过“post”类型的filter处理,最后返回响应到客户端。

http://www.lryc.cn/news/67007.html

相关文章:

  • 【C++ qt4】操作json学习笔记
  • 【牛客刷题专栏】0x25:JZ24 反转链表(C语言编程题)
  • useEffect
  • 如何利用splice()和slice()方法操作数组
  • 一文读懂ChatGPT(全文由ChatGPT撰写)
  • 如何提升应届生职场竞争力
  • David Silver Lecture 5: Model-Free Control
  • MySQL-----事务管理
  • chatGPT润色中英论文软件-文章修改润色器
  • MacOS下安装和配置Nginx
  • 采用UWB(超宽频)技术开发的java版智慧工厂定位系统源码
  • 【2023华为OD笔试必会20题--C语言版】《04 日志采集系统》——数组
  • MySQL数据库——MySQL修改存储过程(ALTER PROCEDURE)
  • ASEMI代理ADV7125JSTZ330原装ADI车规级ADV7125JSTZ330
  • 86盒IP对讲一键报警器
  • 【高数+复变函数】傅里叶积分
  • 【Leetcode】241. 为运算表达式设计优先级
  • torch两个向量除法,对于分母向量中的元素为0是设置为1,避免运算错误
  • NodeJs 最近各版本特性汇总
  • python数据分析案例——天猫订单综合分析
  • 05- redis集群模式搭建(上) (包含云服务器[填坑])
  • 【AI】YOLOV1原理详解
  • 提高APP安全性的必备加固手段——深度解析代码混淆技术
  • 想让行车记录仪协助道路病害自动化检测?可以!
  • git上传大大大文件项目好折磨人
  • java常见异常的处理方法
  • 上传图片到阿里云服务器base64 上传
  • 【致敬未来的攻城狮计划】— 连续打卡第二十六天:瑞萨RA Cortex-M 内核RA2E1 RT-Thread BSP 启蒙知识
  • 2023年5月8日-5月14日(方案C,下班UE视频教程为主)
  • 「MIAOYUN」:降本增效,赋能传统企业数字化云原生转型 | 36kr 项目精选