(学习记录)
一、 SpringCloud Alibaba入门简介
1.出现缘由
Spring Cloud Netflix项目进入维护模式。
将模块置于维护模式,意味着 Spring Cloud 团队将不会再向模块添加新功能。我们将修复 block 级别的 bug 以及安全问题,我们也会考虑并审查社区的小型 pull request。
所以SpringCloud Alibabab就诞生了。
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。英文文档:Spring Cloud Alibaba Reference Documentation
中文文档:spring-cloud-alibaba/README-zh.md at 2.2.x · alibaba/spring-cloud-alibaba · GitHub
2.SpringCloud Alibaba能干嘛
作用:
服务限流降级:默认支持 Servlet、Feign、RestTemplate、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
二、Nacos简介
1.概述
Nacos是:前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
它是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos就是注册中心 + 配置中心的组合 等价于 Nacos = Eureka+Config +Bus
下载地址:home
2.结构图:

3.安装使用
3.1Windows安装:确保电脑已经安装好java和Maven环境
1.先下载。 对应下载:home

2.选择 对应的版本,如图所示:

3.解压后的目录结构:

服务启动与访问:
1.启动命令:
Windows启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
注意:路径不要有中文,会启动失败
Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
./startup.sh -m standalone
2.访问Nacos服务:
打开浏览器,输入http://localhost:8848/nacos地址,出现如下登陆页面:
其中,默认账号密码为nacos/nacos.
3.2实例
3.2.1基于Nacos的服务提供者
1.新建module:cloudalibaba-provider-payment9001
2.配置pom文件
父pom引入alibaba
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
提供者pom
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.配置yml
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
4.主启动
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001
{
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
5.业务类
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}
6.测试
1.启动9001
2.测试:http://localhost:9001/payment/nacos/1
3.2.2基于Nacos的服务消费者
1.新建module:cloudalibaba-consumer-nacos-order83
2.配置pom
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3. 配置yml
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
4.主启动,同上
5.业务类
controller:
@RestController
public class OrderNacosController
{
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
config:
@Configuration
public class ApplicationContextBean
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
6.测试
访问:看到服务都被注册进来
访问:http://localhost:83/consumer/payment/nacos/13
轮询得到对应的数据。
总结:使用,引入对应的pom文件。yml配置,支持负载均衡。
与其他注册中心的对比:

模式选择:
一般来说,
如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误
3.3Nacos作为服务配置中心演示
3.3.1Nacos作为配置中心-基础配置
1.新建module:cloudalibaba-config-nacos-client3377
2.配置pom
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般基础配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3. 配置yml,这里配置两个bootstrap和application
bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
application.yml
spring:
profiles:
active: dev # 表示开发环境
4.主启动
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377
{
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
5. 业务类
@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}
Nacos的匹配规则:
公式:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
- prefix 默认为 spring.application.name 的值
- spring.profile.active 即为当前环境对应的 profile,可以通过配置项spring.profile.active 来配置。
- file-exetension 为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension 来配置

看图实列:

了解完匹配规则后,就在对应的nacos平台建立对应的设置DataId
历史版本设置:
Nacos会记录配置文件的历史版本默认保留30天,此外还有一键回滚功能,回滚操作将会触发配置更新
新增配置:

配置详情:

测试:
启动:3307
访问:http://localhost:3377/config/info
结果,拿取得到了Nacos注册中心中文件内容。
3.2.4Nacos作为配置中心-分类配置
1.问题由来:
问题1:
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生产环境。
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
问题2:
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境......
那怎么对这些微服务配置进行管理呢?
配置管理:
命名空间 Group Data Id
是什么:
类似Java里面的package名和类名。最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象。
默认情况:
Namespace=public,Group=DEFAULT_GROUP, 默认Cluster是DEFAUL
Nacos默认的命名空间是public,Namespace主要用来实现隔离。
比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,
这时就可以给杭州机房的Service微服务起一个集群名称(HZ),
给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后是Instance,就是微服务的实例。
2.三种配置方案
DataID方案:命名空间默认和group默认都相同,通过data id进行不同配置的切换

Group方案:命名空间默认,Data id相同。Group不同 同样切换
配置文件中修改:在config下增加一条group的配置即可。可配置为DEV_GROUP或TEST_GROUP

Namespace方案:新建命名空间。
yml配置:


4.Nacos集群和持久化配置
集群部署:集群部署说明

默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。
为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。
Nacos默认自带的是嵌入式数据库derby。但是做集群,每个Nacos自带数据库,不友好。将数据集中到mysql中进行管理。
derby到mysql切换配置步骤:
widows中:
1.nacos-server-1.1.4\nacos\conf目录下找到sql脚本,执行。如果没有数据库,记得自己创。
2.nacos-server-1.1.4\nacos\conf目录下找到application.properties
添加:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=name db.password=password
5.Linux的安装和使用
linux下安装集群版Nacos,并结合mysql实现持久化,Nginx实现负载均衡
5.1下载,选择对应的linux版本
官网下载地址:Releases · alibaba/nacos · GitHub
5.2解压,可以将压缩包放到/opt目录下
tar -zvxf nacos-server-2.1.0.tar.gz
解压后得到一个文件,在opt下面出现一个nacos

将这个nacos进行复制到自己创建的文件夹下面
cp -r nacos /mynacos/
5.3启动MySQL
service mysqld start/restart
mysql -u root -p yourpassword
先建立一个数据库
create database nacos_config;

然后执行下面的脚本:
source /mynacos/conf/nacos-mysql.sql;
看到:

5.4修改conf下的application.properties,在最后加入如下
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://120.26.51.144:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=you name
db.password=password
5.5在conf下创建cluster.conf
该目录有一个cluster.conf.example,这个官网给我们配置集群的例子,因此我们只要复制出来一个即可
cp cluster.conf.example cluster.conf
然后在里面添加如下内容:
注意:这个IP必须是linux下的实际IP,而不能是127.0.0.1或localhost等;
通过hostname -i 找出ip
172.17.2.70:3333
172.17.2.70:4444
172.17.2.70:5555
5.6 编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端
平时单机版的启动,都是./startup.sh即可。
但是集群启动,我们希望可以类似其它软件的shell命令,传递不同的端口号启动不同的nacos实例。
命令:./startup.sh -p 3333 表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致。
进入到bin目录下,vim编辑startup.sh,也可以先复制备份一份。修改如下:

在最后的位置新加:-Dserver.port=${PORT}

可测试是否配置成功:
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555

5.7配置Nginx,作为负载均衡器
找到自己的Nginx的nginx.conf
vim /usr/local/nginx/conf/nginx.conf
修改如下:

启动:指定该配置文件启动nginx,在/usr/local/nginx/sbin目录下执行
./nginx -c /usr/local/nginx/conf/nginx.conf
查看是否启动成功:ps -ef|grep nginx
5.8访问:
浏览器访问,在linux上输入:ip:1111/nacos






7327

被折叠的 条评论
为什么被折叠?



