Spring Cloud微服务网关Gateway组件学习笔记

news2024/11/11 6:53:31

目录

网关简介

1. 什么是Spring Cloud Gateway

1.1 核心概念

1.2 工作原理

2. Spring Cloud Gateway快速开始

2.1  环境搭建

2.2集成Nacos

3. 路由断言工厂(Route Predicate Factories)配置

3.1内置断言工厂

3.2自定义

4. 过滤器工厂( GatewayFilter Factories)配置

 4.1Gateway 内置的过滤器工厂

4.2 自定义过滤器工厂

4.3 全局过滤器(Global Filters)配置

4.4 自定义全局过滤器

4.5Reactor Netty 访问日志

4.6Gateway跨域配置(CORS Configuration)

5.gateway整合sentinel流控降级

6. 网关高可用

7.demo源码:springcloudAlibaba: Alibaba微服务学习demo


网关简介

大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?
如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用。

这样的架构,会存在着诸多的问题:
  • 每个业务都会需要鉴权、限流、权限校验、跨域等逻辑,如果每个业务都各自为战,自己造轮子实现一遍,会 很蛋疼,完全可以抽出来,放到一个统一的地方去做。
  • 如果业务量比较简单的话,这种方式前期不会有什么问题,但随着业务越来越复杂,比如淘宝、亚马逊打开一 个页面可能会涉及到数百个微服务协同工作,如果每一个微服务都分配一个域名的话,一方面客户端代码会很难维 护,涉及到数百个域名,另一方面是连接数的瓶颈,想象一下你打开一个APP,通过抓包发现涉及到了数百个远程 调用,这在移动端下会显得非常低效。
  • 后期如果需要对微服务进行重构的话,也会变的非常麻烦,需要客户端配合你一起进行改造,比如商品服务, 随着业务变的越来越复杂,后期需要进行拆分成多个微服务,这个时候对外提供的服务也需要拆分成多个,同时需 要客户端配合你进行改造,非常蛋疼。
上面的这些问题可以借助 API 网关 来解决。
所谓的API网关 ,就是指系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑
可以在这里实现,诸如认证、鉴权、监控、路由转发等等。
添加上 API 网关之后,系统的架构图变成了如下所示:
我们也可以观察下,我们现在的整体架构图:

1. 什么是Spring Cloud Gateway

网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等。 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul1.0。相比 Zuul 来说,Spring Cloud  Gateway 提供更优秀的性能,更强大的有功能。Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。 它不能在传统的 servlet 容器中工作,也不能构 建成 war 包 Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于 Filter 的方式提供网关的基本功能,例如 说安全认证、监控、限流等等。
其他的网关组件:
在SpringCloud微服务体系中,有个 很重要的组件就是网关 ,在1.x版本中都是采用的Zuul网关;但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关替代Zuul, 那就是 SpringCloud Gateway 网上很多地方都说Zuul是阻塞的, Gateway 是非阻塞的,这么说是不严谨的,准确的讲Zuul1.x是阻塞的,而在2.x的版本中,Zuul也是基 于Netty,也是非阻塞的,如果一定要说性能,其实这个真没多大差距。
而官方出过一个测试项目,创建了一个benchmark的测试项目: spring-cloud-gateway-bench ,其中对比了

性能强劲:是第一代网关Zuul的1.6倍

官网文档: https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories
Spring Cloud Gateway 功能特征
  • 基于Spring Framework 5, Project Reactor 和 Spring Boot 2.0 进行构建;
  • 动态路由:能够匹配任何请求属性;
  • 支持路径重写;
  • 集成 Spring Cloud 服务发现功能(Nacos、Eruka);
  • 可集成流控降级功能(Sentinel、Hystrix);
  • 可以对路由指定易于编写的 Predicate(断言)和 Filter(过滤器);

1.1 核心概念

  • 路由(route) 
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和
配置的路由匹配。
  • 断言(predicates) 
Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义
匹配Http request中的任何信息,比如请求头和参数等。
  • 过滤器(Filter) 
SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理

1.2 工作原理

执行流程大体如下:
1. Gateway Client向Gateway Server发送请求
2. 请求首先会被HttpWebHandlerAdapter进行提取组装成网关上下文
3. 然后网关的上下文会传递到DispatcherHandler,它负责将请求分发给RoutePredicateHandlerMapping
4. RoutePredicateHandlerMapping负责路由查找,并根据路由断言判断路由是否可用
5. 如果过断言成功,由FilteringWebHandler创建过滤器链并调用
6. 请求会一次经过PreFilter--微服务--PostFilter的方法,最终返回响应

2. Spring Cloud Gateway快速开始

2.1  环境搭建

1. 引入依赖
 <!--gateway的依赖 springcloud开发-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

注意:会和spring-webmvc的依赖冲突,需要排除spring-webmvc

  2.编写yml配置文件

server:
  port: 8083
spring:
  application:
    name: api-gateway
  cloud:
    #gateway配置
    gateway:
      #路由规则
      routes:
        - id: order_route #路由唯一标识,路由到order
          uri: http://localhost:8022 #需要转发的地址
          #路由断言 规则 用于规则配置
          predicates:
            - Path=/order-serv/**
            # http://localhost:8083/order-serv/order/add 路由到↓
            # http://localhost:8022/order-serv/order/add
          filters:
            - StripPrefix=1  #转发之前去掉第一层
            #http://localhost:8022/order/add

2.2集成Nacos

现在在配置文件中写死了转发路径的地址 前面我们已经分析过地址写死带来的问题 接下来我们从注册中心获取此地址。
1. 引入依赖
   <!--nacos注册发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2. 编写yml配置文件  
简写 :  去掉关于路由的配置,自动寻找服务
server:
  port: 8083
spring:
  application:
    name: api-gateway
  cloud:
    #gateway配置
    gateway:
      discovery:
        locator:
          enabled: true #是否启动自动识别nacos服务
    nacos:
      server-addr: localhost:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public

3.测试

这时候,就发现只要按照网关地址/微服务/接口的格式去访问,就可以得到成功响应。

3. 路由断言工厂(Route Predicate Factories)配置

文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories

作用: 当请求gateway的时候,  使用断言对请求进行匹配, 如果匹配成功就路由转发, 如果匹配失败就返回404
类型:内置,自定义

3.1内置断言工厂

SpringCloud Gateway包括许多内置的断言工厂,所有这些断言都与HTTP请求的不同属性匹配。具体如下:
  • 基于Datetime类型的断言工厂
此类型的断言根据时间做判断,主要有三个:
  • AfterRoutePredicateFactory: 接收一个日期参数,判断请求日期是否晚于指定日期
  • BeforeRoutePredicateFactory: 接收一个日期参数,判断请求日期是否早于指定日期
  • BetweenRoutePredicateFactory: 接收两个日期参数,判断请求日期是否在指定时间段内 ZonedDateTime.now()
‐ After=2019‐12‐31T23:59:59.789+08:00[Asia/Shanghai]
  • 基于远程地址的断言工厂  
RemoteAddrRoutePredicateFactory:接收一个IP地址段,判断请求主机地址是否在地址段中
 ‐ RemoteAddr=192.168.1.1/24
  • 基于Cookie的断言工厂
CookieRoutePredicateFactory:接收两个参数,cookie 名字和一个正则表达式。 判断请求
cookie是否具有给定名称且值与正则表达式匹配。
‐Cookie=chocolate, ch
  • 基于Header的断言工厂
HeaderRoutePredicateFactory:接收两个参数,标题名称和正则表达式。  判断请求Header是否具有给定名称且值与正则表达式匹配。
‐Header=X‐Request‐Id, \d+
  • 基于Host的断言工厂
HostRoutePredicateFactory:接收一个参数,主机名模式。判断请求的Host是否满足匹配规则。
 ‐Host=**.testhost.org
  • 基于Method请求方法的断言工厂
MethodRoutePredicateFactory:接收一个参数,判断请求类型是否跟指定的类型匹配。
‐Method=GET
  • 基于Path请求路径的断言工厂
PathRoutePredicateFactory:接收一个参数,判断请求的URI部分是否满足路径规则。
‐Path=/foo/{segment}
  • 基于Query请求参数的断言工厂
QueryRoutePredicateFactory :接收两个参数,请求param和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。
‐Query=baz, ba.
  • 基于路由权重的断言工厂
WeightRoutePredicateFactory:接收一个[组名,权重], 然后对于同一个组内的路由按照权重转发
routes:
   ‐id: weight_route1
      uri: host1
      predicates:
         ‐Path=/product/**
         ‐Weight=group3, 1
   ‐id: weight_route2
      uri: host2
      predicates:
        ‐Path=/product/**
        ‐Weight= group3, 9

3.2自定义

自定义路由断言工厂需要继承 AbstractRoutePredicateFactory 类,重写 apply 方法的逻辑。在 apply 方法中可以通过 exchange.getRequest() 拿到 ServerHttpRequest 对象,从而可以获取到请求的参数、请求方式、请求头等信息。 
1.必须spring组件 bean
2. 类必须加上 RoutePredicateFactory 作为结尾
3. 必须继承 AbstractRoutePredicateFactory
4. 必须声明静态内部类   声明属性来接收 配置文件中对应的断言的信息
5. 需要结合 shortcutFieldOrder 进行绑定
6. 通过apply进行逻辑判断  true就是匹配成功   false匹配失败
注意: 命名需要以 RoutePredicateFactory 结尾
package com.wang.predicates;

import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory;
import org.springframework.cloud.gateway.handler.predicate.GatewayPredicate;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.server.ServerWebExchange;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * @author 飞
 */
