SpringCloud Alibaba Nacos - 服务注册和配置中心详解
概述
学习一门技术最好的平台 - 官网
官网地址:https://nacos.io/zh-cn/
Nacos(Naming Configuration Service) 是什么
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
简单化:Nacos 就是 注册中心 + 配置中心
- 能够替代Eureka做服务中
- 能够替代Config做服务配置中心
Nacos 下载安装运行
下载地址:https://github.com/alibaba/nacos/releases
下载完成后解压目录结构如下:
点开bin目录,直接双击startup.cmd(window)即可运行 nacos
出现如下页面表示运行成功:
访问地址:
http://localhost:8848/nacos
Nacos 作为服务注册中心
Nacos配置
引用pom依赖
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改yml配置
spring:
application:
name: springcloud-alibaba-provider-payment
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
## 监控端点
management:
endpoints:
web:
exposure:
include: '*'
然后启动服务,查看nacos控制台:
服务的消费者调用服务的提供者
服务提供者代码
@RestController
public class PaymentController {
@Autowired
private PaymentService paymentService;
@Value("${server.port}")
public String port;
@GetMapping("/payment/timeout/get/{id}")
public CommonResult<Payment> getPaymenttimeoutById(@PathVariable("id") Long id) {
Payment payment = paymentService.getPaymentById(id);
return new CommonResult<Payment>(200, port, payment);
}
@GetMapping("/payment/get/{id}")
public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
Payment payment = paymentService.getPaymentById(id);
return new CommonResult<Payment>(200, port, payment);
}
}
服务调用者代码:
@RestController
public class OrderController {
private final String PAYMENT_URI = "http://springcloud-alibaba-provider-payment";
@Autowired
private RestTemplate restTemplate;
@GetMapping("/order/payment/{id}")
public CommonResult<Payment> paymentByOpenFeign (@PathVariable("id") Long id) {
CommonResult forObject = restTemplate.getForObject(PAYMENT_URI + "/payment/get/" + id, CommonResult.class);
return forObject;
}
@GetMapping("/order/getPaymenttimeoutById/{id}")
public CommonResult<Payment> getPaymenttimeoutById (@PathVariable("id") Long id) {
CommonResult commonResult = restTemplate.getForObject(PAYMENT_URI + "/payment/timeout/get/" + id, CommonResult.class);
return commonResult;
}
}
调用结果:
通过Nacos注册中心,
通过Nacos注册中心,服务调用者调用服务提供者调用成功
Nacos负载均衡
Nacos负载均衡和Eureka一样,只要在加上:@LoadBalanced
即可实现自动负载均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
启动2台服务的提供者注册进Nacos, 即可负载均衡
Nacos 与其他注册中心对比
Nacos 支持AP和CP的切换
Nacos 作为服务配置中心
Nacos作为配置中心的配置
添加pom依赖
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
添加配置bootstrap.yml
文件
bootstrap.yml 比 application.yml的优先级更高
spring:
application:
name: springcloud-alibaba-provider-payment
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
group: DEV_GROUP
namespace: 7d8f0f5a-6a53-4785-9686-dd460158e5d4
Nacos配置规则
官网说明:
各个匹配规则对应如下图:
如果客户端的yml配置如下图,那么客户端就会去Nacos配置中心寻找
Data ID为springcloud-alibaba-provider-payment-dev.yaml
配置文件,加载进来。
配置示例:
Nacos配置中心:
对应客户端的 bootstrap.yml文件
application.yml文件
spring:
profiles:
active: dev
这样配置,该客户端就会去Nacos 配置中心寻找Data ID 为:springcloud-alibaba-provider-payment-dev.yaml 的配置文件
客户端Controller类
@RestController
@RefreshScope
public class PaymentController {
@Autowired
private PaymentService paymentService;
@Value("${config.info}")
private String configinfo;
@GetMapping("/config/info")
public String getConfiginfo() {
return configinfo;
}
启动测试 ,看看是否能加载到Nacos配置中心的 config.info的信息:
看结果,已经成功成配置中心获取到了配置
Nacos动态刷新
Nacos默认支持动态刷新
只需要加上注解:@RefreshScope
@RestController
@RefreshScope
public class PaymentController {
当我修改Nacos对应的配置后,不需要重复服务,服务既可获取到最新的配置
Nacos的命名空间,Group,Data ID
命名空间 > Group > Data ID
Bootstarp.yml配置:
就会去需要对应 命名空间 下的 Group 下的 Data ID 配置文件
Nacos集群 和 持久化
官方指导文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
注意:官网集群搭建的 vip 值的 虚拟ip 一般我们用Nginx 来实现
Nacos集群结构图如下:
从上图可以看出,搭建Nacos集群需要的条件:
- Nignx 集群,确保高可用
- Nacos 至少3台
- Mysql 集群,确保高可用,版本需要 5.6.5+
集群为什么使用Mysql?
Nacos集群搭建
Nacos 默认自带的是嵌入式数据库derby
环境准备:
-
Linux 环境 3台
-
Nginx:Linux已安装好Nginx
-
Mysql : Linux已安装好Mysql,版本需要 5.6.5+
-
找到Nacos解压 目录:nacos\conf\nacos-mysql.sql 脚本
去Mysql数据库执行该脚本即可
搭建步骤:
先要Nacos解压目录的nacos\conf\nacos-mysql.sql 脚本已经在Mysql数据库执行好
-
下载Nacos Linux版本,并上传到Linux系统
-
解压
-
配置集群配置文件
在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置 3个或3个以上节点)# ip:port 192.169.72.129:8848 192.169.72.130:8848 192.169.72.131:8848
-
添加Mysql数据源
修改nacos\conf\application.properties 配置
添加如下:spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://1.1.1.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=user db.password=password
-
配置Nginx
推荐阅读
-
Nacos--在Spring cloud中使用Spring Cloud Alibaba Nacos Discovery(服务注册+配置管理示例)
-
springCloud使用Nacos作为服务发现与注册中心,配置中心
-
SpringCloud + Nacos 做服务注册与配置中心
-
Nacos的集群搭建 和 服务配置中心的 使用
-
Nacos作为服务注册中心&配置中心实战
-
Nacos作为微服务注册中心和配置中心详解
-
Nacos 作为服务注册中心和配置中心 简单Demo
-
Nacos作为微服务架构的注册发现中心和配置中心
-
springcloud 微服务config配置中心 本地获取和远端获取
-
荐 Nacos注册中心、配置中心使用详解