• springCloud_Gateway服务网关


    文章目录

    Gateway服务网关

    在这里插入图片描述

    在SpringCloud中网关的实现包括两种:
    ① gateway
    ② zuul
    zuul是基于servlet的实现,属于阻塞式编程,而springcloudgateway则是基于spring5中提供的webflux,属于响应式编程的实现,具备更好的性能.
    
    • 1
    • 2
    • 3
    • 4
    gateway快速入门
    1 创建新的module,引入SpringCloudGetaway的依赖和nacos的服务发现依赖
    	
        
        	org.springframework.cloud
        	spring-cloud-starter-gateway
        
        
        
        	com.alibaba.cloud
        	spring-cloud-starter-alibaba-nacos-discovery
        
    2 编写路由配置及nacos地址
    	server:
    	  port: 10010
    	spring:
    	  application:
    	    name: gateway
    	  cloud:
    	    nacos:
    	      server-addr: nacos:8848 # nacos地址
    	    gateway:
    	      routes:
    	        - id: user-service # 路由标示,必须唯一
    	          uri: lb://userservice # 路由的目标地址
    	          predicates: # 路由断言,判断请求是否符合规则
    	            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
    	        - id: order-service
    	          uri: lb://orderservice
    	          predicates:
    	            - Path=/order/**
    	      default-filters:
    	        - AddRequestHeader=Truth,Itcast is freaking awesome!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    在这里插入图片描述

    断言工厂
    读取断言规则
    例如: Path=/user/** 是按照路径匹配,这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory类来处理的.
    
    • 1
    • 2

    在这里插入图片描述

    过滤器工厂

    在这里插入图片描述

    路由过滤器(GatewayFilter) 是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应处理.
    过滤器的作用?
        ① 对路由的请求或响应做加工处理,比如请求头
        ② 配置在路由下的过滤器只对当前路由的请求生效
    default-filters的作用?
        ① 对所有路由都生效的过滤器
        
    spring:
      application:
        name: gateway
      cloud:
        nacos:
          server-addr: localhost:8848 # nacos地址
        gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
          default-filters: # 默认过滤器,会对所有的路由请求都生效
            - AddRequestHeader=Truth, Itcast is freaking awesome! # 添加请求头
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    全局过滤器(GlobalFilter)
    全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样
    区别在于GatewayFilter通过配置定义,处理逻辑是固定的,而GlobalFilter的逻辑需要自己写代码实现.
    
    全局过滤的作用?
        对所有路由都生效的过滤器,并且可以自定义处理逻辑
    实现全局过滤的步骤?
        ① 实现GlobalFilter接口
        ② 添加@Order注解或者实现Ordered 接口
        ③ 编写处理逻辑
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    自定义过滤器 实现GlobalFilter接口
    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.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;
    
    // @Order(-1)
    @Component
    public class AuthorizeFilter implements GlobalFilter, Ordered {
        @Override
        public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            // 1.获取请求参数
            ServerHttpRequest request = exchange.getRequest();
            MultiValueMap params = request.getQueryParams();
            // 2.获取参数中的 authorization 参数
            String auth = params.getFirst("authorization");
            // 3.判断参数值是否等于 admin
            if ("admin".equals(auth)) {
                // 4.是,放行
                return chain.filter(exchange);
            }
            // 5.否,拦截
            // 5.1.设置状态码
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            // 5.2.拦截请求
            return exchange.getResponse().setComplete();
        }
    
        @Override
        public int getOrder() {
            return -1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    过滤器的执行顺序
    路由过滤器、defaultFilter、全局过滤器的执行顺序?
        ① order值越小,优先级越高
        ② 当order值一样时,顺序是defaultFilter最先,然后是局部的路由过滤器,最后是全局的过滤器.
    
    • 1
    • 2
    • 3
    网关的跨域问题处理
    跨域: 域名不一致就是跨域主要包括
    	① 域名不同: www.taobao.com和www.jd.com
    	② 域名相同,端口不同:localhost:8080和localhost:8081
    跨域问题:浏览器禁止请求的发起者和服务端发生跨域ajax请求,请求被浏览器拦截的问题
    解决方案:CORS
    
    • 1
    • 2
    • 3
    • 4
    • 5
    网关处理跨域采用的同样是CORS方案,并且只需要配置即可实现
    spring:  
    	cloud:    
    		gateway:    
    			globalcors: # 全局的跨域处理      
    				add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题        
    				corsConfigurations:
    			'[/**]':            
    				allowedOrigins: # 允许哪些网站的跨域请求               
    					- "http://localhost:8090" 
    					- "http://www.leyou.com" 
    				allowedMethods: # 允许的跨域ajax的请求方式           
    					- "GET"            
    					- "POST"      
    					- "DELETE"      
    					- "PUT"          
    					- "OPTIONS"      
    				allowedHeaders: "*" # 允许在请求中携带的头信息           
    					allowCredentials: true # 是否允许携带cookie          
    				maxAge: 360000 # 这次跨域检测的有效期
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    需要项目代码联系博主.

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    Hive面试题
    Java开发之高并发必备篇(五)——线程安全操作之synchronized
    GaussDB数据库SQL系列-行列转换
    golang GC
    matlab如何遍历文件夹及子文件夹下的所有文件
    VUE后台管理系统模板
    Android中的缓存策略:LruCache和DiskLruCache
    字符串移位包含问题
    读书笔记之C Primer Plus 5
    C专家编程 第6章 运动的诗章:运行时数据结构 6.1 a.out及其传说
  • 原文地址:https://blog.csdn.net/m0_67392661/article/details/126116258