SpringCloud之服务网关(总体第五篇)

SpringCloud之服务网关(总体第五篇),第1张

上一篇笔记中已经学习到了服务降级,服务注册等内容,接下来学习服务网关。

一、Gateway (一)Gateway是什么 1、概念

可以看看zuul:https://github.com/Netflix/zuul/wiki




2、能干嘛


3、一些核心概念 (1)核心概念
  • 路由(router)路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Fliter组成。如果路由断言为真,说明请求URL和配置路由匹配
  • 断言(Predicate)Spring Cloud GateWay中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud GateWay的断言函数允许开发者迁移定义匹配来自于HttpRequest中任何信息比如请求头和参数。
  • 过滤器(Filter)一个标准的SpringWebFilter。Spring Cloud GateWay中的Fliter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。
(2)zuul1和Gateway底层模型
  • zuul
  • Gateway
  • 两者的区别
  • 传统的servlet2.X

  • Gateway是采用WebFlux
4、Gateway工作流程
  • 路由(router)路由信息的组成
  • 断言(Predicate)
  • 过滤器(Filter)

总体流程

  • 看看官网的

(二)搭建项目练习 1、搭建项目 1)建一个9527模块
  • 将model
  • 导依赖

        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
        
            cn.mldn
            cloud-api-commons
            1.0-SNAPSHOT
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

仔细看这次是没有web的依赖和actuator依赖的,因为我们的Gateway不用这个。

  • 写yml
server:
  port: 9527
spring:
  application:
    name: cloud-gateway
eureka:
  instance:
    hostname: cloud-gateway-service
    instance-id: gateway9527
  #服务提供者provider注册进Eureka服务列表
  client:
    service-url:
      register-with-eureka: true
      fethc-registry: true
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka
  • 主启动
2)对相关模块进行路由配置 (1)9527网关如何做路由映射呢
  • 只有在路由,断言,过滤器为true后则转发过去。

    只要别人想攻击你,外面有一层挡着的。
(2)payment8001配置网关(外面套一层9527)

配置9527新增网关

server:
  port: 9527
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      routes:
        - id: payment_routh # payment_routh 路由的ID,没有固定规则但要求唯一,建议配置服务器
          uri: http://localhost:8001
          predicates:
            - Path=/payment/get/** # 断言,路径相匹配的进行路由
        - id: payment_routh2 # payment_routh2路由id,没有固定规则但要求唯一,建服务器名
          uri: http://localhost:8001
          predicates:
            - Path=/payment/create/** #断言,匹配相路径匹配的进行匹配


eureka:
  instance:
    hostname: cloud-gateway-service
    instance-id: gateway9527
  #服务提供者provider注册进Eureka服务列表
  client:
    service-url:
      register-with-eureka: true
      fethc-registry: true
      defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka

routes:就是我们这次配置的。

(4)启动测试


  • 用9527测试
3)路由配置的方式

其实感觉说到了配置路由我又感觉我在学习Vue框架了

  • 这里添加也是可以的,但是要用其他测试
(1)第一种方式

就刚刚学习的那种。

(2)用Bean方式配置
@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
        RouteLocatorBuilder.Builder builder1 = builder.routes();
        builder1.route("path_routh_id",r -> r.path("/hello").uri("https://www.baidu.com")).build();
        builder1.route("path_routh_id2",r -> r.path("/hello2").uri("http://localhost:8001/payment/get/2")).build();
        return builder1.build();
    }
}

4)Gateway配置动态路由 (1)存在的问题分析

上面配置方式中存在的问题在现实中是不可能应用的,因为我们给写死了,肯定要动态变化的才可能。【我们之前的是负载均衡,要是我们的微服务很多的话,手动配置不太现实】

(2)进行配置处理
  • 首先启动这几个8001,8002,9527,7001
  • 配置9527yml

5)Gateway的Predicate(断言)
  • 启动9527就会发现这个

    其实就是和mysql查询的差不多的作用。

(1)After Route Predicate
  • 在什么什么之后

  • 获取当前时间

    我们的目的是在多少多少时间后访问这个请求才可以放行

  • 进行配置

(2)Before Route Predicate

这个就不用讲了吧

(3)Between Route Predicate

逗号隔开即可。

(4)Cookie Route Predicate
  • 就是带cookie允许你访问【而且还可以要求带什么样子的cookie可以访问】

    逗号后面是要什么样子的cookie

  • 先看看配置内容

    比如这里就要带username这个key,zzyy这个value。

  • 这里使用cur模拟cookie进行处理

    这样访问是会报404
    带上cookie

(5)Header Route Predicate
  • 要带一个http的请求头

  • 进行测试
(6)还有一些其他的


要用的时候再学习。

6)Filter

(1)再次介绍


  • 单一的有31种
  • 全局的有10个
(2)常用的Gateway


具体的可以去官网看看,这个不是最重要的,下面自定义的才是最重要的。

(3)自定义Filter
  • 首先实现如下接口

  • 能干嘛:统一网关啊,全局日志。

  • 案例

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Date;

@Configuration
@Slf4j
public class MyLogGatewayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("全局过滤器执行" + new Date());
        String uname = exchange.getRequest().getQueryParams().getFirst("uname");
        if (uname == null ) {
            log.info("有问题");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        //让他继续走下去
        return chain.filter(exchange);
    }

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

  • 过滤器还是很好理解的,比较简单。

    只要你带上这个uname就可以,其他的就不行。
二、Zuul

由于暂时时间也比较紧张,暂时就把Zuul放一放,有需要的朋友可以自己去找资源学习。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/719982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存