@Component
public class CheckAuthRoutePredicateFactory
        extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactory.Config> {

    public CheckAuthRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList("name");
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange exchange) {

                if(config.getName().equals("xushu")){
                    return true;
                }
                return false;
            }

        };
    }


    // 用于接收配置文件中 断言的信息
    @Validated
    public static class Config {
        private String name;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

}
yml中配置
server:
  port: 8083
spring:
  application:
    name: api-gateway
  cloud:
    #gateway配置
    gateway:
      #路由规则
      routes:
        - id: order_route #路由唯一标识,路由到order
          uri: lb://order-nacos #需要转发的地址 lb:使用naocs本地负载均衡
          #路由断言 规则 用于规则配置
          predicates:
            - Path=/order-nacos/**
            # http://localhost:8083/order-nacosorder/add 路由到↓
            # http://localhost:8022/order-nacos/order/add
#            - After=2000-12-31T23:59:59.789+08:00[Asia/Shanghai]
#            - Header=X-Request-Id,\d+
#            - Method=GET
#            - Query=name,xushu|zhuge
            - CheckAuth=xushu #自定义断言工厂
          filters:
            - StripPrefix=1  #转发之前去掉第一层    #http://localhost:8022/order/add
#            - CheckAuth=xushu #自定义过滤器
            - AddRequestHeader=X-Request-color,red  #添加请求头
#            - PrefixPath=/demo  # 添加前缀 对应微服务需要配置context-path
#            - AddRequestParameter=name,xushu #添加参数 这里的顺序应该与body的顺序保持一
#            - RedirectTo=302, https://www.baidu.com/ #重定向
#            - SetStatus= 404
    # 跨域配置
      globalcors:
        cors-configurations:
          '[/**]': # 允许跨域访问的资源
            allowedOrigins: "*"   #跨域允许来源
            allowedMethods:
              - GET
              - POST
    nacos:
      server-addr: localhost:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public
# 配置sentinel
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
#      scg:
#        fallback: #自定义异常返回,推荐
#          mode: response
#          response-body: "{code:'',message:''}"

4. 过滤器工厂( GatewayFilter Factories)配置

 4.1Gateway 内置的过滤器工厂

Gateway 内置了很多的过滤器工厂,我们通过一些过滤器工厂可以进行一些业务逻辑处理器,比如添加剔除响应头,添加去除参数等

官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gatewayfilter-factories

几个实例:

4.2 自定义过滤器工厂

继承AbstractNameValueGatewayFilterFactory且我们的自定义名称必须要以GatewayFilterFactory结尾并交给spring管理。
package com.wang.filters;

import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.cloud.gateway.support.GatewayToStringStyler;
import org.springframework.cloud.gateway.support.HttpStatusHolder;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.net.URI;
import java.util.Arrays;
import java.util.List;

/**
 * @author 飞
 */
