目录

Spring Cloud Alibaba简介

背景

1、单体应用的痛点

2、微服务的优势

重要组件

工程搭建

1、搭建父工程

2、引入相关springcloud依赖

3、创建子模块

4、将服务注册到nacos

4.1、引入nacos依赖

4.2、创建application.yml配置文件和启动类并引入nacos编辑

4.3、启动项目:

5、nacos配置中心

5.1、添加配置中心依赖

5.2、创建bootstrap.properties配置文件

5.3、新建名称空间

5.4、在nacos平台上创建配置文件映射相关

5.5、启动项目测试

5.6、 @RefreshScope注解 配置动态刷新

总结


Spring Cloud Alibaba简介

背景

1、单体应用的痛点

传统的单体应用,将所有功能的表示层、业务逻辑层,数据访问层,包括静态资源等等全部糅合在一个工程里面,编译,打包,部署在单台服务器上上线,比如打成war包放在Tomcat的webapp目录中部署项目。这样的项目开发部署适合小型项目,系统功能不复杂,访问量不大的情况下有绝对的优势。开发速度快,运维方便。但是当业务越来越复杂,功能越来越多,参与的开发人员越来越多,就暴露出问题了。

比如: 业务变复杂,代码量增大,代码可读性,可维护性,可扩展性下降。万一要新同事接手代码,理解起来花很多时间 测试难度增大 单体应用并发能力有限,访问量高了用户体验差 单体应用容错率低,万一哪里出错,可能导致整个项目就崩了

2、微服务的优势

将原来的单体应用按义务范围来进行划分,划分为多个小model,每个微服务运行在自己的进程中,不相互影响,通过完全自动化部署来独立部署。并使用轻量级机制通信,通常是HTTP RESTUFUL API。可对各个微服务进行集中管理。这些小model可以使用不同的编程语言,以及不同的存储技术。

重要组件

nacos:注册中心(服务注册与发现)、配置中心(动态配置管理) Ribbon:负载均衡 Feign:声明式Http客户端(调用远程服务) Sentinel:服务容错(限流、降级、熔断) Gateway:API网关(webflux编程模式) Sleuth:调用链监控 Seata:原Fescar,即分布式事务解决方案

工程搭建

1、搭建父工程

给项目起个名字就叫做’spring-cloud-alibaba-shop’ ,并删除掉src目录(父目录不需要)

springcloud alibaba 架构 springcloud alibaba项目实战_开发语言

 2、引入相关springcloud依赖

引入springboot springcloud spingcloud alibaba 依赖,如下 版本选取: springboot – 2.6.4 springcloud – 2021.0.1 springcloud alibaba – 2021.0.1.0

<?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>org.alibabashop</groupId>
    <artifactId>spring-cloud-alibaba-shop</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <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>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>none</mainClass>     <!-- 取消查找本项目下的Main方法:为了解决Unable to find main class的问题 -->
                    <classifier>execute</classifier>    <!-- 为了解决依赖模块找不到此模块中的类或属性 -->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>


</project>

3、创建子模块

我们模拟创建一个用户模块

springcloud alibaba 架构 springcloud alibaba项目实战_spring_02

 4、将服务注册到nacos

有关nacos的安装请参见博主之前的文章:

Windows下Nacos安装

4.1、引入nacos依赖

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
        </dependency>

4.2、创建application.yml配置文件和启动类并引入nacos

springcloud alibaba 架构 springcloud alibaba项目实战_配置文件_03

 启动类:

package com.alibabashop.user;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;


@SpringBootApplication
@ComponentScan(basePackages = {"com.alibabashop.*"})
public class ShopUserApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopUserApplication.class, args);
    }
}

 在application.yml文件中添加nacos相关配置:

server:
  port: 9090

spring:
  application:
    name: mdx-shop-user
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

4.3、启动项目:

springcloud alibaba 架构 springcloud alibaba项目实战_配置文件_04

 已经注册成功,查看nacos服务

springcloud alibaba 架构 springcloud alibaba项目实战_开发语言_05

5、nacos配置中心

我们可以把项目中的一些开关等有可能在线上更改的配置放到nacos的统一配置中心,更改配置不用重新上线下线服务,极大降低成本。

