当前位置: 首页 > article >正文

GateWay网关介绍以及整合knife4j聚合所有服务的接口文档

为什么使用网关?

因为多个微服务的端口不同,前端调用不方便,使用网关可以统一接收处理前端的请求,同时方便接口的集中处理,比如鉴权、聚合接口文档、限流等等..

这里使用Knife4j文档工具来实现接口文档:Knife4j框架相关的blog | Knife4j

使用

  1. pom.xml引入依赖:
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Nacos服务发现 -->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置application.yml配置文件:
spring:
  cloud:
    gateway:
      routes:
        - id: backend-user-service
          uri: lb://backend-user-service
          predicates:
            - Path=/api/user/**
        - id: stuoj-backend-question-service
          uri: lb://backend-question-service
          predicates:
            - Path=/api/question/**
        - id: backend-comment-service
          uri: lb://backend-comment-service
          predicates:
            - Path=/api/comment/**
        - id: backend-xxx-service
          uri: lb://backend-xxx-service
          predicates:
            - Path=/api/xxx/**
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: backend-gateway
  main:
    web-application-type: reactive
server:
  port: 9090

聚合接口文档

目的:以一个全局的视角去集中管理里接口文档(Knife4j)

  1. 先给所有的服务引入依赖。同时开启接口文档配置
<dependency>
  <groupId>com.github.xiaoymin</groupId>
  <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
  <version>4.3.0</version>
</dependency>
knife4j:
  enable: true
  1. 给网关服务配置集中管理文档
<dependency>
  <groupId>com.github.xiaoymin</groupId>
  <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
  <version>4.3.0</version>
</dependency>
knife4j:
  gateway:
    # ① 第一个配置,开启gateway聚合组件
    enabled: true
    # ② 第二行配置,设置聚合模式采用discover服务发现的模式
    strategy: discover
    discover:
      # ③ 第三行配置,开启discover模式
      enabled: true
      # ④ 第四行配置,聚合子服务全部为Swagger2规范的文档
      version: swagger2

 之后就可以获得所有服务的文档了:

 网关集中解决跨域

在gateway的模块下创建一个confg配置代码:

package com.stukk.stuojbackendgateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;

import java.util.Arrays;

/**
 * @Author: stukk
 * @Description: 跨域处理
 * @DateTime: 2023-12-07 19:04
 **/
@Configuration
public class CrosConfig {

    @Bean
    public CorsWebFilter corsWebFilter(){
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.setAllowedOriginPatterns(Arrays.asList("*"));
        corsConfiguration.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsWebFilter(source);
    }

}

网关实现权限校验

使用拦截器Filter,拦截路径并判断权限

package com.stukk.stuojbackendgateway.filter;

import cn.hutool.core.text.AntPathMatcher;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;

/**
 * @Author: stukk
 * @Description: 网关拦截器
 * @DateTime: 2023-12-07 19:16
 **/
@Component
public class GlobalAuthFilter implements GlobalFilter {

    private AntPathMatcher antPathMatcher = new AntPathMatcher();

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String path = request.getURI().getPath();
//        判断是不是内部调用,拦截内部调用
        if(antPathMatcher.match("**/inner/**",path)){
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.FORBIDDEN);
            DataBufferFactory dataBufferFactory = response.bufferFactory();
            DataBuffer dataBuffer = dataBufferFactory.wrap("无权限".getBytes(StandardCharsets.UTF_8));
            return response.writeWith(Mono.just(dataBuffer));
        }
        return chain.filter(exchange);
    }
}

http://www.kler.cn/a/161888.html

相关文章:

  • 【再谈设计模式】抽象工厂模式~对象创建的统筹者
  • 红日靶机(七)笔记
  • 【时间之外】IT人求职和创业应知【34】-人和机器人,机器人更可靠
  • 用户裂变数据分析
  • git命令及原理
  • 数据库MySQL索引详解
  • pymol使用
  • EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测
  • TE发布最新TC Policy 3.1
  • 单片机第三季-第四课:STM32下载、MDK和调试器
  • 网站建设app开发小程序制作|企业软件定制
  • 有爱的冬天不再冷——壹基金儿童温暖包抵达富平
  • Kubernetes(K8s)Pod控制器详解-06
  • Java的List中的各种浅拷贝和深拷贝问题
  • 超大规模集成电路设计----FPGA时序模型及FSM的设计(八)
  • 查看端口号是否被占用
  • 指针数组和数组指针作为形式参数
  • SmartChart:一站式数据可视化解决方案
  • SpringBoot:SpringMVC(上)
  • 2023-12-04 AIGC-Stable Diffusion和SadTalker-搭建及使用
  • Linux_CentOS_7.9 VNC安装卸载以及相关配置开机自启动服务简易记录
  • 字符串排序
  • 【华为数据之道学习笔记】3-2 基础数据治理
  • JavaEE之多线程编程(一):基础篇
  • 手机升级到iOS15.8后无法在xcode(14.2)上真机调试
  • ubuntu 14.04的git 错误: gnutls_handshake() failed: Handshake failed