大家好,我是哪吒。
本系列为SpringCloud微服务系列,上一篇学习了[图解Nginx,体系架构演变 + Nginx反向代理与负载均衡](/post/720280…) 读哪吒编程,品技能人生。
一、什么是Nacos?
一个更易于构建云原生应用的动态服务发现、服务装备和服务办理渠道。
Nacos的要害特性:
二、注册中心演变及其设计思想
1、RestTemplate调用长途服务
假如此时,服务端接口接口名或参数或恳求方法更改了,那么就得同步修正此restTemplate方法,感觉很麻烦。
@SpringBootTest
class Test {
@Resource
private RestTemplate restTemplate;
@Test
void testSimple() {
// 恳求地址
String url = "http://www.nzbc.com/updateUser";
// 要发送的数据目标
User user = new User();
user.setUserId(1);
user.setName("哪吒编程");
user.setMsg("读哪吒编程,品技能人生");
// 发送post恳求
User result = restTemplate.postForObject(url, user, User.class);
System.out.println(result);
}
}
2、经过Nginx维护服务列表(upStream)
经过Nginx维护服务列表(upStream),假如服务较多的话,在Nginx经过upStream的方法去装备的话,Nginx装备文件会变得十分的难以维护。
3、经过Nacos实现注册中心
这种是最简略的Nacos注册中心,有若干个服务,都注册到Nacos注册中心,调用之前,先到Nacos获取对应接口,然后进行实际的调用。
可是,思考一个问题,假如Nacos宕机了,怎么办?假如从Nacos获取到接口后,调用服务2时,服务2宕机了,怎么办?
4、心跳版Nacos
心跳版Nacos,服务1和服务2和Nacos之间维护一个心跳联系,每5秒跳一次,频率不能太快或许太慢,否者会嗝屁的。
假如Nacos在5秒内没有收到心跳,则表明服务挂了,Nacos会下线此服务。
对于超越15秒没有收到客户端心跳的服务实例,会将它的healthy特点置为false,客户端无法调用healthy为false的服务。
假如超越30秒没有收到心跳,Nacos会直接将此服务除掉。
也能够经过服务端主动刊出的方法,停止注册。
服务1调用服务2时,服务1会经过守时使命到Nacos中获取在线的服务,确保所调用的服务一直都是健康在线的状况。
获取到之后,用缓存将其保存起来,然后经过负载均衡器调用服务2,此时,将不再运用服务端的负载均衡Nginx了。
三、Nacos Discovery
SpringBoot中引入Nacos Discovery,实现与Nacos的无缝衔接,Nacos Discovery能够将服务自动注册到Nacos服务端,而且能够动态感知此服务,并改写服务列表。并将服务的host、port、URL等信息注册到Nacos。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
Nacos 的装备项信息:
四、Nacos中心功用
1、服务注册
Nacos Client会经过发送REST恳求向Nacos Server注册自己的服务,供给自身的元数据,比如host、port、url等信息,Nacos Server在收到注册恳求后,会将这些数据信息存储在一个双层的内存map中。
2、服务心跳
服务注册后,服务顾客和Nacos Server之间会维护一个心跳,守时告诉server,此服务还活着,避免被除掉去。
3、服务同步
Nacos Server集群之间会互相同步已注册的服务,用来确保服务列表的一致性。
4、服务发现
服务顾客在调用服务供给者的服务时,会发送一个REST恳求到Nacos Server,获取健康的服务列表,然后将其缓存到本地,一同敞开一个守时使命,守时拜访Nacos Server,然后更新本地缓存。
5、服务健康检查
Nacos Server会敞开一个守时使命用来检查注册服务实例的健康情况,对于超越15秒没有收到客户端心跳的服务实例,会将它的healthy特点置为false,客户端无法调用healthy为false的服务,假如超越30秒没有收到心跳,Nacos会直接将此服务除掉。
五、作为注册中心
1、Nacos现在功用最全,用的也最多;
2、Eureka,因为挺更的原因,比较新的技能都不支撑了,现在许多公司都将Eureka换成Nacos了,不引荐运用;
3、Zookeeper,用的最多的当地就是和Dubbo一同运用,不支撑负载均衡战略,但能够经过其它组件实现;
4、Consul支撑的也许多;
CAP,C一致性,A可用性,P分区容错性
Nacos | Eureka | Zookeeper | Consul | |
---|---|---|---|---|
一致性协议 | CP + AP | CP | AP | CP |
拜访协议 | HTTP/DNS | HTTP | TCP | HTTP/DNS |
健康检查 | TCP/HTTP/MYSQL/Client Beat | Client Beat | Keep Live | TCP/HTT[/gRPC/Cmd |
负载均衡战略 | 权重/metadata/Seletor | Ribbon | – | Fabio |
雪崩维护 | 有 | 有 | 无 | 无 |
自动刊出 | 支撑 | 支撑 | 支撑 | 支撑 |
监听 | 支撑 | 支撑 | 支撑 | 支撑 |
多数据中心 | 支撑 | 支撑 | 支撑 | 不支撑 |
跨注册中心同步 | 支撑 | 不支撑 | 不支撑 | 支撑 |
Spring Cloud集成 | 支撑 | 支撑 | 支撑 | 支撑 |
Dubbo集成 | 支撑 | 不支撑 | 支撑 | 支撑 |
K8S集成 | 支撑 | 不支撑 | 支撑 | 不支撑 |
六、作为装备中心
1、SpringBoot集成Nacos
Nacos运用key/value方式存储装备信息,为分布式体系中的外部化装备供给服务支撑。
(1)maven文件
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
(2)装备文件
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
blog.name=哪吒编程
blog.language=java
(3)主方法发动类
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
String name = applicationContext.getEnvironment().getProperty("blog.name");
String language = applicationContext.getEnvironment().getProperty("blog.language");
System.err.println("姓名 :"+name+"; 拿手技能: "+language);
}
}
2、支撑装备的动态更新
一秒改写一次。
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while(true) {
//当动态装备改写时,会更新到 Enviroment中,因此这儿每隔一秒中从Enviroment中获取装备
String name = applicationContext.getEnvironment().getProperty("blog.name");
String language = applicationContext.getEnvironment().getProperty("blog.language");
System.err.println("姓名 :"+name+"; 拿手技能: "+language);
TimeUnit.SECONDS.sleep(1);
}
}
}
3、可支撑profile粒度的装备
4、支撑自定义 namespace 的装备
开发测验环境和出产环境的资源(如装备、服务)隔离等,比如dev和prod。
5、支撑自定义 Group 的装备
在没有明确指定 ${spring.cloud.nacos.config.group}
装备的情况下, 默许运用的是 DEFAULT_GROUP 。假如需要自定义自己的 Group,能够经过以下装备来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
6、装备优先级
profile > 默许装备文件 > extension-configs(下标越大优先级越高) > shared-configs(下标越大优先级越高)
7、@RefreshScope
一般都是经过@Value的方式读取装备文件中的信息,可是无法感知修正后的值,需要利用@RefreshScope动态改写。
8、Spring Cloud Config 横向比照Nacos
(1) Spring Cloud Config需要结合Git运用,动态变更需要配合Bus 消息总线来告诉所有的客户端改变;
(2)Spring Cloud Config没有可视化界面;
(3)Nacos运用长轮询更新装备,速度上秒杀Spring Cloud Config;