5.1、添加配置中心依赖

<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.0.2</version>
        </dependency>

其中上文在父工程的pom中引入了2个依赖,第一个依赖nacos-config是将nacos作为配置中心使用,第二个依赖starter-bootstrap是从Spring Boot 2.4版本开始,配置文件加载方式进行了重构,否则会出现配置参数无法加载的错误。 

 5.2、创建bootstrap.properties配置文件

bootstrap文件会在项目启动后第一个被加载,在配置文件中添加如下配置: server-addr:nacos地址 extension-configs: 扩展配置,支持配置多个配置文件 data-id: 配置文件的文件名称加后缀 group:配置文件的组,默认是DEFAULT_GROUP refresh: 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。 file-extension: 配置内容的数据格式,配置文件的格式,一般为properties 和 yaml namespace: 命名空间

spring.application.name=shop-user
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.extension-configs[0].data-id=shop-user.yaml
spring.cloud.nacos.config.extension-configs[0].group=shop
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.file-extension=yml
spring.cloud.nacos.config.namespace=alibaba
spring.cloud.nacos.config.group=shop

5.3、新建名称空间

 新建一个命名空间(与上文的配置一样,alibaba),可以将服务注册到这个命名空间下,这样方便方便在多人写作团队进行管理: 

springcloud alibaba 架构 springcloud alibaba项目实战_spring_06

5.4、在nacos平台上创建配置文件映射相关

在alibaba命名空间下新建配置

springcloud alibaba 架构 springcloud alibaba项目实战_配置文件_07

dataId和group要和配置文件对应,我们增加一个测试配置,然后发布.

springcloud alibaba 架构 springcloud alibaba项目实战_maven_08

springcloud alibaba 架构 springcloud alibaba项目实战_开发语言_09

 5.5、启动项目测试

新建一个HelloWordController作为测试接口,该接口中获取shop-user.test.userId 配置参数的值,在利用nacos的配置中心之前,改参数一般在本地的property文件中配置,通过注解获取,下文我们将通过nacos的配置文件获取。

package com.alibabashop.user.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class HelloWordController {

    @Value("${shop-user.test.userId}")
    private String userId;

    @GetMapping("getUserConfigTest")
    public String getUserConfigTest(){
        return userId != null ? userId : "未获取到配置";
    }
}

再次启动项目

springcloud alibaba 架构 springcloud alibaba项目实战_配置文件_10

 访问浏览器测试 http://localhost:9090/user/getUserConfigTest

springcloud alibaba 架构 springcloud alibaba项目实战_spring_11

 成功访问到配置。

5.6、 @RefreshScope注解 配置动态刷新

SpringCloud新增了一个自定义的作用域:refresh(可以理解为“动态刷新”),同样用了一种独特的方式改变了Bean的管理方式,使得其可以通过外部化配置(.properties)的刷新,在应用不需要重启的情况下热加载新的外部化配置的值。

本次在HelloWordController类上增加@RefreshScope注解,重启项目。

package com.alibabashop.user.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
@RequestMapping("/user")
public class HelloWordController {

    @Value("${shop-user.test.userId}")
    private String userId;

    @GetMapping("getUserConfigTest")
    public String getUserConfigTest(){
        return userId != null ? userId : "未获取到配置";
    }
}

先来访问一下这个接口 http://localhost:9090/user/getUserConfigTest 获取到的值为 test12345

springcloud alibaba 架构 springcloud alibaba项目实战_spring_11

然后我们改一下配置中心的配置

将值改为 test7890 然后发布

springcloud alibaba 架构 springcloud alibaba项目实战_开发语言_13

直接浏览器访问网址 http://localhost:9090/user/getUserConfigTest ,成功返回我们新改的配置。

springcloud alibaba 架构 springcloud alibaba项目实战_java_14

总结

至此,本文搭建springcloud alibaba项目工作就完成了。在本项目的第一阶段,通过在项目中新建一个shop-user的子模块,并引入nacos的配置项,将其作为项目的注册中心和参数配置中心,同时简单了解了nacos在项目开发中的作用。下一篇我们将介绍 springcloud alibaba中另一个组件openfegin的使用。