@Component
public class CheckAuthGatewayFilterFactory extends AbstractGatewayFilterFactory<CheckAuthGatewayFilterFactory.Config> {


    public CheckAuthGatewayFilterFactory() {
        super(Config.class);
    }

    public List<String> shortcutFieldOrder() {
        return Arrays.asList("value");
    }

    public GatewayFilter apply(Config config) {
        return new GatewayFilter() {
            @Override
            public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
                //获取name参数
                String name = exchange.getRequest().getQueryParams().getFirst("name");
                if (StringUtils.isNotBlank(name)) {
                    if (config.getValue().equals(name)){
                        return chain.filter(exchange);
                    }else {
                        //如果不等于value就失败
                        //返回404
                        exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
                        return exchange.getResponse().setComplete();
                    }
                }
                //否则正常访问
                return chain.filter(exchange);
            }
        };
    }

    public static class Config {
     private String value;

        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
    }
}
配置自定义的过滤器工厂

 

4.3 全局过滤器(Global Filters)配置

局部过滤器和全局过滤器区别:  
  • 局部:局部针对某个路由, 需要在路由中进行配置
  • 全局:针对所有路由请求, 一旦定义就会投入使用
GlobalFilter 接口和 GatewayFilter 有一样的接口定义,只不过, GlobalFilter 会作用于所有路由。

  •  LoadBalancerClientFilter
LoadBalancerClientFilter 会查看exchange的属性 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 的值(一个
URI),如果该值的scheme是 lb,比如:lb://myservice ,它将会使用Spring Cloud的LoadBalancerClient 来将 myservice 解析成实 际的host和port,并替换掉 ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR 的内容。
其实就是用来整合负载均衡器Ribbon的

4.4 自定义全局过滤器

package com.wang.filters;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 全局过滤器自定义,本例子为日志过滤器
 */
@Component
public class LogFilter implements GlobalFilter {
    Logger log= LoggerFactory.getLogger(this.getClass());

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        log.info(exchange.getRequest().getPath().value());
        return chain.filter(exchange);
    }

}

4.5Reactor Netty 访问日志

要启用 Reactor Netty 访问日志,设置 ­Dreactor.netty.http.server.accessLogEnabled=true 它必须是 Java 系统属性,而不是 Spring Boot 属性。
可以将日志记录系统配置为具有单独的访问日志文件。以下示例创建一个 Logback 配置:
 <appender name="accessLog" class="ch.qos.logback.core.FileAppender">
 <file>access_log.log</file>
 <encoder>
 <pattern>%msg%n</pattern>
</encoder>
</appender>
 <appender name="async" class="ch.qos.logback.classic.AsyncAppender">
 <appender‐ref ref="accessLog" />
</appender>

 <logger name="reactor.netty.http.server.AccessLog" level="INFO" additivity="false">
 <appender‐ref ref="async"/>
 </logger>

