Nacos
作用:
实现分布式服务注册与发现/分布式配置中心
官方文档:
https://nacos.io/zh-cn/docs/quick-start.html
Nacos下载:
链接:https://pan.baidu.com/s/1rQjQ9NWDTdGSydyIQC8eTQ
提取码:9vc0
- 也可以去官方文档查看版本下载,使用入门也可参考官方文档
整合SpringCloud:
Maven依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
服务注册,加载nacos配置文件:
bootstrap.yml:
- 需要注意服务名称不能用下划线_
spring:
application:
###服务的名称
name: meitemayikt-nacos
cloud:
nacos:
discovery:
###nacos注册地址
server-addr: 127.0.0.1:8848
enabled: true
config:
###配置中心连接地址
server-addr: 127.0.0.1:8848
###分组
group: DEFAULT_GROUP
###类型
file-extension: properties
#后缀
# profiles:
# active: prd
#server:
# port: 8090
服务调用发现(openFeign):
定义接口MemberServiceFeign:
//value值为注册的服务名称
@FeignClient("meitemayikt-nacos")
public interface MemberServiceFeign {
/**
* 提供我们发布的接口
*
* @param userId
* @return
*/
@GetMapping("/getUser")
String getUser(@RequestParam("userId") Integer userId);
}
启动类开启注解:@EnableFeignClients
注入直接使用:
@Autowired
private MemberServiceFeign memberServiceFeign;
实时更新nacos配置信息启动类添加注解:@RefreshScope
Nacos持久化至本地数据库,集群搭建:
Nacos文件config目录下文件的作用:
- cluster.conf:集群ip配置
- nacos-mysql.sql:nacos生成本地数据库sql语句
- application.properties:nacos配置文件(修改端口,数据库连接等)
数据库连接配置:
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=root
db.password=admin
本地生成nacosConfig数据库,修改相应配置文件即可实现效果
Linux系统启动nacos默认为集群模式,windows默认为单体模式。
windows集群模式启动: .\startup.cmd -m cluster
linux单体模式启动: .\startup.cmd –m standalone
使用Nginx对nacos做集群
nginx下载:
链接:https://pan.baidu.com/s/101fhfHjHBF_zzs4V237Enw
提取码:gpf5
修改nginx.conf
http {
include mime.types;
default_type application/octet-stream;
upstream mayiktnacosadds {
server 127.0.0.1:8848;
server 127.0.0.1:8849;
server 127.0.0.1:8850;
}
server {
listen 80;
server_name nacos.mayikt.com;
location /nacos/ {
proxy_pass http://mayiktnacosadds/nacos/;
}
}
Nacos对比Zookeeper、Eureka区别:
Eureka:AP偏向于服务可用性
Zookeeper:CP偏向于服务强一致性
Nacos:默认AP,也可修改为CP
$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
相同点、不同点、中心化思想
三者都可以实现分布式注册中心框架
不同点:
Zookeeper采用CP保证数据的一致性的问题,原理采用(ZAP原子广播协议),当我们ZK领导者因为某种情况下部分节点出现了故障,会自动重新实现选举新的领导角色,整个选举的过程中为了保证数据一致性的问题,客户端暂时无法使用我们的Zookeeper,那么这以为着
整个微服务无法实现通讯。
Eureka采用AP设计思想实现分布式注册中心,完全去中心化、每个节点都是相等,采用你中有我、我中有你相互注册设计思想, 只要最后有一台Eure
分布式系统一致性算法
Zookeeper基于ZAP协议实现保证每个节点数据同步的问题,中心化思想集群模式。
分为领导和跟随者角色。
Eureka基于AP模式实现注册中心,去中心化的思想、每个节点都是对等的,采用你中有我,我中有你的形式实现注册中心。
常见分布式一致性算法:
1.ZAP协议(底层就是基于Paxos实现),核心底层基于2PC两阶段提交协议实现。
2.Nacos中集群保证一致性算法采ratf协议模式,采用心跳机制实现选举的。
Ratf整个底层实现原理:
在Raft协议中分为的角色
1.状态:分为三种 跟随者、竞选者、领导
2.大多数: >n/2+1
3.任期:每次选举一个新的领导角色 任期都会增加。
默认情况下选举的过程:
1.默认的情况下每个节点都是为跟随者角色
2.每个节点随机生成一个选举的超时时间 大概分为100-300ms,在这个超时时间内必须要等待。
3.超时时间过后,当前节点的状态由跟随者变为竞选者角色,会给其他的节点发出选举的投票的通知,只要该竞选者有超过半数以上即可选为领导角色。
核心的设计原理其实就是靠的 谁超时时间最短谁就有非常大的概率为领导角色。
故障的重新实现选举:
1.如果我们跟随者节点不能够及时的收到领导角色消息,那么这时候跟随者就会将当前自己的状态由跟随者变为竞选者角色,会给其他的节点发出选举的投票的通知,只要该竞选者有超过半数以上即可选为领导角色。
疑问:
是否可能会产生两个同时的竞选者呢,同时实现拉票呢?
注意当我们的集群节点总数,如果是奇数情况下 就算遇到了该问题也不用担心。
当我们的节点是为偶数的情况下,可能会存在该问题,如果两个竞选者获取的票数相等的情况下,开始重置竞选的超时时间,一直到谁的票数最多谁就为领导。
如何实现日志的复制
1.所有的写的请求都是统一的交给我们的领导角色完成,写入该对应的日志,标记该日志为被提交状态。
2.为了提交该日志,领导角色就会将该日志以心跳的形式发送给其他的跟随者节点,只要超过跟随者节点写入该日志,则直接通知其他的跟随者节点同步该数据,这个过程称做为日志复制的过程。
以上内容来自梅特教育-蚂蚁课堂。改编