SpringCloudAlibaba实战项目简介和初体验

码友们好,我是不会写作的码农,今天开始,我将为大家带来一套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如何搭建和配置,属于偏基础文章,后面将会根据文章的内容,持续深入,创作不易,感谢支持!

如果本文对屏幕前的码友有帮助,不要忘记点赞加收藏,下次更新以便及时阅读查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值