官方参考文档:https://nacos.io/zh-cn/docs/quick-start.html
官方定义:一个更有利于构建云原生的应用的动态服务发现(Nacos Discovery)、服务配置(Nacos Config)和服务管理平台。
集【注册中心】+【配置中心】+【服务管理】平台
Nacos Descovery
服务注册: Nacos Client 会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如IP地址,端口等信息。NacosServer接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳: 在服务注册后,Nacos会维护一个定时心跳来持续通知Nacos Server,说明服务时一直处于可用状态,防止被剔除。默认是5s发送一次心跳
服务同步: Nacos Server集群之间会相互同步服务实例,用来保证服务信息的一致性。leader,raft
服务发现: 服务消费者(Nacos Client) 再调用服务提供者提供的服务的时候,会先发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client的本地,同时会在Nacos Client本地开启一个定时拉去服务端的注册的表信息更新本地缓存
服务健康检查: nacos Server会开启一个定时任务来检查注册服务实例的健康状况,对于 超过15s
没有收到客户端心跳的实例会将他的 healthy属性
设置成 false
(客户端发现时不会发现这个服务)如果这个实力 超过30s
没有收到客户端的心跳,直接删除该实例,被删除的实例如果恢复了心跳则恢复注册。
CAP C:一致性;A:可用性;P:分区容错性
大多数主流的注册中心都是实现了AP Nacos 支持CP 和AP的切换,你默认是AP
这里为了方便我在日后学习Springloud Alibaba2.2.5RELEASE版本
所以这里需要找到与之对应的版本组件,具体参考如下:
SpringCloud Alibaba Version | Sentinal Version | Nacos version | RocketMQ Version | Dubbo version | Seata Version |
---|---|---|---|---|---|
2.2.5RELAEASE | 1.8.0 | 1.4.1 | 4.4.0 | 2.7.8 | 1.3.0 |
源码下载地址: https://github.com/alibaba/nacos/releases,自行选择源码或者编译过的安装包
安装
1、安装jdk
[root@gitlab ~]# yum -y install java-1.8.0-openjdk*
2、安装nacos-启动命令(standalone代表着单机模式运行,非集群模式)
[root@gitlab ~]# tar zxf nacos-server-1.3.1.tar.gz
[root@gitlab ~]# cd nacos/bin/
[root@gitlab bin]# sh startup.sh -m standalone
启动完成后会输出一句话:
默认的登录密码和账号:nacos
Nacos默认端口为8848
1️⃣在Eclipse里面新建一个Maven的父级工程,以及搭建两个子服务的工程分别为:1、order订单2、stock库存:目录如下:
父Pom文件中支持SpringCloud& SpringCloud Alibaba 引入依赖
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.11.RELEASEversion>
<relativePath />
parent>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<java.version>1.8java.version>
<spring.cloud-version>Hoxton.SR8spring.cloud-version>
properties>
<modules>
<module>DHC_SpringCloud_NacosConfigurationmodule>
<module>DHC_SpringCloud_NacosOrdermodule>
<module>DHC_SpringCloud_NacosStockmodule>
modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud-version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.5.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.0.4.RELEASEversion>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.47version>
dependency>
dependencies>
3️⃣在子模块中 添加相关的nacos依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
dependencies>
4️⃣编写相应的Nacos连接参数配置以及SpringBoot服务的相关配置
Nacos-Order.yml
server:
port: 8010 # 服务访问端口
# 应用程序名称 nacos会以改名曾在当下服务列表里注册服务
spring:
application:
name: order-service # 服务的名称
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos登陆的ip地址
discovery:
username: user # 登录nacos的管理页面的账号
password: user # 登录密码
namespace: public # 默认是public 也可以不配置
Nacos-Stock.yml
server:
port: 8011 # 服务访问端口
# 应用程序名称 nacos会以改名曾在当下服务列表里注册服务
spring:
application:
name: stock-service # 服务的名称
cloud:
nacos:
server-addr: 127.0.0.1:8848 # nacos登陆的ip地址
discovery:
username: user # 登录nacos的管理页面的账号
password: user # 登录密码
namespace: public # 默认是public 也可以不配置
5️⃣编写Nacos的服务端的相关服务以及服务消费者的相关接口调用操做
StockController
@RestController
@RequestMapping("/stock")
public class StockController {
@RequestMapping("/reduct")
public String name() {
return "减扣库存";
}
}
OrderController
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
RestTemplate restTemplate;
@RequestMapping("/add")
public String add() {
System.out.println("下单成功!");
String msg = restTemplate.getForObject("http://stock-service/stock/reduct", String.class);
// String msg = "你好 Nacos";
return "hello world"+msg;
}
}
在服务的调用者(消费者的启动类上注意有的版本需要写一个注解@@EnableDiscoveryClient
)
注意:在Nacos1.4版本以后,就不需要使用@EnableDiscoveryClient的注解
@SpringBootApplication
@EnableDiscoveryClient // nacos版本在1.4以后就可以不用添加 表示nacos启动客户端
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
@Bean
@LoadBalanced // Nacos所提供的负载均衡器的注解
public RestTemplate restTemplate(RestTemplateBuilder builder) {
RestTemplate restTemplate = builder.build();
return restTemplate;
}
}