学习一门技术最好的平台 - 官网
官网地址:https://nacos.io/zh-cn/
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
简单化:Nacos 就是 注册中心 + 配置中心
下载地址:https://github.com/alibaba/nacos/releases
点开bin目录,直接双击startup.cmd(window)即可运行 nacos
出现如下页面表示运行成功:
访问地址:
http://localhost:8848/nacos
引用pom依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
修改yml配置
spring:
application:
name: springcloud-alibaba-provider-payment
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
## 监控端点
management:
endpoints:
web:
exposure:
include: '*'
服务的消费者调用服务的提供者
服务提供者代码
@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负载均衡和Eureka一样,只要在加上:@LoadBalanced
即可实现自动负载均衡
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
添加pom依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
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
各个匹配规则对应如下图:
如果客户端的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默认支持动态刷新
只需要加上注解:@RefreshScope
@RestController
@RefreshScope
public class PaymentController {
当我修改Nacos对应的配置后,不需要重复服务,服务既可获取到最新的配置
命名空间 > Group > Data ID
Bootstarp.yml配置:
就会去需要对应 命名空间 下的 Group 下的 Data ID 配置文件
官方指导文档:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
注意:官网集群搭建的 vip 值的 虚拟ip 一般我们用Nginx 来实现
从上图可以看出,搭建Nacos集群需要的条件:
Nacos 默认自带的是嵌入式数据库derby
Linux 环境 3台
Nginx:Linux已安装好Nginx
Mysql : Linux已安装好Mysql,版本需要 5.6.5+
先要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