4.6Gateway跨域配置(CORS Configuration

  • 通过yml配置的方式
文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#cors-configuration
      globalcors:
        cors-configurations:
          '[/**]': # 允许跨域访问的资源
            allowedOrigins: "*"   #跨域允许来源
            allowedMethods:
              - GET
              - POST
  • 通过java配置的方式
package com.wang.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;


/**
 * @author 飞
 * 跨域配置
 */
@Configuration
public class CorsConfig {
    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");   // 允许的method
        config.addAllowedOrigin("*");   // 允许的来源
        config.addAllowedHeader("*");   // 允许的请求头参数

        // 运行访问的资源
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);

        return new CorsWebFilter(source);
    }
}

5.gateway整合sentinel流控降级

网关作为内部系统外的一层屏障, 对内起到一定的保护作用, 限流便是其中之一. 网关层的限流可以简单地针对不同路由进行限流,  也可针对业务的接口进行限流,或者根据接口的特征分组限流。
文档:https://github.com/alibaba/Sentinel/wiki/%E7%BD%91%E5%85%B3%E9%99%90%E6%B5%81
1. 添加依赖
  <!--sentinel整合gateway  以前的版本adapter-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
        </dependency>

        <!--sentinel的依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
2.添加配置
# 配置sentinel
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
#      scg:
#        fallback: #自定义异常返回,推荐
#          mode: response
#          response-body: "{code:'',message:''}"

Sentinel 1.6.3 引入了网关流控控制台的支持,用户可以直接在 Sentinel 控制台上看 API Gateway 实时的 route 和自 定义 API 分组监控,管理网关规则和 API 分组配置。  
从 1.6.0 版本开始,Sentinel 提供了 Spring Cloud Gateway 的适配模块,可以提供两种资源维度的限流:
  • route 维度:即在 Spring 配置文件中配置的路由条目,资源名为对应的 routeId
  • 自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组

用户可以通过 GatewayRuleManager.loadRules(rules) 手动加载网关规则
自定义异常方式:
1.通过yml
# 配置sentinel
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
#      scg:
#        fallback: #自定义异常返回,推荐
#          mode: response
#          response-body: "{code:'',message:''}"
2.通过GatewayCallbackManager
package com.wang.config;

import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import javax.annotation.PostConstruct;
import java.util.HashMap;


/**
 * @author 飞
 */
@Configuration
public class GatewayConfig {

    @PostConstruct
    public void init(){

         BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
             @Override
             public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {

                 System.out.println(t);

                 HashMap<String,String> map=new HashMap<>();
                 map.put("code",HttpStatus.TOO_MANY_REQUESTS.toString());
                 map.put("message","限流了");

                 // 自定义异常处理
                 return ServerResponse.status(HttpStatus.OK)
                         .contentType(MediaType.APPLICATION_JSON)
                         .body(BodyInserters.fromValue(map));
             }
         };

        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }



}

6. 网关高可用

为了保证 Gateway 的高可用性,可以同时启动多个 Gateway 实例进行负载,在 Gateway 的上游使用 Nginx 或者 F5 进行负载转发以达 到高可用。

 

 

完整的yml:

server:
  port: 8083
