SpringCloud_微服务项目搭建


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 文件配置

重点说明

  1. 父项目结构中需要添加如下配置,代表是父项目的结构。
<packaging>pom</packaging>
  1. maven 指定 jdk 的编译版本。
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>
  1. 指定打包跳过测试
<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>  
  1. 多环境配置
<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>

子项目里的配置文件为:

  1. application.yml
  2. application-dev.yml
  3. application-test.yml
  4. application-prod.yml

application.yml 默认的配置为:

# 默认启动项目时加载 application-dev.yml 配置文件里面的信息。
spring:
  profiles:
    active: '@profile.name@'
  1. 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>
  1. 引入 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 文件配置
  1. 替换父项目
<parent>
    <groupId>com.reach24</groupId>
    <artifactId>nacos-parent</artifactId>
    <version>1.0.0</version>
</parent>
  1. 指定打包方式(非必要)
<packaging>jar</packaging>
  1. 添加架包
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

第二步

  • 添加配置文件
  1. application.yml
  2. application-dev.yml
  3. application-test.yml
  4. 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
  1. 引入架包(父项目)
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>${knife4j.version}</version>
</dependency>
  1. 创建配置类
@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();
    }
}
  1. 配置文件添加配置
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
  1. 创建 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">
        &lt;!&ndash; 正在记录的日志文档的路径及文档名 &ndash;&gt;
        <file>${log.path}/debug.log</file>
        &lt;!&ndash;日志文档输出格式&ndash;&gt;
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> &lt;!&ndash; 设置字符集 &ndash;&gt;
        </encoder>
        &lt;!&ndash; 日志记录器的滚动策略,按日期,按大小记录 &ndash;&gt;
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            &lt;!&ndash; 日志归档 &ndash;&gt;
            <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            &lt;!&ndash;日志文档保留天数&ndash;&gt;
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        &lt;!&ndash; 此日志文档只记录debug级别的 &ndash;&gt;
        <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">
        &lt;!&ndash; 正在记录的日志文档的路径及文档名 &ndash;&gt;
        <file>${log.path}/warn.log</file>
        &lt;!&ndash;日志文档输出格式&ndash;&gt;
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> &lt;!&ndash; 此处设置字符集 &ndash;&gt;
        </encoder>
        &lt;!&ndash; 日志记录器的滚动策略,按日期,按大小记录 &ndash;&gt;
        <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>
            &lt;!&ndash;日志文档保留天数&ndash;&gt;
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        &lt;!&ndash; 此日志文档只记录warn级别的 &ndash;&gt;
        <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 文件配置
  1. 替换父项目(同 nacos-provider)

  2. 指定打包方式(非必要)(同 nacos-provider)

  3. 添加架包

<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 文件配置
  1. 替换父项目(同 nacos-provider)
  2. 指定打包方式(非必要)(同 nacos-provider)
  3. 添加架包
<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);
    }
}

文章作者: L Q
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 L Q !
  目录