spring cloud是一系列框架的有序集合,是分布式系统构建工具
服务领域模型
不同的组(group)之间不能调用,只能进行组内调用
namespace=》group/service=》cluster=》instance
没有nacos的时候
微服务调用,可以直接使用RestTemplate进行调用。
但是服务量增大,一个服务需要部署在多台服务器上时,使用nginx做负载均衡
springboot与spring cloud alibaba版本对应
版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub
注册中心
nacos注册中心集成springboot
引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
在启动类上加注解
@EnableDiscoveryClient
添加配置
server:
port: 8081
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
service: order-service
使用RestTemplate依赖spring-boot-starter-web
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动项目后,nacos中
服务调用(RestTemplate)
调用双方的服务都注册到nacos中
调用方
在启动类中添加RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
Controller,其中,stock-service是被调用方的服务名
@Autowired
private RestTemplate restTemplate;
@GetMapping("order/create")
public String createOrder(){
return restTemplate.getForObject("http://stock-service/stock/reduce", String.class);
}
添加依赖(好像没有这个依赖也可以调用)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
注册中心原理
1. 服务启动时,将服务注册到注册中心中(服务名:实例)
2. 注册中心有心跳机制,定时检测服务是否存活
3. 客户端调用时,会查询注册中心的服务列表
4. 客户端定时拉取注册中心的服务列表,以防服务信息发生改变
5. 当检测到服务发生变化时,注册中心会发送UDP协议进行更新(UDP是不可靠的传输)
nacos注册中心的入口是NacosNamingService
通过Raft协议和Disro协议进行数据同步
AP:Disro协议
CP:Raft协议
nacos集群
内置的derby改成mysql
使用nacos集群的时候,需要修改nacos的数据源,内置的数据库会导致各个节点数据不一致
nacos对应的mysql脚本在源码的distribution中
使用mysql需要修改nacos的配置文件application.properties
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
修改cluster.conf
使用nacos集群,需要修改cluster.conf中的相应配置,修改成集群的ip和端口
nginx对集群进行负载均衡
application.yml中对应的服务地址也需要添加
集群启动命令
startup.cmd -m cluster
配置中心
常用的配置中心
Apollo(阿波罗、国产)
1.统一管理不同环境、不同集群的配置2.配置修改实时生效(热发布)
3版本发布管理
4.灰度发布
5.权限管理、发布审核、操作审计
6.提供开放平台API
Disconf(百度,用的较少)
Spring cloud Config
基于git存储配置,缺少可视化界面
naocs 数据模型
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
nacos集成springboot
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
nacos作为配置中心不需要在启动类在添加@Enablexxx注解
修改配置文件
需要在bootstrap.properties或者bootstrap.yml中配置,不能在application.xxx中配置
因为bootstrap是应用程序引导执行,早于application执行
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
username: nacos
password: nacos
读取配置
在nacos的配置列表中添加spring.application.name同名的配置,在代码中能够直接读取配置
@Value("${name}")
private String name;
@RequestMapping("getName")
public String getName(){
return name;
}
通过这段代码,可以拿到配置中的name值
在controller上添加@RefreshScope,可以实现修改修改后拿到最新的配置值(配置自动更新、实时更新)
没有指定配置文件时,没有写扩展名时,#{spring.application.name}.properties文件会覆盖#{spring.application.name}文件中的配置
例:stock-app.properties中配置了name=zhangsan,stock-app中配置了name=lisi
最终读取到的name是zhangsan
如果指定了扩展名,那么会读取对应扩展名下的配置(stock-app.yaml)
还可以指定环境,此时读取stock-app-test.yaml
还可以指定命名空间,此时读取命名空间是ns1下的配置文件
shared-configs可以添加共享配置,优先级最低
extension-configs支持一个应用有多个dataId配置
优先级
共享配置 < 扩展配置 < stock-app < stock-app.yaml < stock-app-dev.yaml
配置动态刷新的原理
动态监听:
push
请求发送到服务端后推送给客户端
需要维护客户端和服务端之间的长链接
pull
客户端定时从服务端拉取变更
时间间隔不好把控
动态刷新:长轮询机制
1. 客户端定时发送请求从服务端拉取变更
2. http请求的超时时间是30s,如果配置没有变更,把http请求封装成ClientLongPoll对象,放在队列中
3. 同时启动一个线程,29.5s后执行
3.1 如果在29.5s中配置没有任务变化,直接返回http对象
3.2 如果在29.5s中配置发生变更,变更的事件会循环队列,找到是哪个请求对应的变更,返回结果,取消延迟线程