码友们好,我是不会写作的码农,今天开始,我将为大家带来一套SpringCloudAlibaba基础教程,并且为了增加文章阅读不枯燥,我将以故事的形式为大家推进代码;所有代码均经过本菜鸡的实测运行,大家可以在学习完成之后,将遇到的问题放置在评论区,我将及时为大家回答。
1.引言
好了,废话不多说,我们直接开始正文!!!
相传在宇宙深处,存在着一颗蓝色的星球,这颗星球上,历经无数年的演变进化,现如今已进入科技时代.....
一间大学教室,坐着40多名学生,讲台上一位老师脚蹬讲座,手拿粉笔,唾沫星子乱飞,正在讲述着当今时代最好的编程语言-Java(最起码俺是这么认为),而下面的学生,有的正在TIMI,有的正在呲着大牙,带着耳机无声的大笑,而老师仿佛看不见他们的小动作一样,继续着自己伟大的事业;这已经是大学中都习以为常的操作了,而只有那么少部分的同学在仔细听讲(仅仅是故事,大家不要带入奥,如果不爽,就评论喷我几句,但是不能骂的太难听哦)
课后,我们的主角超级码力熟练的打开了某视频网站,并且熟练的打开历史观看,直接带进去;好家伙,竟然是SpringCloud,这小伙子这么卷么;
“码力,你能不能不要这么卷啊,老师讲基础,你却学这玩意?”同桌码芸嗷嗷的开始刺挠码力,试图阻止码力的内卷行为;
“别搞,我学完给你讲”,码力赶紧示弱;
“好啊!那你先把上次欠我的给我讲完!”,码芸来了兴致;
“行吧行吧,回头给我买杯柠檬水犒劳一下我”
“上次你刚给我讲完Springboot,我就下去自己做了一个简单的注册登陆和一些基本的CRUD,但是我总觉得注册登陆写的不应该这么简单”
“喔?我瞅瞅你的代码”
看代码......
“还不错,不过登录功能这么写,确实有点简陋,我今天先给你讲一下安全框架吧,你且听好,背景还是需要了解一下的”
码力开始现编了起来;
“Spring呢,是一个非常全的框架体系,但是呢,基本所有的东西,都离不开Spring和SpringMVC这两个东西,不管是Springboot,SpringCloud,都是以这两个基础框架为根本的,说起安全,Spring对于这方面做的非常不错滴,也推出了SpringSecurity框架,我今天就给你介绍一下它吧,非常牛x的,绝对值一杯柠檬水”;
“废话真多呢,快讲重点吧”。码芸为了让码力少废话,表现出了不耐烦;
“好好好,死鬼,猴急样!”码力阴阳的说了一句,不等码芸反胃,码力就开始了自己的唾沫星子乱飞
“我们先创建一个普通的Maven工程,分别导入SpringBoot、SpringSecrity、MybatisPlus、MySQL、JWT这些依赖内容,然后......”;码力开始了描述,根本不给码芸说话的机会;
......(因为本专栏主要是讲SpringCloud的,所以该部分内容暂时不讲,如果后续大家有兴趣,我会单独抽出来一篇单独讲解这部分内容)
“我们继续,开始SpringCloud吧”。
2.项目创建配置
2.1 IDEA工具调整
2.1.1.项目创建
“老规矩,我们先创建一个基础的Maven项目,然后我们把src先干掉,像这样”
然后做一些其他的配置;如下:
2.1.2 JDK调整
File -> Project Structure
首先调整JDK版本(我们使用的是JDK1.8):
2.1.3 其他设置
File -> Settings
maven配置按照大家平时使用的即可,无需完全按照截图设置
2.2 依赖导入
2.2.1 父工程项目依赖导入
我们上面已经吧src文件夹删除了,因为父工程不需要写代码,只是控制依赖的版本;
因为SpringCloud版本和其他框架的版本不能随意选择使用,所以我们需要使用父工程来控制整个项目的依赖版本;
我们引入的版本为SpringCloudAlibaba 2021.1,其他版本,像springboot,SpringCloud openfeign、这些框架版本均需要按照官方版本映射引入,如果你的依赖不是2021.1,而是其他版本,需要去官网查看版本映射关系;
地址:版本说明
防止有些码友打不开链接,我贴上两张截图
<?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.system</groupId>
<artifactId>manager-system</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2021.1</spring.cloud.alibaba.version>
<spring.boot.version>2.4.2</spring.boot.version>
<spring.cloud.version>2020.0.1</spring.cloud.version>
<!-- <spring.cloud.alibaba.nacos.version>0.2.1.RELEASE</spring.cloud.alibaba.nacos.version>-->
<!-- <spring.boot.redis.version></spring.boot.redis.version>-->
<!-- <spring.boot.rabbitmq.version></spring.boot.rabbitmq.version>-->
<mysql.version>5.1.47</mysql.version>
<!-- <dubbo.version>2.7.8</dubbo.version>-->
<druid.spring.boot.starter.version>1.2.8</druid.spring.boot.starter.version>
<mybatis.plus.boot.starter>3.4.3</mybatis.plus.boot.starter>
<fastjson2.version>2.0.19</fastjson2.version>
<lombok.version>1.18.24</lombok.version>
<spring.cloud.openfeign.version>2.2.10.RELEASE</spring.cloud.openfeign.version>
<!-- <spring.cloud.alibaba.dubbo>2021.1</spring.cloud.alibaba.dubbo>-->
<!-- <spring.cloud.alibaba.dubbo>2021.0.1.0</spring.cloud.alibaba.dubbo>-->
<javax.ws.rs.version>1.1.1</javax.ws.rs.version>
<common.lang3.version>3.7</common.lang3.version>
<jjwt.api.version>0.11.2</jjwt.api.version>
<jjwt.version>0.9.1</jjwt.version>
<spring.security.version>2.7.6</spring.security.version>
<spring.boot.starter.quartz.version>2.5.3</spring.boot.starter.quartz.version>
</properties>
<dependencyManagement>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-dubbo</artifactId>-->
<!-- <version>${spring.cloud.alibaba.dubbo}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring.cloud.openfeign.version}</version>
</dependency>
<!-- 解决javax.ws.rs.Path class not found-->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>${javax.ws.rs.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${common.lang3.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<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>${druid.spring.boot.starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.boot.starter}</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>%23en.g.apache.commons</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>1.4.1</version>-->
<!-- <type>pom</type>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>${spring.cloud.alibaba.nacos.version}</version>-->
<!-- <type>pom</type>-->
<!-- <scope>import</scope>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.api.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>${spring.boot.starter.quartz.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
“<dependencyManagement>标签是干嘛的?”码芸问到
“百度一下你就知道。”,码力鄙视的看着码芸;
“老娘不想百度,你不说,老娘把你脑壳敲碎!”码芸被码力的眼神看的有些恼火;
“中国有句古话,叫做....”,码力装模做样的说着,还没说话,就看到沙包大的拳头快要触摸到自己的头,然后迅速转身一本正经的讲了起来;
“你看名字,是不是management,翻译过来就是管理,没错,就是管理,没别的,就是用来管理依赖的版本的,他并不会直接导入依赖,而是用来控制整个工程的依赖,让其他的子工程只需要引入依赖,不需要考虑版本的问题”;
“还挺简单,你继续”,码芸看着码力正经了起来,收起了拳头,仔细的听着;
2.2.2 子工程创建
子工程创建,也叫模块创建,我们在右键点击父工程,如下图:
2.2.3 子工程配置
<?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.system</groupId>
<artifactId>manager-system</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>system-server</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<spring.cloud.alibaba.version>2021.1</spring.cloud.alibaba.version>
<spring.boot.version>2.4.2</spring.boot.version>
<spring.cloud.version>2020.0.1</spring.cloud.version>
<!-- <spring.cloud.alibaba.nacos.version>0.2.1.RELEASE</spring.cloud.alibaba.nacos.version>-->
<!-- <spring.boot.redis.version></spring.boot.redis.version>-->
<!-- <spring.boot.rabbitmq.version></spring.boot.rabbitmq.version>-->
<mysql.version>5.1.47</mysql.version>
<!-- <dubbo.version>2.7.8</dubbo.version>-->
<druid.spring.boot.starter.version>1.2.8</druid.spring.boot.starter.version>
<mybatis.plus.boot.starter>3.4.3</mybatis.plus.boot.starter>
<fastjson2.version>2.0.19</fastjson2.version>
<lombok.version>1.18.24</lombok.version>
<spring.cloud.openfeign.version>2.2.10.RELEASE</spring.cloud.openfeign.version>
<!-- <spring.cloud.alibaba.dubbo>2021.1</spring.cloud.alibaba.dubbo>-->
<!-- <spring.cloud.alibaba.dubbo>2021.0.1.0</spring.cloud.alibaba.dubbo>-->
<javax.ws.rs.version>1.1.1</javax.ws.rs.version>
<common.lang3.version>3.7</common.lang3.version>
<jjwt.api.version>0.11.2</jjwt.api.version>
<jjwt.version>0.9.1</jjwt.version>
<spring.security.version>2.7.6</spring.security.version>
<spring.boot.starter.quartz.version>2.5.3</spring.boot.starter.quartz.version>
</properties>
<dependencyManagement>
<dependencies>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-dubbo</artifactId>-->
<!-- <version>${spring.cloud.alibaba.dubbo}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring.cloud.openfeign.version}</version>
</dependency>
<!-- 解决javax.ws.rs.Path class not found-->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>${javax.ws.rs.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${common.lang3.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<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>${druid.spring.boot.starter.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.boot.starter}</version>
</dependency>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>%23en.g.apache.commons</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>1.4.1</version>-->
<!-- <type>pom</type>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>${spring.cloud.alibaba.nacos.version}</version>-->
<!-- <type>pom</type>-->
<!-- <scope>import</scope>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.api.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>${spring.security.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>${spring.boot.starter.quartz.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
这个子工程的src可不兴删啊码友!!!
创建Springboot启动类
我们的包结构就暂时这么定义
启动类创建
package com.system.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import java.util.Arrays;
@SpringBootApplication
public class SystemServerApplication {
public static void main(String[] args) {
args = Arrays.copyOf(args, args.length + 1);
args[args.length - 1] = "--spring.cloud.bootstrap.enabled=true";
SpringApplication.run(SystemServerApplication.class, args);
}
}
然后去resource下面创建一个bootstrap.yml
里面的内容如下(注册中心我们使用的是nacos,数据库使用mysql5.x版本)
我们暂时先忽略nacos的配置(等讲解到消费者时,再讲一下nacos也不迟),看各位的反馈情况,看是否需要单独安排一章讲解一下nacos如何配置使用
spring:
datasource:
url: jdbc:mysql://localhost:3306/manger_system
username: root
password: xxxx
driver-class-name: com.mysql.jdbc.Driver
# application:
# name: nacos-config-base
application:
name: system-server-dev
main:
allow-bean-definition-overriding: true
cloud:
nacos:
# 权限认证,nacos.core.auth.enabled=true 时需要添加
username: nacos
password: nacos
discovery:
# 本地
namespace: 652ecdea-3f6c-41a9-8f26-679d50415dc8
# aliyun
# namespace: b8d6e239-4e27-4186-97e8-5b270c684a38
config:
# nacos config 的开关
# enabled: false
prefix: system-server-dev
file-extension: yaml
group: DEFAULT_GROUP
namespace: ${spring.cloud.nacos.discovery.namespace}
server-addr: 192.168.31.142:8848
# server-addr: 59.110.212.235:8848
server-addr: 192.168.31.142:8848
# server-addr: 59.110.212.235:8848
redis:
host: localhost
port: 6379
# password: 11260216
mybatis:
table:
auto: update
#create 系统启动后,会将所有的表删除掉,然后根据model中配置的结构重新建表,该操作会破坏原有数据。
#update 系统会自动判断哪些表是新建的,哪些字段要修改类型等,哪些字段要删除,哪些字段要新增,该操作不会破坏原有数据。
#none 系统不做任何处理。
#add 新增表/新增字段/新增索引/新增唯一约束的功能,不做做修改和删除 (只在版本1.0.9.RELEASE及以上支持)。
model:
pack: xxx (暂时不配置) #扫描用于创建表的对象的包名,多个包用“,”隔开
database:
type: mysql #数据库类型 目前只支持mysql
mybatis-plus:
mapper-locations: classpath:/mapper/*mapper.xml
#dubbo:
# scan:
# base-packages: com.system.server.serivce.impl
# protocol:
# name: dubbo
# port: 20881
# registry:
# address: nacos://${spring.cloud.nacos.server-addr}
# parameters:
# namespace: ${spring.cloud.nacos.discovery.namespace}
server:
port: 9099
然后回到我们的父工程的依赖中,看一下父工程的依赖中是否自动加入了子工程,没有的话,需要手动加入进去
好了,这时候,SpringCloud的项目基础搭建已经完成,此时如果没有nacos启动应该会报错,但是不慌,可以把nacos的那段配置暂时注释,毕竟我们暂时也用不到消费者;
叮叮叮叮,随着上课铃声响起,码芸也满意的点了点头:“还不错,学会怎么搭建微服务项目了,看名字,这个所谓的模块应该是提供服务的,是不是还应该有工具类,实体类这些模块呢?”
“那当然,其实每个人对于模块的划分都有不同的理解,这并不能完全统一,只是大致的模块划分能得到一种默认的规则而已,其实说白了,就是领导要求怎么划分,你就怎么去划分就好了,不需要恪守某种格式”,码力一本正经的胡扯着。
“好了,要上课了,下课我们继续,不要忘了给我买柠檬水喝,给你讲了这么久,我嗓子都干了,喝点柠檬水润润喉”
3.总结
本文主要讲解了SpringCloud如何搭建和配置,属于偏基础文章,后面将会根据文章的内容,持续深入,创作不易,感谢支持!
如果本文对屏幕前的码友有帮助,不要忘记点赞加收藏,下次更新以便及时阅读查看