OJ判题测评系统--网关搭建、用户模块

发布时间 2023-12-30 15:43:18作者: Cyrui_13

后端项目初始化

跑通项目

创建一个Spring Cloud项目结构如下
image

application.yml配置如下

# 公共配置文件
# @author cyr
# 
spring:
  application:
    name: cyroj-user-service
  profiles:
    active: dev
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cyroj
    username: root
    password: 123456
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
server:
  address: 0.0.0.0
  port: 8102
  servlet:
    context-path: /api/user
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

写一个Controller接口尝试运行项目

@RestController
@RequestMapping("/")
@Slf4j
public class UserController {

    @GetMapping("/test")
    public String test() {
        return "hello world";
    }
}

成功运行项目!
![image.png]image

上传项目到GitHub:https://blog.csdn.net/Saintmm/article/details/122213995

使用代码生成器 mybatisX生成通用代码,将代码复制到对应的模块中。

nacos注册中心

1、导入服务发现依赖

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、配置nacos

spring:
	cloud:
		nacos:
			discovery:
				server-addr: 127.0.0.1:8848

微服务网关

微服务网关(cyroj-gateway):Gateway 聚合所有的接口,统一接受处理前端的请求
为什么需要网关

  • 所有的服务端口不同,增大了前端调用成本
  • 所有服务是分散的,你可需要集中进行管理、操作,比如集中解决跨域、鉴权、接口文档、服务的路由、接口安全性、流量染色、限流

Gateway 和 Nginx 的区别

Gateway 是应用层网关:会有一定的业务逻辑(比如根据用户信息判断权限)
Nginx 是接入层网关:比如每个请求的日志,通常没有业务逻辑

1、引入依赖

<!-- Spring cloud gateway 网关依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
  <version>3.1.3</version>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  <version>3.1.5</version>
</dependency>

2、配置网关

spring:
  cloud:
    gateway:
      routes:
        - id: cyroj-user-service
          uri: lb://cyroj-user-service
          predicates:
            - Path=/api/user/**
        - id: cyroj-question-service
          uri: lb://cyroj-question-service
          predicates:
            - Path=/api/question/**
        - id: cyroj-judge-service
          uri: lb://cyroj-judge-service
          predicates:
            - Path=/api/judge/**

聚合文档

1、网关引入依赖

<dependency>
  <groupId>com.github.xiaoymin</groupId>
  <artifactId>knife4j-gateway-spring-boot-starter</artifactId>
  <version>4.3.0</version>
</dependency>

2、网关引入配置

knife4j:
  gateway:
    enabled: true
    # 指定服务发现的模式聚合微服务文档,并且是默认`default`分组
    strategy: discover
    discover:
      enabled: true
      # 指定版本号(Swagger2|OpenAPI3)
      version : swagger2
      # 需要排除的微服务(eg:网关服务)

3、其它服务引入依赖

<dependency>
  <groupId>com.github.xiaoymin</groupId>
  <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
  <version>4.3.0</version>
</dependency>

4、其它服务引入配置

knife4j:
  enable: true

访问网关地址即可查看聚合接口文档:http://localhost:8101/doc.html

跨域问题

在网关服务全局解决跨域配置

@Configuration
public class CorsConfig {

    @Bean
    public CorsWebFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.addAllowedMethod("*");
        config.setAllowCredentials(true);
        // todo 实际改为线上真实域名、本地域名
        config.setAllowedOriginPatterns(Arrays.asList("*"));
        config.addAllowedHeader("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
        source.registerCorsConfiguration("/**", config);
        return new CorsWebFilter(source);
    }
}

今日小结

  • 完成了网关模块和用户模块的相关功能,能通过网关地址访问到用户模块的接口。
  • 下一个任务是完成题目模块的相关功能(核心业务)。

今日遇到的问题
1、小错误:java: 警告: 源发行版 17 需要目标发行版 17
解决方法1:下图所示,修改到jdk8即可,缺点是每次启动都会回到jdk17
image

解决方法2:添加以下到pom.xml

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>
</plugins>

2、遇到一个坑:gateway网关访问其它服务出现503错误,即使该服务已经注册到nacos上
原因:网关服务配置文件中使用到了 lb:// 语法,需要引入依赖 loadbalancer 负载均衡,而低版本的网关内嵌的是ribbin 负载均衡。
解决方法:提高网关依赖的版本号,或者引入依赖 loadbalancer。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    <version>3.1.5</version>
</dependency>