SpringCloud_微服务项目搭建
说明
- 项目结构采用 父-子 项目结构。
- 项目框架采用 SpringBoot + SpringCloud 作为基础。
- SpringBoot 版本为:2.6.6。
- SpringCloud 版本为:2021.0.3。
- SpringCloudAlibaba 版本为:2021.1。
- Nacos 作为服务注册和发现的组件。
- nacos-parent 为父结构项目。
- nacos-provider 为服务提供者。
- nacos-consumer 为服务消费者。
- nacos-gateway 为网关项目。
nacos-parent
第一步
- 创建 父-子 项目结构步骤比较简单,这里省略。
第二步
- pom.xml 文件配置
重点说明
- 父项目结构中需要添加如下配置,代表是父项目的结构。
<packaging>pom</packaging>
- maven 指定 jdk 的编译版本。
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
- 指定打包跳过测试
<properties>
<skipTests>true</skipTests>
</properties>
如果是 Spring 项目,对应的方式为:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.18.1</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin>
- 多环境配置
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!-- 注释掉这一块,那么项目打包的时候对应的 dev, test, prod 这些配置文件都会生成 -->
<!-- 不注释掉这一块,那么项目打包的时候只会生成选择的配置文件,如果不选择,那么打的包将没有配置文件 -->
<includes>
<include>application.yml</include>
<include>application-${profile.name}.yml</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.json</include>
<include>**/*.ftl</include>
</includes>
</resource>
</resources>
</build>
<profiles>
<!-- 开发 -->
<profile>
<id>dev</id>
<activation>
<!--默认激活配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.name>dev</profile.name>
</properties>
</profile>
<!-- 测试 -->
<profile>
<id>test</id>
<properties>
<profile.name>test</profile.name>
</properties>
</profile>
<!-- 生产 -->
<profile>
<id>prod</id>
<properties>
<profile.name>prod</profile.name>
</properties>
</profile>
</profiles>
子项目里的配置文件为:
- application.yml
- application-dev.yml
- application-test.yml
- application-prod.yml
application.yml 默认的配置为:
# 默认启动项目时加载 application-dev.yml 配置文件里面的信息。 spring: profiles: active: '@profile.name@'
- maven 单独引入阿里镜像(非必要)
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>https://maven.aliyun.com/repository/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
- 引入 nacos 的架包
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
整体配置
<!-- 项目信息-->
<groupId>com.reach24</groupId>
<artifactId>nacos-parent</artifactId>
<version>1.0.0</version>
<name>nacos-parent</name>
<packaging>pom</packaging>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/>
</parent>
<!--版本管理-->
<properties>
<java.version>1.8</java.version>
<!-- 指定JDK编译版本 -->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring-cloud.version>2021.0.3</spring-cloud.version>
<spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
<knife4j.version>3.0.3</knife4j.version>
<hutool.version>5.8.15</hutool.version>
<fastjson.version>1.2.54</fastjson.version>
<skipTests>true</skipTests>
</properties>
<!--子项目管理-->
<modules>
<module>nacos-provider</module>
<module>nacos-consumer</module>
<module>nacos-gateway</module>
</modules>
<!--引入阿里的镜像-->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>https://maven.aliyun.com/repository/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!--依赖的包-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--knife4j-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!--hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--数据验证框架-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!--json解析包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--StringUtils-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
<!--添加spring-cloud依赖-->
<dependencyManagement>
<dependencies>
<!-- spring-cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud-alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<!-- 配置加载配置项信息-->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!-- 注释掉这一块,那么项目打包的时候对应的 dev, test, prod 这些配置文件都会生成 -->
<!-- 不注释掉这一块,那么项目打包的时候只会生成选择的配置文件,如果不选择,那么打的包将没有配置文件 -->
<includes>
<include>application.yml</include>
<include>application-${profile.name}.yml</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.json</include>
<include>**/*.ftl</include>
</includes>
</resource>
</resources>
</build>
<profiles>
<!-- 开发 -->
<profile>
<id>dev</id>
<activation>
<!--默认激活配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.name>dev</profile.name>
</properties>
</profile>
<!-- 测试 -->
<profile>
<id>test</id>
<properties>
<profile.name>test</profile.name>
</properties>
</profile>
<!-- 生产 -->
<profile>
<id>prod</id>
<properties>
<profile.name>prod</profile.name>
</properties>
</profile>
</profiles>
nacos-provider
第一步
- pom.xml 文件配置
- 替换父项目
<parent>
<groupId>com.reach24</groupId>
<artifactId>nacos-parent</artifactId>
<version>1.0.0</version>
</parent>
- 指定打包方式(非必要)
<packaging>jar</packaging>
- 添加架包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
第二步
- 添加配置文件
- application.yml
- application-dev.yml
- application-test.yml
- application-prod.yml
application.yml
spring: profiles: active: '@profile.name@'
- 配置 nacos
spring:
application:
name: nacos-provider
# nacos 配置
cloud:
nacos:
discovery:
server-addr: xxxx:8848
username: nacos
password: nacos
group: dev
如果多个环境共用一套 Nacos 服务,那么最好添加分组。
第三步
- 使用 knife4j 整合 swagger
- 引入架包(父项目)
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
- 创建配置类
@Configuration
@EnableOpenApi
@EnableKnife4j
// 这里的注解使用的是 @EnableOpenApi和 @EnableKnife4j
public class SwaggerConfig implements WebMvcConfigurer {
/**
* 显示swagger-ui.html文档展示页,还必须注入swagger资源:
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
/**
* swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
*/
@Bean(value = "defaultApi2")
public Docket defaultApi2() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
//此包路径下的类,才生成接口文档
.apis(RequestHandlerSelectors.basePackage("com.xxxx.nacosprovider.controller"))
//加了ApiOperation注解的类,才生成接口文档
.apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
/**
* api文档的详细信息函数,注意这里的注解引用的是哪个
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
//大标题
.title("微服务后台服务API接口文档")
// 版本号
.version("1.0")
// 描述
.description("后台API接口")
// 作者
.contact(new Contact("杭州瑞欧科技互联网事业部","www.xxxx.com","xxxx.com"))
.license("The Apache License, Version 2.0")
.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html")
.build();
}
}
- 配置文件添加配置
server:
port: 9091
servlet:
context-path: /provider
spring:
application:
name: nacos-provider
# springboot 和 Knife4j 兼容
mvc:
pathmatch:
matching-strategy: ant_path_matcher
# 开启 knife4j 增强
knife4j:
enable: true
production: false # 正式环境要配成 true
basic:
enable: true # 开启权限
username: reach24
password: 123456
注意:
- SpringBoot 和 Knife4j 兼容如果使用代码处理,Knife4j 不会解析对应的接口注解。
第四步
- 整合 logback
- 创建 logback-spring.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒;当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<contextName>logback</contextName>
<!-- 定义日志的根目录 -->
<property name="log.path" value="logs"/>
<property name="log.name" value="nacos-provider"/>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg %n"/>
<property name="pattern-color" value="%yellow(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{50}) - %highlight(%msg) %n"/>
<!--1. 输出到控制台-->
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--ThresholdFilter为系统定义的拦截器,例如我们用ThresholdFilter来过滤掉ERROR级别以下的日志不输出到文件中。如果不用记得注释掉,不然你控制台会发现没日志~-->
<!--<filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!--<level>ERROR</level>-->
<!--</filter>-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- 控制台输出-带颜色 -->
<appender name="CONSOLE-WITH-COLOR" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern-color}</pattern>
</encoder>
</appender>
<!--2. 输出到文档-->
<!-- 2.1 level为 DEBUG 日志,时间滚动输出 -->
<!-- <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!– 正在记录的日志文档的路径及文档名 –>
<file>${log.path}/debug.log</file>
<!–日志文档输出格式–>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!– 设置字符集 –>
</encoder>
<!– 日志记录器的滚动策略,按日期,按大小记录 –>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!– 日志归档 –>
<fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!–日志文档保留天数–>
<maxHistory>15</maxHistory>
</rollingPolicy>
<!– 此日志文档只记录debug级别的 –>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>-->
<!-- 2.2 level为 INFO 日志,时间滚动输出 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/${log.name}-info.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/${log.name}-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 2.3 level为 WARN 日志,时间滚动输出 -->
<!--
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!– 正在记录的日志文档的路径及文档名 –>
<file>${log.path}/warn.log</file>
<!–日志文档输出格式–>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!– 此处设置字符集 –>
</encoder>
<!– 日志记录器的滚动策略,按日期,按大小记录 –>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!–日志文档保留天数–>
<maxHistory>15</maxHistory>
</rollingPolicy>
<!– 此日志文档只记录warn级别的 –>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
-->
<!-- 2.4 level为 ERROR 日志,时间滚动输出 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文档的路径及文档名 -->
<file>${log.path}/${log.name}-error.log</file>
<!--日志文档输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/${log.name}-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文档保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文档只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 异步输出 -->
<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="INFO_FILE"/>
</appender>
<appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="ERROR_FILE"/>
</appender>
<!-- 4. 最终的策略 -->
<!-- 4.1 开发环境:打印控制台-->
<springProfile name="dev">
<logger name="com.sdcm.pmp" level="debug"/>
</springProfile>
<root level="info">
<appender-ref ref="CONSOLE-WITH-COLOR"/>
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
</configuration>
第五步
- 定义接口
@Api(tags = "用户数据")
@RestController
@RequestMapping("/api/user")
@Slf4j
public class TUserController {
@ApiOperation(value = "查询 User 信息", notes = "用户信息")
@GetMapping(value = "/show")
public TUser showUser() {
log.info("调用 showUser 方法开始");
return TUser.builder().name("服务提供者").age(1).build();
}
}
nacos-consumer
第一步
- pom.xml 文件配置
替换父项目(同 nacos-provider)
指定打包方式(非必要)(同 nacos-provider)
添加架包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
</dependencies>
第二步
添加配置文件(同 nacos-provider)
配置 nacos(同 nacos-provider)
第三步
- 使用 knife4j 整合 swagger (同 nacos-provider)
第四步
- 整合 logback(同 nacos-provider)
第五步
- 配置 Feign
spring:
application:
name: nacos-consumer
# 服务提供者地址配置
provider:
url: nacos-provider
# feign-okhttp 配置
feign:
okhttp:
enabled: true # 使用 okhttp 请求
httpclient:
max-connections: 200 # 最大链接数
max-connections-per-route: 50 # 单个路径最大链接数
第六步
- 声明消费端接口
/**
* 定义和 TuserController 相关的接口
*/
@Component
@FeignClient(name = "${spring.provider.url}", path = "/provider/api/user", contextid = "userClient" )
public interface TUserClient {
@GetMapping(value = "/show")
TUser showUser();
}
- 如果接口类中使用了 @FeignClient 注解中的 path,那么接口类就不能使用 @RequestMapping 注解。
- contextid 用来指定接口的唯一性。
第七步
- 定义消费接口
@Api(tags = "消费者-用户数据")
@RestController
@RequestMapping("/api/user")
@Slf4j
public class TUserConsumerController {
@Resource
private TUserClient tUserClient;
@ApiOperation(value = "查询 User 信息", notes = "用户信息")
@GetMapping(value = "/show")
public TUser showUser() {
log.info("消费者调用 showUser 方法开始");
return tUserClient.showUser();
}
}
nacos-gateway
第一步
- pom.xml 文件配置
- 替换父项目(同 nacos-provider)
- 指定打包方式(非必要)(同 nacos-provider)
- 添加架包
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
</dependencies>
第二步
添加配置文件(同 nacos-provider)
配置 nacos(同 nacos-provider)
第三步
- 整合 logback(同 nacos-provider)
第四步
- 配置路由规则
spring:
application:
name: nacos-gateway
# gateway 配置
cloud:
gateway:
discovery:
locator:
enabled: true # 让 gateway 可以发现 nacos 中的为服务
routes: # 路由数组
- id: nacos-provider # 路由ID
uri: lb://nacos-provider # lb 指从 nacos 中按照名称获取微服务
predicates: # 路由转发需要满足的条件
- Path=/provider/** # 当请求路径满足后才进行转发
- id: nacos-consumer # 路由ID
uri: lb://nacos-consumer # lb 指从 nacos 中按照名称获取微服务
predicates: # 路由转发需要满足的条件
- Path=/consumer/** # 当请求路径满足后才进行转发
第五步
- 配置跨域
/**
* 跨域的配置
*/
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsWebFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", corsConfiguration);
return new CorsWebFilter(source);
}
}