• springcloud-网关


    今天主要是总结的SpringCloud中的网关:由于每一个为服务的地址都有可能发生变化,无法直接对外公布这些服务的地址,基于安全和高内聚低耦合等的设计理念,我们有必要将内部系统和外部系统做一个切割
    所谓服务网关:专门处理外部请求的组 件它的主要功能有:

    1. 权限问题统一处理
    2. 数据剪裁和聚合
    3. 简化数据端调用
    4. 可以针对不同的客户端提供不同的网关支持


      在spring cloud中,网关主要有两种实现方式:
    • Zuul
    • Spring Cluod Geteway

    Zuul

    是Netfix公司提供的网关服务
    功能:

    • 权限控制,可以做认证和授权
    • 监控
    • 动态路由
    • 负载均衡
    • 静态资源处理

      Zuul的基本功能都是基于过滤器实现的,它的过滤器有几种不同的类型
    • PRE
    • ROUTING
    • POST
    • ERROR
    eg:

    1.创建项目,添加依赖:

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

    配置:

    server:
      port: 8006
    
    spring:
      application:
        name: zuul
    
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:8001/eureka
    
    zuul:
      routes:
        provider: /fan/**
        openFegin: /feginDemo/**
        # 忽略某一类地址
      ignored-patterns: /**/hello/**
        #忽略某一个服务
      ignored-services: provider
    

    在启动类上添加开启网关代理

    @SpringBootApplication
    @EnableZuulProxy //开启网关代理
    @EnableEurekaClient
    public class ZuuldemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ZuuldemoApplication.class, args);
        }
    
    }
    

    之后我们就可以通过:
    http://localhost:8006/feginDemo/fegin/hello
    访问到在feginDemo服务中的hello接口

    过滤器的eg:
    package com.zuul.zuuldemo.filter;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    
    @Component
    public class PremissFilter extends ZuulFilter {
    
        /**
         * 过滤器类型,权限判断一般是pre
         * @return
         */
        @Override
        public String filterType() {
            return "pre";
        }
    
        /**
         * 过滤器的优先级
         * @return
         */
        @Override
        public int filterOrder() {
            return 0;
        }
    
        /**
         * 是否过滤
         * @return
         */
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        /**
         * 核心的过滤方法逻辑
         * @return 暂时这个返回值无用
         * @throws ZuulException
         */
        @Override
        public Object run() throws ZuulException {
            RequestContext ctx = RequestContext.getCurrentContext();
            /**
             * 获取当前请求
             */
            HttpServletRequest request = ctx.getRequest();
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println(username+password);
            if(!"fan".equals(username) || !"123456".equals(password)){
                ctx.setSendZuulResponse(false);
                ctx.setResponseStatusCode(7001);
                ctx.setResponseBody("请求不合法");
                ctx.addZuulResponseHeader("content-type", "text/html; charset=UTF-8");
            }
            return null;
        }
    }
    

    Gateway

    Gateway的特点:

    • 限流
    • 路径重写
    • 动态路由
    • 集成Spring Cloud DiscoveryClient
    • 集成Hystrix断路器

    与Zuul之间的比较

    • Gateway可以和spring的其他组件更好的融合
    • Zuul不支持长链接
    • Gateway支持限流
    • Gateway是基于Netty来开发的,实现了异步和非阻塞,性能强于Zuul

    eg:

    1.创建springboot集成Gateway模块

    2.配置:

    server:
      port: 8007
    
    spring:
      application:
        name: gatewaydemo
      cloud:
        gateway:
          routes:
            - id: fan   # 路由 ID,唯一
              uri: lb://provider # lb:// 根据服务名称从注册中心获取服务请求地址
              predicates: # 断言(判断条件)
                - Path=/provider/**
          discovery:
            locator:
              enabled: true #开启自动代理
    
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:8001/eureka
    

    注意:

    1.predicates的几种用法:

    • -Path=/product/** # 匹配对应 URL 的请求,将匹配到的请求追加在目标 URI 之后
    • -Query=token, abc. # 匹配请求参数中包含 token 并且其参数值满足正则表达式 abc. 的请求
    • -Method=GET # 匹配任意 GET 请求
    • -After(Before, Between)=2020-02-02T20:20:20.000+08:00[Asia/Shanghai]


      (-和单词之间要加空格)

    2.过滤器:

    主要有两种:

    GatewayFilter:网关过滤器,需要通过 spring.cloud.routes.filters 配置在具体路由下,只作用在当前路由上或通过 spring.cloud.default-filters 配置在全局,作用在所有路由上。

    GlobalFilter:全局过滤器,不需要在配置文件中配置,作用在所有的路由上,最终通过 GatewayFilterAdapter 包装成 GatewayFilterChain 可识别的过滤器,它为请求业务以及路由的 URI 转换为真实业务服务请求地址的核心过滤器,不需要配置系统初始化时加载,并作用在每个路由上。

    过滤器我们之后再细说

  • 相关阅读:
    面向对象OO第15次作业总结
    面向对象OO第9-11次作业总结
    一文讲完最基本的图算法——图的存储、遍历、最短路径、最小生成树、拓扑排序
    字符串匹配问题的KMP算法
    提问回顾与个人总结
    软工结对作业—最长单词链
    软工第1次个人作业
    软工第0次个人作业
    OO最后一次作业
    JSF生存指南P1
  • 原文地址:https://www.cnblogs.com/yjfb/p/12760576.html
Copyright © 2020-2023  润新知