gateway gateway de roteamento, alternativa ao zuul

zuul1 low, zuul2 还没长大呢,不敢用。
gateway 基于netty, spring flux, reactor 异步非阻塞, 快呀。
与spring良好整合, spring社区的呢。官方推荐。

https://spring.io/projects/spring-cloud-gateway


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

característica

O componente de programação reativa reator-netty no Webflux usado pelo Spring Cloud Gateway usa a estrutura de comunicação Netty na parte inferior.
Insira a descrição da imagem aqui

1. 基于spring5.0 reactor, boot2.x
2. 能够转发所有请求的路由 反向代理
3. 路由支持断言和过滤器
4. 熔断
5. 服务发现 客户端
6. 简单断言和过滤器
7. 能限制请求
8. 根据路径转发

日志监控.. 流量控制.. 鉴权..

Onde está o gateway no microsserviço, por trás do nginx.


Os três objetos principais do gateway

Rota

O roteamento é o módulo básico para a construção de um gateway. Consiste em ID, URI de destino, uma série de asserções e filtros. Se a asserção for verdadeira, a rota é correspondida.

route --> 根据规则将请求转发到对应的微服务。

Predicado

Consulte o java.util.function.Predicate de java 8. Os desenvolvedores podem corresponder a todo o conteúdo na solicitação HTTP (como cabeçalhos ou parâmetros de solicitação) e encaminhar se a solicitação corresponder à asserção.

可以设置对应的规则来设置断言。符合规则转发请求, 不符合可以做出对应处理。

Filtro

Refere-se a uma instância de GatewayFilter na estrutura do Spring. Usando filtros, você pode modificar a solicitação antes ou depois de ela ser roteada.

java web 中的过滤器, 过滤器链, 懂吧。

Começando

pom

        <!--新增gateway 需要排除web和actuator   2.2.1.RELEASE -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

Vários caminhos de roteamento podem ser configurados nas rotas. '

Use yaml para configurar o roteamento

# gateway --> 路由 断言 过滤器
server:
  port: 9527

# 网关配置
spring:
  application:
    name: cloud-gateway

  cloud:
    gateway:

      discovery:
        locator:
          enabled: true # 开启从注册中心获取动态路由的功能。利用微服务名进行路由。

      routes:
        - id: payment_routh1 # 路由的id 没有固定规则但是要求唯一 配合服务名称
          # uri: http://localhost:8001 # 匹配后提供服务的路由地址
          uri: lb://cloud-payment-service # 根据服务名进行路由
          predicates:
          - Path=/payment/get/** # 路径像匹配的进行断言~

Configure o roteamento usando beans

package top.bitqian.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;

/**
 * 网关规则bean配置
 * @author echo lovely
 * @date 2020/12/12 16:53
 */

@Configuration
public class GatewayConfig {
    
    

    // 可以配置多个bean, 根据规则跳转到不同的url
    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder routeBuilder) {
    
    

        RouteLocatorBuilder.Builder routes = routeBuilder.routes();

        routes.route("adorable1",
                r -> r.path("/team"). // localhost:9527/team
                        uri("https://github.com/team")). // to team
                        build();

        return routes.build();
    }

    @Bean
    public RouteLocator customerRouteLocator1(RouteLocatorBuilder routeBuilder) {
    
    

        RouteLocatorBuilder.Builder routes = routeBuilder.routes();

        routes.route("adorable2",
                r -> r.path("/explore"). // localhost:9527/explore
                        uri("https://github.com/explore")). // to  explore
                        build();

        return routes.build();
    }

}

Configuração de asserção

https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories

Cookie de suporte, cabeçalho de solicitação, método de solicitação, parâmetro de solicitação, tempo de solicitação ...

Você pode usar curl localmente para testar, como linux curl localhost: 8080

# gateway --> 路由 断言 过滤器
server:
  port: 9527

# 网关配置
spring:
  application:
    name: cloud-gateway

  cloud:
    gateway:

      discovery:
        locator:
          enabled: true # 开启从注册中心获取动态路由的功能。利用微服务名进行路由。

      routes:
        - id: payment_routh1 # 路由的id 没有固定规则但是要求唯一 配合服务名称
          # uri: http://localhost:8001 # 匹配后提供服务的路由地址
          uri: lb://cloud-payment-service # 根据服务名进行路由
          predicates:
          - Path=/payment/get/** # 路径像匹配的进行断言~

        - id: payment_routh2 # 路由的id 没有固定规则但是要求唯一 配合服务名称
          # uri: http://localhost:8001 # 匹配后提供服务的路由地址
          uri: lb://cloud-payment-service
          predicates:
          - Path=/payment/lb/** # 路径像匹配的进行断言~
            # 新增断言配置
            # https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1.RELEASE/reference/html/#gateway-request-predicates-factories
          - After=2020-12-13T11:37:03.340+08:00[Asia/Shanghai] # 必须在这个时间之后
          # - Cookie=username, adorable # 测试      curl --cookie "username=adorable" localhost:9527/payment/lb
          # - Header=X-Request-Id, \d+ # 属性必须是整数 curl --header "X-Request-Id:99" localhost:9527/payment/lb
          # - Query=age  # curl localhost:9527/payment/lb?age=19
          # - Host=**.adorable.cn,**.adorable.top # curl localhost:9527/payment/lb -H "host:bitqian.lovely.adorable.top"


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

Suporta filtros personalizados

package top.bitqian.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.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

/**
 * 网关自定义过滤器配置
 * 官方有两种过滤器, 单一的和全局的。
 * @author echo lovely
 * @date 2020/12/13 14:37
 */

@Component
@Slf4j
public class MyGatewayFilter implements GlobalFilter, Ordered {
    
     // global filter...

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

        log.info("=======================gateway进来了======" + new Date());

        // 获取到请求中的参数
        String username = exchange.getRequest().getQueryParams().getFirst("username");

        if (username == null) {
    
    
            log.info("/(ㄒoㄒ)/~~ 用户名为空了,非法的用户名称......");

            // 406 不被服务器接受的
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            // 返回mono
            return exchange.getResponse().setComplete();
        }

        // 放行
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
    
    
        // 数字越小, 越优先
        return 0;
    }
}

Resumindo, como um gateway distribuído, a arquitetura de microsserviço tem funções poderosas em termos de segurança, limitação de corrente e registro.

Acho que você gosta

Origin blog.csdn.net/qq_44783283/article/details/111239678
Recomendado
Clasificación