目录
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注解 配置动态刷新
总结
传统的单体应用,将所有功能的表示层、业务逻辑层,数据访问层,包括静态资源等等全部糅合在一个工程里面,编译,打包,部署在单台服务器上上线,比如打成war包放在Tomcat的webapp目录中部署项目。这样的项目开发部署适合小型项目,系统功能不复杂,访问量不大的情况下有绝对的优势。开发速度快,运维方便。但是当业务越来越复杂,功能越来越多,参与的开发人员越来越多,就暴露出问题了。
比如:
业务变复杂,代码量增大,代码可读性,可维护性,可扩展性下降。万一要新同事接手代码,理解起来花很多时间
测试难度增大
单体应用并发能力有限,访问量高了用户体验差
单体应用容错率低,万一哪里出错,可能导致整个项目就崩了
将原来的单体应用按义务范围来进行划分,划分为多个小model,每个微服务运行在自己的进程中,不相互影响,通过完全自动化部署来独立部署。并使用轻量级机制通信,通常是HTTP RESTUFUL API。可对各个微服务进行集中管理。这些小model可以使用不同的编程语言,以及不同的存储技术。
nacos:注册中心(服务注册与发现)、配置中心(动态配置管理)
Ribbon:负载均衡
Feign:声明式Http客户端(调用远程服务)
Sentinel:服务容错(限流、降级、熔断)
Gateway:API网关(webflux编程模式)
Sleuth:调用链监控
Seata:原Fescar,即分布式事务解决方案
给项目起个名字就叫做’spring-cloud-alibaba-shop’ ,并删除掉src目录(父目录不需要)
引入springboot springcloud spingcloud alibaba 依赖,如下
版本选取:
springboot – 2.6.4
springcloud – 2021.0.1
springcloud alibaba – 2021.0.1.0
4.0.0
org.alibabashop
spring-cloud-alibaba-shop
pom
1.0-SNAPSHOT
org.springframework.boot
spring-boot-starter-parent
2.6.4
8
8
2021.0.1
2021.0.1.0
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring-cloud-alibaba.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
none
execute
repackage
我们模拟创建一个用户模块
有关nacos的安装请参见博主之前的文章:
Windows下Nacos安装
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
${spring-cloud-alibaba.version}
启动类:
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
已经注册成功,查看nacos服务
我们可以把项目中的一些开关等有可能在线上更改的配置放到nacos的统一配置中心,更改配置不用重新上线下线服务,极大降低成本。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
${spring-cloud-alibaba.version}
org.springframework.cloud
spring-cloud-starter-bootstrap
3.0.2
其中上文在父工程的pom中引入了2个依赖,第一个依赖nacos-config是将nacos作为配置中心使用,第二个依赖starter-bootstrap是从Spring Boot 2.4版本开始,配置文件加载方式进行了重构,否则会出现配置参数无法加载的错误。
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
新建一个命名空间(与上文的配置一样,alibaba),可以将服务注册到这个命名空间下,这样方便方便在多人写作团队进行管理:
在alibaba命名空间下新建配置
dataId和group要和配置文件对应,我们增加一个测试配置,然后发布.
新建一个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
成功访问到配置。
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的使用。