零、SpringCloudAlibaba简介
Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合。
同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
作为 Spring Cloud 体系下的新实现,Spring Cloud Alibaba 跟官方的组件或其它的第三方实现如 Netflix, Consul,Zookeeper 等对比,具备了更多的功能:
各个组件:
阿里开源组件
Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
RocketMQ:开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
Dubbo:这个就不用多说了,在国内应用非常广泛的一款高性能 Java RPC 框架。
Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
Arthas:开源的Java动态追踪工具,基于字节码增强技术,功能非常强大。
一、 Nacos概述
github地址:https://github.com/alibaba/nacos
1.1 什么是Nacos
Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
1.2 为什么用Nacos
常见的注册中心:
- Eureka(原生,2.0遇到性能瓶颈,停止维护)
- Zookeeper(支持,专业的独立产品。例如:dubbo)
- Consul(原生,GO语言开发)
- Nacos
相对于 Spring Cloud Eureka 来说,Nacos 更强大。
Nacos = Spring Cloud Eureka + Spring Cloud Config
Nacos 可以与 Spring, Spring Boot, Spring Cloud 集成,并能代替 Spring Cloud Eureka, Spring Cloud Config。
-
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
-
通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。
1.3 Nacos可以干什么
Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现、配置和管理。
Nacos主要提供以下四大功能:
- 服务发现和服务健康监测
- 动态配置服务
- 动态DNS服务
- 服务及其元数据管理
二、Nacos快速开始
2.1. 下载及安装
你可以通过源码和发行包两种方式来获取 Nacos。
您可以从 https://github.com/alibaba/nacos/releases 下载 nacos-server-$version.zip
包。
unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
2.2. 启动nacos服务
- Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone
- Windows
启动命令:
startup.cmd -m standalone
或者双击startup.cmd运行文件。(可能报异常 建议执行命令)
之后访问:http://localhost:8848/nacos
用户名密码:nacos/nacos
出现naocs不能正常使用解决办法:
检测nacos状态:http://localhost:8848/nacos/v1/ns/instance
如果提示:server is DOWN now, please try again later!
解决办法:(1)、停止naocos (2)、删除naocs安装程序,data目录下的protocol文件夹,重启服务即可
2.3. 注册中心
创建生产者和消费者客户端去连接注册中心(实质上没有生产者与消费者,都是一个个对等的微服务)。
- 生产者注册到nacos
依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dong</groupId>
<artifactId>nacos-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
配置文件application.yml
server:
port: 8001
spring:
application:
name: provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
#myName: hello nacos # 云端与本地冲突时,会优先加载云端的配置
然后在主启动类中添加@EnableDiscoveryClient
注解。
- 消费者注册到nacos
消费者注册到nacos跟生产者差不多,也分3步:
-
添加依赖:同生产者
-
在application.yml中配置nacos的服务名及服务地址:同生产者。
-
在引导类(NacosConsumerApplication.java)中添加
@EnableDiscoveryClient
注解:同生产者
这里消费者端口配置的是9001,然后远程调用生产者
三、 配置中心
在系统开发过程中,开发者通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成。配置变更是调整系统运行时的行为的有效手段。
如果微服务架构中没有使用统一配置中心时,所存在的问题:
-
配置文件分散在各个项目里,不方便维护。比如redis地址变更之后,需要去各个服务中修改Redis地址
-
配置内容安全与权限
-
更新配置后,项目需要重启
nacos配置中心:系统配置的集中管理(编辑、存储、分发)、动态更新不重启、回滚配置(变更管理、历史版本管理、变更审计)等所有与配置相关的活动。
3.1 macos中心,创建统一配置
dataId 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
1、 prefix
默认为所属工程配置spring.application.name
的值(即:nacos-provider),也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。
2、 spring.profile.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
/
3、 file-exetension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。
Group:指定分组
配置内容:指定配置中的值,然后可以从本地项目中拉取值。实现配置信息集中管理,比如注册中心地址,redis链接地址等等。
3.2 从配置中心读取配置
- 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 在
bootstrap.yml
中配置 Nacos server 的地址和应用名
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
application:
name: provider
这里没有指定配置中心的配置文件,那么默认加载的是与spring.application.name名称一样的配置
- controller层中注入配置中心的值
可以通过 Spring Cloud 原生注解@RefreshScope
实现配置值自动更新:
@RestController
@RefreshScope// 注册中心修改值后,这里能马上刷新到
public class ProviderController {
@Value("${myName}")
private String msg;
@GetMapping("/hello")
public String hi() {
return msg + "<br>" + redisUrl + "<br>" + jdbcUrl;
}
}
在注册中心修改值后,这里刷新页面也能马上查看到更改后的值,因为@RefreshScope
注解
3.3 命名空间切换
在实际开发中,通常有多套不同的环境(默认只有public),那么这个时候可以根据指定的环境来创建不同的 namespce,例如,开发、测试和生产三个不同的环境,那么使用一套 nacos 集群可以分别建以下三个不同的 namespace。以此来实现多环境的隔离。
3.4 加载多配置文件
偶尔情况下需要加载多个配置文件。如果redis配置,jdbc配置等在不同的配置文件中。
如下图
jdbc.properties配置中:jdbc.url=xxxxxx
redis.properties配置中:redis.url=yyyy
cloud:
#nacos注册中心配置
nacos:
config:
#nacos注册中心地址
server-addr: localhost:8848
name: provider # 指定配置文件名称 DataId, 不写时,默认与application.name一致
namespace: 84c90b39-8826-48bc-bef4-d66ae40e1c73 # 命名空间切换,指定命名空间,要复制命名的id过来
file-extension: yml #指定nacos中配置文件为yml类型文件(文件扩展名), 不指定时默认扩展名为properties
# extensionConfigs: 这样也可以指定配置多个配置文件
# - data-id: redis.properties
# refresh: true
# - data-id: db.properties
# refresh: true
extension-configs[0]:
data-id: redis.properties
group: GROUP1 # 不指定默认为 DEFAULT_GROUP
refresh: true # 开启动态刷新,注册中心的值改变了,项目中能马上读取到最新的值。在代码里面还要加上@RefreshScope注解
extension-configs[1]:
data-id: db.properties
refresh: true
注意老版本:是用ext-config
3.5 配置的分组
在实际开发中,除了不同的环境外。不同的微服务或者业务功能,可能有不同的redis及mysql数据库。
区分不同的环境我们使用名称空间(namespace),区分不同的微服务或功能,使用分组(group)。
当然,你也可以反过来使用,名称空间和分组只是为了更好的区分配置,提供的两个维度而已。
3.6 项目中总配置
bootstrap.yml
文件中
# 云端配置文件
spring:
application:
name: provider
devtools:
restart:
enabled: true
additional-paths: src/main/hava
cloud:
#nacos注册中心配置
nacos:
config:
#nacos注册中心地址
server-addr: localhost:8848
name: provider # 指定配置文件名称 DataId, 不写时,默认与application.name一致
namespace: 84c90b39-8826-48bc-bef4-d66ae40e1c73 # 命名空间切换,指定命名空间,要复制命名的id过来
file-extension: yml #指定nacos中配置文件为yml类型文件(文件扩展名), 不指定时默认扩展名为properties
# extensionConfigs: 这样也可以指定配置多个配置文件
# - data-id: redis.properties
# refresh: true
# - data-id: db.properties
# refresh: true
extension-configs[0]:
data-id: redis.properties
group: GROUP1 # 不指定默认为 DEFAULT_GROUP
refresh: true # 开启动态刷新,注册中心的值改变了,项目中能马上读取到最新的值
extension-configs[1]:
data-id: db.properties
refresh: true