首页 > 其他分享 >springcloud网关整理

springcloud网关整理

时间:2022-11-24 15:35:49浏览次数:64  
标签:网关 springcloud springframework 路由 spring 整理 org import cloud


脑图地址(脑图来自尚硅谷周阳老师)

链接:https://pan.baidu.com/s/1UHyKoVPPdmL8y0PcOfgLjg 
提取码:a51i 

关于网关:

netflix公司的zuul(停止更新进入维护,第二代没有出来)

        ​​https://github.com/Netflix/zuul/wiki​

spring社区的Gateway(现阶段的主流网关)

   ​​https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/​

   Gateway是在spring生态系统之上构建的API服务网关,基于spring5.x,springboot2.x和Project Reactor等技术。旨在提供一种简单有效的方式来对API进行路由,以提供一些强大的过滤器功能。例如:熔断、限流、重试等等。

        Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,而在spring boot 2.x以上的版本中,没有对新版本的Zuul 2.x最新高性能版本进行集成(因为未开发完善),仍然还是使用的Zuul 1.x的非Recator模式的老版本。而为了提高网关的性能,Spring Cloud Gateway是基于WebFlux框架实现的,而WebFlux框架的底层则使用了高性能的Reactor模式通信框架Netty。(Spring Cloud Gateway使用的webflux中的reactor-netty响应式编程组件,底层使用了Netty通讯框架)

        Spring Cloud Gateway的目标提供统一的路由方式且基于Filter链的方式提供了网关的基本功能,例如:安全、监控/指标和限流等。(反向代理,鉴权,流量控制,熔断,日志监控等)

springcloud网关整理_spring

 微服务网关所在的地址

springcloud网关整理_spring_02

 Spring Cloud Gateway特性

  1. 动态路由;能够匹配任何请求属性
  2. 可以对路由指定prddicate断言和filter过滤器
  3. 集成Hystrix的断路器功能
  4. 集成spring cloud服务发现功能
  5. 易于编写的Predicate和Filter
  6. 请求限流功能
  7. 支持路径重写

Gateway和Zuul的区别

zuul1.x是一个基于阻塞I/O的API网关,基于Servlet2.5使用阻塞架构,它不支持任何长连接。zuul的设计模式和Nginx比较像,每次I/O操作都是从工作线程中选择一个执行,请求线程被阻塞到工作线程完成,但是差别是Nginx是用C++实现,Zuul用java实现,而JVM本身会有第一次加载比较慢的情况,使得Zuul性能相对较差。

zuul2.x的理念更加先进,想基于Netty非阻塞支持长连接。但是springcloud目前还没有整合。zuul2.x的性能较zuul1.x有较大提升。在性能方面,根据官方提供的基准测试,springcloud gateway的RPS(每秒请求数)是zuul1.6倍。

Spring Cloud Gateway建立在Spring Framework 5、Project Reactor和Spring Boot2之上,使用非阻塞API;还支持长连接,并且与spring紧密集成拥有更好的开发体验。

Spring Cloud集成的Zuul版本是1.x,采用的是Tomcat容器,使用的是传统的Servlet IO处理模型。

springcloud网关整理_非阻塞_03

Servlet是一个简单的网络IO模型,当请求进入到servlet container时,servlet container就会为其绑定一个线程,在并发不高的场景下这种模型是适用的。但是一旦在高并发的环境下,线程的数量就会飞涨,而线程的资源代价是昂贵的(上下文切换,内存消耗大),严重影响请求的处理时间。在一些简单的业务场景下,不希望为每一个request分配线程,只需要一个或几个线程就能对应极大的并发请求,这种业务场景下servlet模型没有优势。

所以Zuul1.x是基于servlet之上的一个阻塞式处理模型,即spring实现了处理所有request请求的servlet(DispatcherServlet)并由该Servlet阻塞式处理,所以spring cloud zuul无法摆脱servlet模型的弊端。

传统的web框架,比如说是struts2,springmvc等都是基于Servlet API与Servlet容器基础之上运行的。但是Servlet3.1之后有了异步非阻塞的支持。而webFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上。非阻塞式+函数式编程(spring 5.x必须让你使用java8)

spring webflux 是spring 5.0引入的新的响应式框架,区别于Spring mvc,它不需要依赖Servlet API,他是完全异步非阻塞的,并且基于Reactor来实现响应式流规范。

Gateway三大核心概念

router:路由是构建网关的基础模块,它由ID,目标URL和一系列的断言和过滤器组成,如果断言为true,则匹配该路由。

predicate:断言(匹配HTTP请求的内容,例如请求头和请求参数),如果请求和断言匹配则进行路由。

filter:过滤值的是Spring框架中Gateway Filter的实例,使用过滤器,可以在请求路由之前或之后进行拦截。

客户端向spring cloud Gateway发出请求。然后在Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler。Handler再通过制定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开可能会发送代理请求之前的“pre”和之后的“post”执行业务逻辑。

Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量控制、日志输出、协议转换等等。