spring:
  application:
    name: api-gateway
  cloud:
    #gateway配置
    gateway:
      #路由规则
      routes:
        - id: order_route #路由唯一标识,路由到order
          uri: lb://order-nacos #需要转发的地址 lb:使用naocs本地负载均衡
          #路由断言 规则 用于规则配置
          predicates:
            - Path=/order-nacos/**
            # http://localhost:8083/order-nacosorder/add 路由到↓
            # http://localhost:8022/order-nacos/order/add
#            - After=2000-12-31T23:59:59.789+08:00[Asia/Shanghai]
#            - Header=X-Request-Id,\d+
#            - Method=GET
#            - Query=name,xushu|zhuge
            - CheckAuth=xushu #自定义断言工厂
          filters:
            - StripPrefix=1  #转发之前去掉第一层    #http://localhost:8022/order/add
            - CheckAuth=xushu #自定义过滤器
            - AddRequestHeader=X-Request-color,red  #添加请求头
#            - PrefixPath=/demo  # 添加前缀 对应微服务需要配置context-path
#            - AddRequestParameter=name,xushu #添加参数 这里的顺序应该与body的顺序保持一
#            - RedirectTo=302, https://www.baidu.com/ #重定向
#            - SetStatus= 404
    # 跨域配置
      globalcors:
        cors-configurations:
          '[/**]': # 允许跨域访问的资源
            allowedOrigins: "*"   #跨域允许来源
            allowedMethods:
              - GET
              - POST
    nacos:
      server-addr: localhost:8848
      discovery:
        username: nacos
        password: nacos
        namespace: public
# 配置sentinel
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080
#      scg:
#        fallback: #自定义异常返回,推荐
#          mode: response
#          response-body: "{code:'',message:''}"

7.demo源码:springcloudAlibaba: Alibaba微服务学习demo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/182420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio实现志愿者系统

项目目录一、项目概述二、主要技术三、开发环境四、详细设计1、基础Activity2、活动信息3、成员信息4、百度地图5、Widget组件五、运行演示一、项目概述 本系统采用MVC架构设计&#xff0c;SQLite数据表有用户表、成员表和活动表&#xff0c;有十多个Activity页面。打开应用&a…

123、【回溯算法】leetcode ——491. 递增子序列:unordered_set去重和int数组去重(C++版本)

题目描述 原题描述&#xff1a;491. 递增子序列 解题思路 此题也是子集问题&#xff0c;但和 90.子集II &#xff08;子集问题startIndex去重&#xff09; 的区别在于&#xff1a;&#xff08;1&#xff09;存储结果集判定条件&#xff1b;&#xff08;2&#xff09;输入数据…

Python学习笔记十二之十大经典排序算法

Python学习笔记十二之十大经典排序算法 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;…

zos JESMSGLG 不显示 job steps return codes

zos JESMSGLG 不显示 job steps return codes 在普通学习的时候&#xff0c;SDSF 查看 JCL 结果&#xff0c;可能并不会注意到下面结果有什么差别 但跟公司的大型机出的结果是不同的&#xff0c;就是缺少了 job steps return codes&#xff0c;在 STARTED 和 ENDED 中间应该有…

【Linux】冯诺依曼体系结构和操作系统

目录 一、冯诺依曼体系结构 1.组成 2.各结构特性 二、操作系统 1.概念 2.设计OS的目的 3.如何理解 "管理" 4.系统调用 一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依…

浅析故障电弧探测器在电气防火中的作用与应用介绍

安科瑞 李雨轩【摘要】&#xff1a; 分析了重大电气火灾数据。结合目前国内前沿的电气火灾探测技术&#xff0c;重点介绍了故障电弧式电气火灾监控探测器在火灾预警系统中的重要作用&#xff0c;给出了基于多种探测技术的电气火灾监控系统的实现方案。【关键词】&#xff1a;故…

C++模板初阶小笔记

目录 一.泛型编程 二.函数模板 1.函数模板语法梳理&#xff1a; 2.函数模板的实例化&#xff1a; 3.函数模板的显式实例化&#xff1a; 4.函数模板使用时的注意事项 三.类模板 1.类模板的语法梳理 2.类模板中声明和定义分离的成员函数 一.泛型编程 泛型编程&#xff…

【C++】类和对象---什么是类?

目录1.面向过程和面向对象初步认识2.类的引入2.1使用struct定义类3.类的定义3.1类的两种定义方式&#xff1a;3.2成员变量命名规则的建议3.3成员函数与成员变量定义的位置建议4.类的访问限定符及封装4.1访问限定符4.2封装5.类的作用域6.类的实例化7.类对象模型7.1如何计算类对象…

Kali Linux渗透

Kali Linux是基于Debian的Linux发行版&#xff0c; 设计用于数字取证操作系统。每一季度更新一次。 黑盒测试&#xff0c;它是通过测试来检测每个功能是否都能正常使用。在测试中&#xff0c;把程序看作一个不能打开的黑盒子&#xff0c;在完全不考虑程序内部结构和内部特性的情…

从C语言的使用转换到C++(上篇)——刷题、竞赛篇

文章目录 一、C的基础语法详解 1、1 输入、输出流 1、2 C中头文件的使用 1、3 C中变量的声明 1、4 C中的string类 1、5 C中的引用& 二、C中常见函数使用详解 2、1 排序sort函数详解 2、2 cctype头文件中的函数 三、总结 标题&#xff1a;从C语言的使用转换到C&#xff08;上…

④【Spring】IOC - 基于注解方式 管理bean

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 注解管理Bean一、注解的功能二、四个典型注解三…

day24|491.递增子序列、46.全排列、47.全排列 II

491.递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情况…

源码深度解析Spring Bean的创建,手把手的一步一步带你看源码

在源码深度解析Spring Bean的加载 中对Bean的加载源码进行了梳理,在本文将对bean的创建进行梳理 在doGetBean()方法中createBean()方法准备创建bean,调用源码如下: createBean() 方法的源码如下: 从代码中可以得出,createBean() 方法涉及4个步骤: 步骤一: 根据设置的class属…

[论文笔记]A ConvNet for the 2020s

目录 Abstract Modernizing a ConvNet: a Roadmap 2.1.Training Techniques 2.2. Macro Design 2.3. ResNeXt-ify 2.4. Inverted Bottleneck 2.5. Large Kernel Sizes 2.6. Micro Design 论文&#xff1a;https://arxiv.org/abs/2201.03545 代码&#xff1a;GitHub - f…

扩散模型(Diffusion model)代码详细解读

扩散模型代码详细解读 代码地址&#xff1a;denoising-diffusion-pytorch/denoising_diffusion_pytorch.py at main lucidrains/denoising-diffusion-pytorch (github.com) 前向过程和后向过程的代码都在GaussianDiffusion​这个类中。​ 常见问题解决 Why self-condition…

盒相关样式-----diaplay:block、inline

盒的基本类型 CSS中的盒分为block类型与inline类型&#xff0c;例如&#xff0c; div元素与p元素属于block类型&#xff0c; span元素与a元素属于inline类型。 block类型的盒对应的是html中的块级元素&#xff0c;inline类型的盒对应了html中的行内元素。 行内元素与块级元素…

JavaScript 练手小技巧:键盘事件

键盘事件应该是鼠标事件之外&#xff0c;使用频率最高的 JS 事件了吧&#xff1f; 一般用于全局或者表单。 键盘事件由用户击打键盘触发&#xff0c;主要有keydown、keypress、keyup三个事件。 keydown&#xff1a;按下键盘时触发。Ctrl、Shift、Alt 等和其它按键组合时&…

BCNF与3NF

今天学了一下午这个BCNFBCNFBCNF与3NF3NF3NF&#xff0c;有感而发&#xff0c;特来总结。好像好久不打键盘了&#xff0c;这手好像刚长出来的一样。本文浅显的分析一下两种范式的关系与不同以及判断方法和分解算法&#xff0c;以做总结。 BCNFBCNFBCNF范式的定义如下: 设属性集…

linux 常用指令大全

目录一、基本指令指令基本格式1、ls1.1 ls相关选项2、pwd3、cd4、mkdir4.1、mkdir相关选项5、touch6、cp6.1 cp相关选项7、mv8、rm8.1、rm相关选项9、输出重定向10、cat11、df11.1、df 相关选项12、free12.1、free 相关选项13、head13.1、head相关选项14、tail14.1 tail相关选项…

day13 二叉树 | 144、二叉树的前序遍历 145、二叉树的后序遍历 54、二叉树的中序遍历

二叉树基础 二叉搜索树 二叉搜索树是一个有序树。 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分别为二叉排序树 下面这两棵…