目录
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目录(父目录不需要)
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、创建子模块
我们模拟创建一个用户模块
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
启动类:
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、启动项目:
已经注册成功,查看nacos服务
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),可以将服务注册到这个命名空间下,这样方便方便在多人写作团队进行管理:
5.4、在nacos平台上创建配置文件映射相关
在alibaba命名空间下新建配置
dataId和group要和配置文件对应,我们增加一个测试配置,然后发布.
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 : "未获取到配置";
}
}
再次启动项目
访问浏览器测试 http://localhost:9090/user/getUserConfigTest
成功访问到配置。
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
然后我们改一下配置中心的配置
将值改为 test7890 然后发布
直接浏览器访问网址 http://localhost:9090/user/getUserConfigTest ,成功返回我们新改的配置。
总结
至此,本文搭建springcloud alibaba项目工作就完成了。在本项目的第一阶段,通过在项目中新建一个shop-user的子模块,并引入nacos的配置项,将其作为项目的注册中心和参数配置中心,同时简单了解了nacos在项目开发中的作用。下一篇我们将介绍 springcloud alibaba中另一个组件openfegin的使用。