OJ判题测评系统--网关搭建、用户模块
后端项目初始化
跑通项目
创建一个Spring Cloud项目结构如下
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]
上传项目到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
解决方法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>