这里是对之前所写的一个springboot项目的拆分和丰富功能,主体结构随便画了一下
网关:gateway
服务注册和配置:ailibabaNacos
服务请求转发:feign-client
数据库:mysql持久,redis鉴权与缓存
搜索功能:es搜索引擎,rabbitmq消息队列进行mysql和es的数据同步
前端是用vue实现的,由于作者前端会的不多所以在搭建springcloud项目时注重于接口测试 ,第一天是项目的创建和gateway网关的鉴权。
目录
1.打开idea创建一个springcloud父工程
直接选择maven项目然后点击下一步
项目名,工件坐标这些都可以自己设置,点击完成就行。
父项目的src可以删除,因为父项目的主要作用就是对整体依赖版本的管理,首先我们加入父项目对于springboot版本的管理,注意这里springboot和spring cloud版本一定要对应,不然后面项目启动不了,可以用我这里的版本也可以去官方文档看对应关系。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/>
</parent>
接下来进行版本的管理和坐标的引入,可以根据自己的需要取舍依赖,dependencyManagement里的依赖就是spring cloud的依赖管理,在子项目引入的时候不需要指定版本,只要artifactId和groupId就行,另外在properties写入版本在下面使用${}引入方便管理。
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<hutool.version>5.5.8</hutool.version>
<java.version>1.8</java.version>
<druid.version>1.1.10</druid.version>
<fastjson.version>1.2.62</fastjson.version>
<mybatisplus.version>3.5.1</mybatisplus.version>
</properties>
<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>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisplus.version}</version>
</dependency>
<!-- 小而全的工具类库 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--Nacos依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.创建一个子项目
这里以gateway子项目进行示例,子项目的创建过程都一样,我们右键点击父工程,点击新建一个模块,坐标和名字一样自己设置。
每创一个项目,在父项目会生成一个module
创建好子项目之后我们同样引入依赖,公用包是创建来用于存放一些返回类之类的通用类,通过自己的坐标可引入依赖,减少重复代码,feign-client我们也会使用这种方式调用。
<dependencies>
<!--nacos服务注册发现依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--网关gateway依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--公用包-->
<dependency>
<groupId>com.ityz</groupId>
<artifactId>love-common</artifactId>
<version>1.0</version>
</dependency>
</dependency>
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- <version>2.3.7.RELEASE</version>-->
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
</dependency>
</dependencies>
依赖导入之后我们给子项目添加包和启动类已经yml配置文件
springboot启动类 :
package com.ityz.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
yml配置文件:这里还包含了将服务注册到nacos,需要开启nacos服务才行,如果不需要就注释掉配置,后面的是gateway路由转发断言配置,因为后面所有请求都是访问网关端口,网关进行转发和负载均衡。
server:
port: 10010
spring:
application:
name: gateway
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes:
- id: user-service # 路由标示,必须唯一
uri: lb://userService # 路由的目标地址,lb表示负载均衡
predicates: # 路由断言,判断请求是否符合规则
- Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
- id: file-service
uri: lb://fileService
predicates:
- Path=/file/**
# default-filters: #默认过滤器,会对所有路由请求生效
# - AddRequestHeader=Truth,ityz is freaking awesome! #设置请求头
globalcors:
add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
cors-configurations:
'[/**]':
allowedOrigins: #允许哪些网站的跨域请求
- "http://localhost:8090"
- "http://www.leyou.com"
allowedMethods: #允许跨域的Ajax请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" #允许在请求头中携带的信息
allowedCredentials: true #是否允许携带cookie
maxAge: 360000 #本次跨域的有效期
redis:
# host: localhost
host: 8.130.40.99
port: 6379
# password: Zxy020729
jedis:
pool:
max-active: 8
database: 0
总体来说需要注意的就是boot和cloud版本对应,下一部分分享如何用token和redis做鉴权。