ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

网关_订单

2021-11-13 09:32:46  阅读:153  来源: 互联网

标签:网关 服务 跨域 gateway 订单 鉴权 路由


一、网关

作用

​ 1、可以解决跨域请求

​ 2、之前调不同的微服务都是通过不同的网络地址去获取,现在可以通过一个网络地址,去调用不同的服务。

网关核心概念

​ 1、路由:由ID、目标URL、一组断言、过滤器Filter

​ 2、断言:提前写好的条件

​ 3、过滤器:主要就两种,Gateway Filter网关过滤器、Global Filter全局过滤器

执行流程

​ 1、客户端发出请求

​ 2、根据请求找路由:Handler Mapping中找到与请求相匹配的路由

​ 3、将请求通过过滤器发送到实际服务:Web handler通过指定的过滤器将请求发送到实际的服务

特点:

​ 1、依赖于netty和WebFlux

​ 2、网关不能部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行


二、搭建Gateway网关服务

依赖:

​ 网关的依赖 spring-cloud-starter-gateway

​ 注册中心的依赖 spring-cloud-starter-alibaba-nacos-discovery(因为这个网关服务也需要注册到服务中心去)

配置文件(主要分为两种:自动生成路由和自己设置路由)

​ 1、自动生成路由:

gateway:
      discovery:
        locator:
          enabled: true 
  # gateway可以发现nacos中的微服务,并自动生成转发路由

三、配置路由和跨域问题的解决

路由配置

组成:

​ 1、id:配置的唯一标识

​ 2、uri:指向被转发到的微服务的地址

​ 3、predicates断言:条件判断,断言为true才会执行路由

​ 4、Path路径:路径形式的断言,匹配这个路径才会放行

实例

#spring:
#  cloud:
#    gateway:
      routes:
      - id: service-edu
        uri: http://localhost:8110
        predicates:
        - Path=/user/**

注意:id前面的横线 -

配置这个路由routes点进去看源码,实际上就是一个list集合,所以这里的横向 - 表示的是创建一个对象设置到List集合中。一个 -  就表示数组中的一个元素。同理断言predicates也是一组list集合,所以也需要在前面配置一个横线。

结合实例理解路由的配置

如果访问 http://localhost:9110/api/edu/teacher/list
这个靠网关9110是无法处理这个请求的,还是要交给真正的微服务的地址去处理。
这里最后会将路径进行一个拼接,将前面的网关9110替换成8110,后面再加上访问的地址/api/edu/teacher/list。

负载均衡

怎么做:将uri中的地址修改成注册中心中的微服务地址,网关将从nacos中按照服务名称获取微服务。

1、原来的写法:这么做会把微服务的地址写死了

uri: http://localhost:8110

2、负载均衡的写法:因为所有的服务都写在service-edu中,即使是写在service-base中的服务也可以通过feign远程调用。

uri: lb://service-edu

跨域问题的优化

1、跨域配置:这里写了一个配置类,相当于之前的配置文件的作用。在这个配置文件中,进行了允许跨域访问的相关配置。这里还通过注解@Bean将这个对象注入到容器中。

@Component
public class GlobalGatewayConfig {
    //将gateway提供的跨域filter对象注入到容器中
    @Bean
    public CorsWebFilter corsWebFilter(){

        UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
        //一个路径的跨域配置
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);//是否允许携带cookie
        config.addAllowedHeader("*");//请求头
        config.addAllowedMethod("*");//所有请求方式
        config.addAllowedOrigin("*");//所有服务器
        corsConfigurationSource.registerCorsConfiguration("/**" , config);
        return new CorsWebFilter(corsConfigurationSource);
    }
}

2、删除之前后端关于跨域的注解

以前写的@CrossOrigin全部删掉,以后就不用写了。

3、前端的配置修改:在前端中指定访问网关的地址,也是都从访问网关开始,都把请求交给网关处理

四、微服务网关鉴权

鉴权的定义

​ 验证用户是否拥有访问系统的权利,以前采取的方式主要是密码登录,后面改进为通过token进行验证。

统一鉴权的意义

​ 如果有很多独立的微服务都需要进行鉴权验证,那么肯定就有必要整理一下。不然都话,每个要进行鉴权验证的接口我都要整理一下,很麻烦。抽取出来,谁需要鉴权的,在路径中添加一个auth即可,方便的很。

怎么做才能实现统一鉴权

​ 一般在后端需要鉴权的接口路径中添加一层路径【/auth】

​ 判断如果请求路径中包含

/api/**/auth/**    -- 需要鉴权

核心:过滤器GlobalAuthFilter

常见错误

1、web依赖和 gateway的 webflux依赖冲突:办法:排除:web场景启动器

2、缺少 HttpServletRequest类:办法:单独引入servlet-api

为什么会缺少这个类呢?因为上一步中不是排除了web的场景启动器吗,连带把这个类也弄走了,所以需要单独再引入一下。

3、数据库相关;办法:启动类中排除数据库连接池自动配置

原因:由于service-base的依赖中有数据库相关的依赖,导致会初始化数据库连接池

标签:网关,服务,跨域,gateway,订单,鉴权,路由
来源: https://blog.csdn.net/ZUCC1717/article/details/121300121

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有