本文示例实现以gateway作为网关代理auth和user模块,在auth和user模块间使用feign实现远程服务调用。并在gateway的全局过滤器中使用 jwt 实现登录认证。
涉及到的知识点有: gateway、nacos、openfeig、 jwt权限认证、threadlocal
调用过程图如下:
因配置和代码篇幅太长,分为配置篇和代码篇,本篇为配置篇,代码篇更新完会放链接在此处,可以收藏一下,有问题的话也可以发私信,看到会回。
文章目录
一、引入maven依赖
(1)parent 模块 pom.xml
<properties>
<commons-lang3.version>3.7</commons-lang3.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.0</lombok.version>
<mysql.version>5.1.47</mysql.version>
<durid.version>1.1.9</durid.version>
<mybatis.spring.boot.version>1.3.2</mybatis.spring.boot.version>
<swagger.version>2.9.2</swagger.version>
<fastjson.version>1.2.47</fastjson.version>
<se_jwt.version>1.0.9.RELEASE</se_jwt.version>
<jjwt.version>0.9.0</jjwt.version>
<pagehelper.version>1.2.5</pagehelper.version>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- nacos发现的依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos 作为配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- mysql8 的 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!-- openfeign 依赖 -->
<dependency>
<!--父POM中锁定了版本信息,只需引入G,A即可 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
</dependencies>
<!-- dependencyManagement作为父模块 版本控制 -->
<dependencyManagement>
<dependencies>
<!-- spring-cloud 相关依赖 openfeign 要用到-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- springboot 2.2.2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 2.1.0.RELEASE -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId> spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${durid.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!--jwt-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>${se_jwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!-- springboot 整合 pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
(2)gateway模块pom.xml (不可引入spring-starter-web 的依赖)
<dependencies>
<!-- 添加gateway的依赖-->
<!-- springcloudgateway的内部是通过netty+webflux实现的,webflux实现和springmvc配置依赖冲突。所以gateway模块 千万不能引入 spring的web starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 用于整合 openfeign -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<!-- jwt 依赖 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>${se_jwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
(3)auth模块 pom.xml
<dependencies>
<dependency>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>cloud-api-9002</artifactId>
</dependency>
<!-- <dependency>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>cloud-common-9007</artifactId>
</dependency> -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos 作为配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql 作为数据库连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!--jwt-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>${se_jwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
(4)user模块 pom.xml
<!-- 存放openfeign接口和model-->
<dependency>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>cloud-api-9002</artifactId>
</dependency>
<!-- 该模块主要做一些工具类 -->
<!-- <dependency>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>cloud-common-9007</artifactId>
</dependency> -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos 作为配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql 作为数据库连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!-- druid 数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${durid.version}</version>
</dependency>
<!--jwt-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
<version>${se_jwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
(5)Api 模块的 pom.xml 配置
<dependencies>
<!-- <dependency>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
<artifactId>cloud-common-9007</artifactId>
</dependency>
-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos 作为配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<dependency>
<!--父POM中锁定了版本信息,只需引入G,A即可 -->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 用于整合 openfeign -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
二、application/bootstrap.yml 配置
(1) Gateway 的 bootstarp.yml 配置
server:
port: 9001
servlet:
context-path: /gateway
spring:
application:
name: cloud-gateway
cloud:
#gateway的配置
gateway:
#路由配置规则
routes:
- id: user_route #路由的唯一标识
uri: http://127.0.0.1:9003 #需要转发的地址 配置了nacos 也可用 lb:服务名实现负载
#断言规则 用于路由配置规则
#让 http://localhost:9001/user/*** 路由到 http://localhost:9003/user/***
#配置过滤器规则
predicates:
- Path=/user/**
# filters:
# - StripPrefix=1 #配置该参数是去掉 /user 让 http://localhost:9003/user/*** 变为 http://localhost:9003/*** 我自己的服务user模块配置了servlet.context-path为user 可以不配
- id: auth_route
uri: http://127.0.0.1:9006
predicates:
- Path=/auth/**
#nacos的配置
nacos:
discovery:
server-addr: nacos的ip:nacos的端口 #nacos 作为注册中心 如果这里配置了 nacos集群 就填写 nginx代理地址
config:
server-addr: nacos的ip:nacos的端口 #nacos 作为配置中心
file-extension: yaml #指定为yaml 格式
(2) Auth 模块的 bootstarp.yml 配置
server:
port: 9006
servlet:
context-path: /auth
spring:
application:
name: cloud-auth
cloud:
nacos:
discovery:
server-addr: nacos的ip:nacos的端口 #nacos 作为注册中心 配置nacos集群 nginx代理地址
config:
server-addr: nacos的ip:nacos的端口 #nacos 作为配置中心
file-extension: yaml #指定为yaml 格式
(3) User 模块的 bootstarp.yml 配置
server:
port: 9003
servlet:
context-path: /user
#配置druid作为数据源
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://数据库ip:数据库端口/数据库名
username: 账号
password: 密码
spring:
application:
name: cloud-user
nacos:
discovery:
server-addr: nacos的ip:nacos的端口 #nacos 作为注册中心 配置nacos集群 nginx代理地址
config:
server-addr: nacos的ip:nacos的端口 #nacos 作为配置中心
file-extension: yaml #指定为yaml 格式
(4) Api模块的bootstarp.yml 配置
server:
port: 9002
servlet:
context-path: /api
#nacos sentinel 等配置
spring:
application:
name: cloud-api
cloud:
nacos:
discovery:
server-addr: nacos的ip:nacos的端口 #nacos 作为注册中心 配置nacos集群 nginx代理地址
config:
server-addr: nacos的ip:nacos的端口 #nacos 作为配置中心
file-extension: yaml #指定为yaml 格式