一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
Nacos:Dynamic Naming and Configuration service
就是注册中心+配置中心的组合
等价于
Nacos=Eureka+Config+Bus
替代Eureka做服务注册中心
替代Config做服务配置中心
下载地址
中文官方文档地址
英文官方文档
默认登录账号密码都是nacos
官方文档
cloudalibaba-provider-payment9001
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.0:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
inslude: '*'
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9002 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9002.class,args);
}
}
package com.atguigu.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry, serverPort: "+serverPort+"\t id"+id;
}
}
http://localhost:9001/payment/nacos/1
cloudalibaba-consumer-nacod-order83
同上
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.0:8848
#消费者将要去访问的微服务名称 (注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class,args);
}
}
Config:
package com.atguigu.springcloud.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
Controller:
package com.atguigu.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderNacosController {
//之前的写法
//public static final String SERVER_URL="http://nacos-payment-provider";
//实现配置和代码分离
@Value("${service-url.nacos-user-service}")
private String serverURL;
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id){
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
启动8848/9001/9002/83
http://localhost:83/consumer/payment/nacos/13
Nacos | Eureka | Consul | CoreDNS | Zookeeper | |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | / | CP |
健康检查 | TCP/HTTP/MySQL/Client Beat | Client Beat | TCP/HTTP/gRPC | / | Client Beat |
负载均衡 | 权重/DSL/metadata/CMDB | Ribbon | Fabio | RR | / |
雪崩保护 | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS/UDP | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud 集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo 集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8s集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
Nacos支持AP和CP模式切换
C是所有节点在同一时间看到的数据都是一致的(数据一致);而A的定义是多有的请求都会收到响应(高可用)
切换模式:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
俩个:
Nacos同SpringCloud-config一样 ,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置后,才能保证项目的正常启动。
bootstrap高于application
bootstrap.yml:
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 101.200.198.216:8848 #Nacos服务注册中心地址
config:
server-addr: 101.200.198.216:8848 #Nacos配置中心地址
file-extension: yaml #指定yaml格式的配置
application.yml:
spring:
profiles:
active: dev #表示开发环境
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class,args);
}
}
package com.atguigu.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
匹配规则:
Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
官网地址
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
http://localhost:3377/config/info
多环境多项目管理
问题1
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生成环境
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件?
问题2
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会相应的开发环境、测试环境、预发环境、正式环境等
怎么对这些微服务配置进行管理呢?
类似Java里面的package名和类名
最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象
三者情况:
Nacos默认的命名空间是public,Namespace主要用来实现隔离的、
比方说我们现在又三个环境:开发、测试、生成环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
Group可以把不同的微服务划分到同一个分组里面去。
Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Clulster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,
这时就可以给杭州机房的Service微服务起一个集群名称(HZ),
给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
最后Instance,就是微服务的实例
指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
默认命名空间+默认分组+新建dev和test两个不同的DataID
通过spring.profile.active属性就能进行多环境下配配置文件的读取
测试:
http://localhost:3377/config/info
配什么就加载什么
在nacos图形界面控制台上面新建配置文件DataID
bootstrap+application
group: TEST_GROUP
新建 dev/test的Namespace
回到服务管理-服务列表查看
按照域名配置填写
YML
namespace: 0d8e05fe-6fb9-4879-8e62-abcf0c411e16
测试:
http://localhost:3377/config/info
官网
默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储
官网说明
1、nacos-server-1.1.4/nacos/conf目录下找到SQL脚本
nacos-mysql.sql
执行脚本
2、nacos-server-1.1.4/nacos/conf目录下找到application.properties
将如下代码追加到该文件后面
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
1个Nginx+3个Nacos注册中心+1个Mysql
下载地址
Linux版本,下载好上传到Linux系统中,
wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz
下载完成解压
tar -zxvf nacos-server-1.1.4.tar.gz
SQL脚本:
在Linux系统的mysql上运行该脚本
创建了如下表:
修改conf目录下的application.properties文件
vim application.properties
按i启动文件编辑
在后面追加如下配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
修改完以后按 Shift+:wq 保存文件
复制文件 cluster.conf 并修改
修改后cluster.conf文件内容为
(你自己的ip及每个nacos的端口号)
注:这个ip不能写127.0.0.1,必须是Linux命令hostname -i 能够识别的IP
目录:nacos/bin/startup.sh
集群启动,我们希望可以类似其他软件的shell命令,传递不同的端口号启动不同的nacos实例。
命令:startup.sh -p 3333 表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致
具体操作
cp startup.sh startup.sh.bk
startup.sh -p 3333
startup.sh -p 4444
startup.sh -p 5555
启动nginx和三台nacos
启动nacos:
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
查看nacos集群个数
ps -ef|grep nacos|grep -v grep|wc -l
在sbin目录下启动nginx(使用我们修改的配置文件)
./nginx -c /root/nginx-1.16.1/conf/nginx.conf
查看nginx是否启动
ps -ef|grep nginx
测试:
http://192.168.111.144:1111/nacos
修改yml中的server-addr
server-addr: 192.168.111.144:1111