springcloud alibaba(二) 项目搭建

提示:文章如有错误的地方请指出,以免误人子弟!


提示:以下是本篇文章正文内容,下面案例可供参考

springcloud alibaba 对应版本组件说明

一、创建项目文件夹

首先没有安装组件的先安装springcloud alibaba(一) 组件安装,然后创建一个空的文件夹,然后用idea打开。
在这里插入图片描述


二、创建parent

用于管理项目中通用的各种插件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
pom 文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wwwh.onlyone.parent</groupId>
    <artifactId>onlyone-parent</artifactId>
    <version>1.0.0</version>
    <name>onlyone-parent</name>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <bootstrap.version>3.0.3</bootstrap.version>
        <cloud-alibaba.version>2021.1</cloud-alibaba.version>
        <boot.version>2.4.2</boot.version>
        <gateway.version>3.0.5</gateway.version>
        <sentinel-datasource-nacos.vsersion>1.8.2</sentinel-datasource-nacos.vsersion>
        <mysql.version>8.0.26</mysql.version>
        <mybatis.version>2.2.0</mybatis.version>
        <druid.version>1.2.6</druid.version>
        <redis.version>2.5.5</redis.version>
        <pagehelper.version>1.3.1</pagehelper.version>
        <fastjson.version>1.2.78</fastjson.version>
        <activiti.version>6.0.0</activiti.version>
        <sftp.version>0.1.54</sftp.version>
        <easyexcel.version>2.2.11</easyexcel.version>
        <lombok.version>1.18.20</lombok.version>
        <commons-lang3.version>3.12.0</commons-lang3.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--
                spring-cloud-dependencies 2020.0.0 默认不在加载bootstrap 配置文件,
                如果项目中要用bootstrap 配置文件 需要手动添加spring-cloud-starter-bootstrap
                依赖,不然启动项目会报错的。
            -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-bootstrap</artifactId>
                <version>${bootstrap.version}</version>
            </dependency>
            <!--spring-cloud-alibaba 依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springboot 依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- sentinel持久化到nacos -->
            <dependency>
                <groupId>com.alibaba.csp</groupId>
                <artifactId>sentinel-datasource-nacos</artifactId>
                <version>${sentinel-datasource-nacos.vsersion}</version>
            </dependency>
            <!-- spring-cloud-starter-gateway -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
                <version>${gateway.version}</version>
            </dependency>
            <!-- mybatis -->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>
            <!-- mysql -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <!-- 数据源 druid-spring-boot-starter -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <!-- spring-boot-starter-data-redis -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
                <version>${redis.version}</version>
            </dependency>
            <!--  pagehelper  -->
            <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>${pagehelper.version}</version>
            </dependency>
            <!-- activiti-->
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-spring-boot-starter-basic</artifactId>
                <version>${activiti.version}</version>
            </dependency>
            <!-- spring-boot-starter-data-jpa -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <!-- Apache工具组件 xftp-->
            <dependency>
                <groupId>com.jcraft</groupId>
                <artifactId>jsch</artifactId>
                <version>${sftp.version}</version>
            </dependency>
            <!-- fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <!-- easyExcel -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>${easyexcel.version}</version>
            </dependency>
            <!-- lombok -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${commons-lang3.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

        <build>
            <plugins>
                <plugin>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok-maven-plugin</artifactId>
                    <version>1.18.20.0</version>
                </plugin>
                <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>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>

</project>

三、创建common

依然是在最外层的onlyone文件夹创建,不在parent上面创建,其他模块创建也是一样。
在这里插入图片描述
这个模块用来存放一些其他模块共用的实体类,共用方法等,因为本项目服务间的调用,用的dubbo插件,所以多了个service文件夹(共用的接口)。

common-pom内容:(需要注意的是<parent> 标签的内容是parent模块的pom信息,其他模块也一样)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>onlyone-parent</artifactId>
        <groupId>com.wwwh.onlyone.parent</groupId>
        <version>1.0.0</version>
    </parent>
    <groupId>com.wwwh.onlyoa.common</groupId>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>onlyone-common</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <name>onlyone-common</name>
    <description>公共组件</description>

    <dependencies>
        <!--  pagehelper  -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>
        <!-- easyExcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.2</version>
                <configuration>
                    <mainClass>com.wwwh.onlyone.common</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
                <version>1.18.20.0</version>
            </plugin>
            <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>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

四、创建provider

该模块用于服务数据提供。
在这里插入图片描述
这里parent与common一样,并且将common模块引入,就可以使用共用方法了。
接着引入nacos包spring-cloud-starter-alibaba-nacos-discovery,将application.yml配置内容放到nacos的包spring-cloud-starter-alibaba-nacos-config,douuo包暴露提供方的数据方法spring-cloud-starter-dubbo,bootstrap.yml 在cloud alibaba 2020.0.0 默认不在加载bootstrap 配置文件,要用bootstrap 配置文件 需要手动添加spring-cloud-starter-bootstrap依赖,不然启动项目会报错的,以及一些常规的插件包。

provider-pom 内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>onlyone-parent</artifactId>
        <groupId>com.wwwh.onlyone.parent</groupId>
        <version>1.0.0</version>
    </parent>
    <groupId>com.wwwh.onlyone.registry</groupId>
    <artifactId>onlyone-registry</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <name>onlyone-registry</name>
    <description>注册中心</description>

    <dependencies>
        <!-- 公共模块 -->
        <dependency>
            <groupId>com.wwwh.onlyoa.common</groupId>
            <artifactId>onlyone-common</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- nacos 注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--
            spring-cloud-dependencies 2020.0.0 默认不在加载bootstrap 配置文件,
            如果项目中要用bootstrap 配置文件 需要手动添加spring-cloud-starter-bootstrap
            依赖,不然启动项目会报错的。
         -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-cloud-commons</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-cloud-context</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--nacos 配置 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- spring-cloud-dubbo -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <!-- spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--  pagehelper  -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>asm</artifactId>
                    <groupId>org.ow2.asm</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.2</version>
                <configuration>
                    <mainClass>com.wwwh.onlyone.registry</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
                <version>1.18.20.0</version>
            </plugin>
            <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>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

接下来是yml 配置内容
在这里插入图片描述

  1. application.yml 用于选择配置文件的环境。
spring:
  profiles:
    #开发环境
    active: dev
  1. bootstrap.yml 具体配置类容
server:
  port: 7001

spring:
  application:
    name: onlyone-registry

  cloud:
    nacos:
      discovery:
        #配置中心nacos地址
        server-addr: 192.168.96.135:8848
        enabled: true
        register-enabled: true
        #命名空间
        namespace: 762988e7-0b5a-4bd2-a4f6-03ae96cf1a8c
      config:
        #注册中心nacos地址
        server-addr: 192.168.96.135:8848
        #指定yaml格式的配置
        file-extension: yaml
        #命名空间
        namespace: 762988e7-0b5a-4bd2-a4f6-03ae96cf1a8c
        group: ONLYONE_DEV_GROUP
  • discovery:是nacos的注册信息,默认用的spring.application.name:配置的名称
  • config: 是配置在nacos里面的那些配置的具体位置,比如 命名空间,组,类似于java的文件夹,包,那样的分类。nacos官网的配置规则
    在这里插入图片描述
  1. nacos 配置
  • 命名空间创建 默认public
    在这里插入图片描述
  • 创建配置文件
    在这里插入图片描述
    在这里插入图片描述
  • nacos里面配置文件的内容(注意替换ip,端口号)
    在这里插入图片描述
spring:
  # 前后端传输时间相差8小时问题
  jackson:
    time-zone:
      GMT+8
    date-format:
      yyyy-MM-dd HH:mm:ss
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.96.135:3306/onlyoa?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&            useSSL=false&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8&serverTimezone=Asia/Shanghai
    username: root
    password: wh0209

  redis:
    # Redis数据库索引(默认为0)
    database: 0
    # Redis服务器地址
    host: 192.168.96.135
    # Redis服务器连接端口
    port: 6379
    # Redis服务器连接密码(默认为空)
    password: wh0209
    # 连接超时时间(毫秒)
    timeout: 3000

mybatis:
  configuration:
    cache-enabled: false
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mapping/**/*Mapper.xml
  type-aliases-package: com.onlyoa.common.entity

pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
  page-size-zero: true

dubbo:
  cloud:
    subscribed-services: onlyone-consumer
  scan:
    base-packages: com.wwwh.onlyone.registry.Impl #指定 Dubbo 服务实现类的扫描基准包
  protocol:
    name: dubbo #使用dubbo协议
    port: -1 # port 为协议端口( -1 表示自增端口,从 20880 开始)
  registry:
    address: nacos://192.168.96.135:8848 #配置中心nacos地址
  config-center:
    namespace: 762988e7-0b5a-4bd2-a4f6-03ae96cf1a8c
  consumer:
    timeout: 300000

logging:
  level:
    com.wwwh.onlyone.registry: debug
  config: classpath:logback-spring.xml
  file:
    path: C:/log/myLogs/registry/

服务提供模块暴露的接口方法在 public 命名空间,不知道咋回事。
在这里插入图片描述
启动服务数据提供模块看看:
在这里插入图片描述
在这里插入图片描述
启动成功了!


五、创建 consumer

该模块用于服务数据调用。
在这里插入图片描述
pom 文件和上面的provider差不多,多了个sentinel的包spring-cloud-starter-alibaba-sentinel,用于接口的限流以及sentinel配置持久化到nacos的包sentinel-datasource-nacos

pom 内容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>onlyone-parent</artifactId>
        <groupId>com.wwwh.onlyone.parent</groupId>
        <version>1.0.0</version>
    </parent>
    <groupId>com.wwwh.onlyone.consumer</groupId>
    <artifactId>onlyone-consumer</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <name>onlyone-consumer</name>
    <description>消费者</description>

    <dependencies>
        <!-- 公共模块 -->
        <dependency>
            <groupId>com.wwwh.onlyoa.common</groupId>
            <artifactId>onlyone-common</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- nacos 注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--
            spring-cloud-dependencies 2020.0.0 默认不在加载bootstrap 配置文件,
            如果项目中要用bootstrap 配置文件 需要手动添加spring-cloud-starter-bootstrap
            依赖,不然启动项目会报错的。
         -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-cloud-commons</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-cloud-context</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--nacos 配置 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!-- sentinel持久化到nacos -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!-- spring-cloud-dubbo -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <!-- Apache工具组件 xftp-->
        <dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
        </dependency>
        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>asm</artifactId>
                    <groupId>org.ow2.asm</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.2</version>
                <configuration>
                    <mainClass>com.wwwh.onlyone.consumer</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
                <version>1.18.20.0</version>
            </plugin>
            <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>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

接下来是yml 配置内容

  • 具体规则和privider模块一样,忘了的,请往上翻!
  1. application.yml 用于选择配置文件的环境。
spring:
  profiles:
    #开发环境
    active: dev
  1. bootstrap.yml 具体配置类容
server:
  port: 8001

spring:
  application:
    name: onlyone-consumer

  cloud:
    nacos:
      discovery:
        #配置中心nacos地址
        server-addr: 192.168.96.135:8848
        enabled: true
        register-enabled: true
        #命名空间
        namespace: 762988e7-0b5a-4bd2-a4f6-03ae96cf1a8c
      config:
        #注册中心nacos地址
        server-addr: 192.168.96.135:8848
        #指定yaml格式的配置
        file-extension: yaml
        #命名空间
        namespace: 762988e7-0b5a-4bd2-a4f6-03ae96cf1a8c
        group: ONLYONE_DEV_GROUP
  1. nacos 配置
  • 怎么创建的,请往上上翻
    在这里插入图片描述
  • 配置内容
    至于这里为什么也要配置datasource,不配置会报错
spring:
  # 前后端传输时间相差8小时问题
  jackson:
    time-zone:
      GMT+8
    date-format:
      yyyy-MM-dd HH:mm:ss

  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
      
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.96.135:3306/onlyoa?useUnicode=true&characterEncoding=utf8&nullCatalogMeansCurrent=true&            useSSL=false&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8&serverTimezone=Asia/Shanghai
    username: root
    password: wh0209

  redis:
    # Redis数据库索引(默认为0)
    database: 0
    # Redis服务器地址
    host: 192.168.96.135
    # Redis服务器连接端口
    port: 6379
    # Redis服务器连接密码(默认为空)
    password: wh0209
    # 连接超时时间(毫秒)
    timeout: 3000

  cloud:
    sentinel:
      transport:
        #配置Sentinel dashboard地址
        dashboard: 192.168.96.135:8858
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直到找到未被占用的端口
        port: 8719
      datasource:
        dsl:
          nacos:
            server-addr: 192.168.96.135:8848 #配置中心nacos地址
            namespace: 762988e7-0b5a-4bd2-a4f6-03ae96cf1a8c #配置nacos地址
            dataId: onlyone-consumer-sentinel
            groupId: SENTINEL_GROUP
            data-type: json
            rule-type: flow

dubbo:
  registry:
    address: nacos://192.168.96.135:8848 #配置中心nacos地址
  scan:
    base-packages: com.wwwh.onlyoa.consumer.controller #指定 Dubbo 服务实现类的扫描基准包
  cloud:
    subscribed-services: onlyone-registry,onlyone-provider
  application:
    qos-enable: false
  config-center:
    namespace: 762988e7-0b5a-4bd2-a4f6-03ae96cf1a8c
  protocol:
    name: dubbo #使用dubbo协议
    port: -1 # port 为协议端口( -1 表示自增端口,从 20880 开始)
  consumer:
    timeout: 300000

mybatis:
  configuration:
    cache-enabled: false
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mapping/**/*Mapper.xml
  type-aliases-package: com.onlyoa.common.entity

sftp:
  # 服务器地址
  host: 192.168.96.135
  # 端口
  port: 22
  # 账号
  userName: root
  # 密码
  password: wang521
  # 图片的根路径
  basePath: /home/nginx/image
  # 音频的根路径
  audioPath: /home/nginx/audio
  # 视频的根路径
  videoPath: /home/nginx/video
  # channel连接超时时间
  timeout: 30000
  #连接次数
  count: 3
  #休眠时间
  sleepTime: 6000
  #服务器头像地址
  titleImgsPath: http://192.168.96.135:80/image/
  #服务器音频地址
  titleAudiosPath: http://192.168.96.135:80/audio/
  #服务器视频地址
  titleVideosPath: http://192.168.96.135:80/video/

logging:
  level:
    com.wwwh.onlyone.consumer: debug
  config: classpath:logback-spring.xml
  file:
    path: C:/log/myLogs/consumer/

注意:这里需要注意的就是 sentinel 持久化到 nacos 的配置
在这里插入图片描述
在这里插入图片描述
注意:这里的 命名空间 组名称,之前的yaml 换成 Json
在这里插入图片描述
配置内容:

[
  {
    "resource": "infof",
    "limitApp": "default",
    "grade": 1,
    "count": 1,
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
  },
  {
    "resource": "infoe",
    "limitApp": "default",
    "grade": 1,
    "count": 1,
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
  }
]

里面的参数对应说明请查看sentinel 官网说明
对应下图的表单里面的字段
在这里插入图片描述
启动项目看看
在这里插入图片描述
在这里插入图片描述

下面我们创建一个接口

  • 试试dubbo调用以及sentinel Qps流控
  1. common 里面创建一个接口
    在这里插入图片描述
  2. provider 实现接口
    注意注解@DubboService,目前最新的是@DubboService,老版本的是@Service注意导包。
    在这里插入图片描述
  3. consumer
    在这里插入图片描述
    注意:sentinel 流控注解@SentinelResource
    value:对应nacos里面sentinel json配置的"resource": "infof"
    blockHandlerClass:发生流控时的回调方法。
    blockHandler:具体流控回调方法。
    fallbackClass:代码发生错误时的回调方法。
    fallback:具体错误回调方法。

下面配置回调方法
在这里插入图片描述

  • blockHandler:
public static String handler(BlockException blockException) {
    String ruleLimitApp = blockException.getRuleLimitApp();
    return "....被限流了.... "+ruleLimitApp;
}
  • fallback:
public static String fallBack() {
    return "....系统运行异常....";
}

调用:
在这里插入图片描述
在这里插入图片描述

六、创建gateway 网关

pom 文件 gateway spring-cloud-starter-gateway

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <artifactId>onlyone-parent</artifactId>
        <groupId>com.wwwh.onlyone.parent</groupId>
        <version>1.0.0</version>
    </parent>
    <groupId>com.wwwh.onlyone.gateway</groupId>
    <artifactId>onlyone-gateway</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>
    <name>onlyone-gateway</name>
    <description>网关</description>

    <dependencies>
        <!-- nacos 注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--
            spring-cloud-dependencies 2020.0.0 默认不在加载bootstrap 配置文件,
            如果项目中要用bootstrap 配置文件 需要手动添加spring-cloud-starter-bootstrap
            依赖,不然启动项目会报错的。
         -->
<!--        <dependency>-->
<!--            <groupId>org.springframework.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-bootstrap</artifactId>-->
<!--            <exclusions>-->
<!--                <exclusion>-->
<!--                    <artifactId>spring-cloud-commons</artifactId>-->
<!--                    <groupId>org.springframework.cloud</groupId>-->
<!--                </exclusion>-->
<!--                <exclusion>-->
<!--                    <artifactId>spring-cloud-context</artifactId>-->
<!--                    <groupId>org.springframework.cloud</groupId>-->
<!--                </exclusion>-->
<!--            </exclusions>-->
<!--        </dependency>-->
        <!--nacos 配置 -->
<!--        <dependency>-->
<!--            <groupId>com.alibaba.cloud</groupId>-->
<!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!--        </dependency>-->
        <!-- gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>3.0.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.2</version>
                <configuration>
                    <mainClass>com.wwwh.onlyone.gateway</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok-maven-plugin</artifactId>
                <version>1.18.20.0</version>
            </plugin>
            <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>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

用于请求的转发,全局拦截器等
这边我没有把配置放到nacos,感兴趣的可以自己照着上面的模块弄一下。

  1. application.yml
    请求转发配置
    在这里插入图片描述
    个别请求不拦截
    在这里插入图片描述
server:
  port: 1109

spring:
  application:
    name: onlyone-gateway

  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

  cloud:
    nacos:
      discovery:
        #配置nacos地址
        server-addr: 192.168.96.135:8848
        #命名空间
        namespace: 762988e7-0b5a-4bd2-a4f6-03ae96cf1a8c
    #      config:
    #        server-addr: 192.168.40.129:8848 #注册中心nacos地址
    #        file-extension: yaml #指定yaml格式的配置
    #        namespace: d2b59ca0-ff9f-4e63-a94c-d7a88b87d2d7 #命名空间
    #        group: DEV_GROUP
    gateway:
      httpclient:
        connect-timeout: 10000
        response-timeout: 5s
      discovery:
        locator:
          enabled: true   #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: onlyone_gateway_login  #路由id,要求唯一
#          uri: http://localhost:8001  #匹配后提供服务的路由地址
          uri: lb://onlyone-consumer   #匹配注册中心的服务名称
          predicates:
            - Path=/free/**  #断言,路径相匹配进行路由
          filters:
            - name: IgnoreAuthFilter #本路由跳过全局过滤器
              args:
                ignoreGlobalFilter: true
  redis:
    # Redis数据库索引(默认为0)
    database: 0
    # Redis服务器地址
    host: 192.168.96.135
    # Redis服务器连接端口
    port: 6379
    # Redis服务器连接密码(默认为空)
    password: wh0209
    # 连接超时时间(毫秒)
    timeout: 3000

logging:
  level:
    com.wwwh.onlyone.registry: debug
  config: classpath:logback-spring.xml
  file:
    path: C:/log/myLogs/gateway/
  1. 全局拦截器配置
    实现GlobalFilter, Ordered接口
    在这里插入图片描述
    拦截器内容:
import com.wwwh.onlyone.gateway.utils.RedisUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Map;

/**
 * description Gateway全局过滤器
 * @author Mr.Tiger
 * @date 2020/12/28 15:47
 */
@Component
public class MyLogGatewayFilter implements GlobalFilter, Ordered
{
    /**
     * description: 注入redis的工具类
     */
    private final RedisUtil redisUtil;

    public MyLogGatewayFilter(RedisUtil redisUtil)
    {
        this.redisUtil = redisUtil;
    }

    private static final Logger logger = LoggerFactory.getLogger(MyLogGatewayFilter.class);

    /**
     * description: token常量
     */
    public static final String AUTHORIZE_TOKEN = "token";
    /**
     * description: 唯一标识,账号常量
     */
    public static final String AUTHORIZE_USERID = "userPhone";

    public final static String ATTRIBUTE_IGNORE_TEST_GLOBAL_FILTER = "@ignoreTestGlobalFilter";


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //不过滤,忽略掉 注册,登录,记住密码,个人信息 等url路径
        //指定路由跳过全局拦截器
        if (exchange.getAttribute(ATTRIBUTE_IGNORE_TEST_GLOBAL_FILTER) == null) {
            //获取请求头中的token和userPhone
            String token = exchange.getRequest().getHeaders().getFirst(AUTHORIZE_TOKEN);
            logger.info("-------------前台token:"+token);
            String userPhone = exchange.getRequest().getHeaders().getFirst(AUTHORIZE_USERID);
            //如果token和userPhone为null,则请求参数中尝试再次获取
            if (StringUtils.isEmpty(token))
            {
                logger.error("请求头token 不存在,请重新登陆");
                exchange.getRequest().getQueryParams().getFirst(AUTHORIZE_TOKEN);
            }
            if (StringUtils.isEmpty(userPhone))
            {
                logger.error("请求头账号 不存在,请重新登陆");
                exchange.getRequest().getQueryParams().getFirst(AUTHORIZE_USERID);
            }
            //如果依然不存在token或者userPhone,则直接返回401状态码
            if (StringUtils.isEmpty(token) || StringUtils.isEmpty(userPhone))
            {
                logger.error("请求头账号或token 不存在,请重新登陆");
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
                return exchange.getResponse().setComplete();
            }
            else
            {
                //从redis里取出token
                Object getToken = redisUtil.hget(userPhone, AUTHORIZE_TOKEN);
                logger.info("-------------redis--token:"+getToken);
                if (getToken == null)
                {
                    //返回没有找到token
                    logger.error("没有找到 账号对应的 token");
                    exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
                    return exchange.getResponse().setComplete();
                }
                else
                {
                    if (!token.equals(getToken))
                    {
                        //返回参数不被接受
                        logger.error("请求头里的token和redis里的不一样");
                        exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
                        return exchange.getResponse().setComplete();
                    }
                    else
                    {
                        String path = exchange.getRequest().getURI().getPath();
                        Map<String, Object> attributes = exchange.getAttributes();
                        System.out.println(attributes.toString());
                        logger.info("截取到的url地址是-------"+path);
                    }
                }
            }
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder()
    {
        return -108;
    }
}

里面具体业务不用太过关心。

  1. 个别请求不拦截配置
import com.wwwh.onlyone.gateway.filter.MyLogGatewayFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @Description:
 * @Author: Mr.Tiger
 * @Date: 2021/5/25 11:38
 */
@Slf4j
@Component
public class IgnoreAuthFilter extends AbstractGatewayFilterFactory<IgnoreAuthFilter.Config> {
    public IgnoreAuthFilter() {
        super(Config.class);
        log.info("IgnoreFilter 进入 IgnoreAuthGatewayFilterFactory ");
    }

    @Override
    public GatewayFilter apply(Config config) {
        log.info("IgnoreFilter 进入  apply");
        /*return (exchange, chain) -> {
            if (!config.isIgnoreGlobalFilter()) {
                return chain.filter(exchange);
            }
            return chain.filter(exchange);
        };*/
        //===============================注意=================================
        //下面的内部类写法,是为了指定过滤器的优先级,要优先于全局过滤器,否则
        //容易造成全局过滤器 拦截到指定 局部过滤器的配置内容。
        return new InnerFilter(config);
    }

    /**
     * 创建一个内部类,来实现2个接口,指定顺序
     * 这里通过Ordered指定优先级
     */
    private class InnerFilter implements GatewayFilter, Ordered {

        private Config config;

        InnerFilter(Config config) {
            this.config = config;
        }

        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            /*System.out.println("  pre 自定义过滤器工厂 AAAA  " + this.getClass().getSimpleName());
            boolean root = true == config.isIgnoreGlobalFilter();
            if (root) {
                System.out.println("  is root ");
            } else {
                System.out.println("  is no root ");
            }
            // 在then方法里的,相当于aop中的后置通知
            return chain.filter(exchange).then(Mono.fromRunnable(() -> {
                System.out.println("  post 自定义过滤器工厂 AAAA " + this.getClass().getSimpleName());
            }));*/
            log.info("进入innerFilter=====" + config.isIgnoreGlobalFilter());
            if (config.isIgnoreGlobalFilter() == true) {
                exchange.getAttributes().put(MyLogGatewayFilter.ATTRIBUTE_IGNORE_TEST_GLOBAL_FILTER, true);
            }
            return chain.filter(exchange);
        }

        @Override
        public int getOrder() {
            return -1000;
        }
    }


    public static class Config{
        boolean ignoreGlobalFilter;

        public boolean isIgnoreGlobalFilter() {
            return ignoreGlobalFilter;
        }

        public void setIgnoreGlobalFilter(boolean ignoreGlobalFilter) {
            this.ignoreGlobalFilter = ignoreGlobalFilter;
        }
    }

    /**
     * description: 这个name方法 用来在yml配置中指定对应的过滤器名称
     *
     * @return java.lang.String
     * @author Mr.Tiger
     */
    @Override
    public String name() {
        return "IgnoreAuthFilter";
    }
}

注意:ATTRIBUTE_IGNORE_TEST_GLOBAL_FILTER 这个参数在拦截器里面的配置在这里插入图片描述
测试调用:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


希望对你有所帮助!

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,我无法找到关于SpringCloud Alibaba Dubbo项目搭建的具体信息。是,我可以为您提供一般的SpringCloud Alibaba Dubbo项目搭建的步骤和方法。 1. 首先,确保您已经安装了Java开发环境和Maven构建工具。 2. 创建一个新的Spring Boot项目,可以使用Spring Initializr(https://start.spring.io/)或者使用IDE(如IntelliJ IDEA)创建一个空的Spring Boot项目。 3. 在项目的pom.xml文件中添加Dubbo和SpringCloud Alibaba的依赖。例如: ```xml <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-dubbo</artifactId> <version>2.2.1.RELEASE</version> </dependency> ``` 4. 创建Dubbo服务接口和实现类。在接口上使用`@Service`注解标记,并在实现类上使用`@DubboService`注解标记。 ```java // Dubbo服务接口 public interface HelloService { String sayHello(String name); } // Dubbo服务实现类 @Service @DubboService public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { return "Hello, " + name + "!"; } } ``` 5. 配置Dubbo的相关属性,例如注册中心地址、协议等。可以在application.properties或者application.yml文件中进行配置。 ```yaml # Dubbo配置 dubbo: application: name: dubbo-provider registry: address: zookeeper://localhost:2181 protocol: name: dubbo port: 20880 ``` 6. 创建一个Spring Boot启动类,并在启动类上使用`@EnableDubbo`注解启用Dubbo。 ```java @SpringBootApplication @EnableDubbo public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 7. 运行项目,Dubbo服务将会注册到指定的注册中心,并可以通过Dubbo的调用方式进行访问。 以上是一般的SpringCloud Alibaba Dubbo项目搭建的步骤和方法。具体的项目搭建还需要根据您的需求和实际情况进行配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值