在“post”类型的过滤器可以做内容响应,响应头的修改,日志的输出,流量的监控等有着非常重要的作用。

pom.xml

<dependencies>
<!--新增gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

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

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>



</dependencies>

application.yml

server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由

routes:
- id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
#匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由

- id: payment_routh2
# uri: http://localhost:8001
uri: lb://cloud-payment-service
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由


eureka:
instance:
hostname: cloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka

 主启动

package com.atguigu.springcloud;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class GateWayMain9527 {
public static void main(String[] args) {
SpringApplication.run( GateWayMain9527.class,args);
}
}

我们目前不想暴露8001端口,我们只暴露路由9527端口;

自己配置路由

package com.atguigu.springcloud.config;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* @Authtor pshdhx
* @Date 2021/7/4 16:59
* @Version 1.0
*/
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
/**
* 发现了一个问题:path:是后边uri的一个补充拼装;【访问的是国内,国际,军事】
* 可以重复,比如第二个
* 但是不能没有,比如第四个,拼装起来没有 .../junshi这样的url,所有找不到网页 HTTP ERROR 500
*/
routes.route("path_route_atguigu",a->a.path("/guonei").uri("http://news.baidu.com")).build();
routes.route("path_route_atguigu2",a->a.path("/guoji").uri("http://news.baidu.com/guoji")).build();
routes.route("path_route_atguigu2",a->a.path("/mil").uri("http://news.baidu.com")).build();
routes.route("path_route_atguigu2",a->a.path("/junshi").uri("http://news.baidu.com")).build();
return routes.build();
}
}

断言

After:在这个日期之后才会生效;

springcloud网关整理_spring_04

 

 带cookie

springcloud网关整理_限流_05

springcloud网关整理_非阻塞_06

 

自定义过滤器

package com.atguigu.springcloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Date;
/**
* @Authtor pshdhx
* @Date 2021/7/11 15:23
* @Version 1.0
*/


@Component
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter,Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

log.info("*********come in MyLogGateWayFilter: "+new Date());
String username = exchange.getRequest().getQueryParams().getFirst("username");
if(StringUtils.isEmpty(username)){
log.info("*****用户名为Null 非法用户,(┬_┬)");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//给人家一个回应
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}

@Override
public int getOrder() {
return 0;
}

}

 

代码地址:

​https://github.com/pshdhx/springcloudalibaba/tree/master​

标签:网关,springcloud,springframework,路由,spring,整理,org,import,cloud
From: https://blog.51cto.com/u_15890333/5884039

相关文章

  • HTML5+css3新增布局元素整理
    HTML5新增的语义化标签<head>:头部标签<nav>:导航标签<article>:内容标签<section>:定义文档某个区域<aside>:侧边栏标签<footer>:尾部标签 注意:这种语义化标准主要是针对搜索引......
  • css3盒子定位整理
    定位模式是否脱标移动位置是否常用static静态定位否不能使用边偏移很少relative相对定位否(占有位置)相对于自身位置移动常用absolute绝对定位是(不占有位置)带有定位的父级常用......
  • css3整理(一)
    font-weight属性值描述normal默认值bold加粗100-900400=normal;700=bold;注意这个数字后边不能跟单位font-style属性值作用normal默认值italic浏览器显示斜体的样式注意:我们平......
  • Mysql数据库笔记整理
    数据库-理论基础1.什么是数据库?数据:描述事物的符号记录,可以是数字、文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。数据库:存储数据......
  • SpringCloud入门
    一、SpringCloud简介与版本选择1、简介SpringCloud是一系列框架的集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心......
  • 数据采集网关如何打破数据孤岛,实现工业物联网
    企业数字化发展到一定水平,就可能出现不平衡,催生出“数据孤岛”的现象。企业内部存在多个设备多个系统,都有各自的数据,分门别类进行存储,这些部分之间累又建立有效的数据交换渠......
  • 数据结构习题整理(4.0)
    42.试着写出一个判定给定二叉树是否为二叉排序树的算法。设此二叉树以二叉链表作存储结构,且树中结点的关键字均不同。intisbstree(bitreet)/*判断是否为二叉排序树*/{if(t......
  • 配置案例|RS232转Profinet网关接包装扫码器
    本文主要介绍小疆智控(北京)技术有限公司生产的RS232转Profinet网关(产品型号:GW-PN5002)在计扫外包装中条码扫描方面的使用方法。案例说明:小疆智控生产的RS232转Profinet网......
  • springcloud -nacos-配置中心-接入
    1.nacaosClient接入:pom.xml引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-actuator</artifactId>......
  • windows内核下的回调钩子整理
    目录windows内核下的回调钩子整理一丶钩子1.1重新初始化钩子1.2进程钩子1.3线程钩子1.4模块回调监控1.5注册表的回调1.6进程保护1.7关机回调二丶未完待续windows内......