https://github.com/alibaba/Nacos
1.一句话: Nacos 就是注册中心[替代 Eureka]+配置中心[替代 Config]
2.Nacos:Dynamic Naming and Configuration Service
3.Nacos:架构理论基础: CAP 理论 (支持 AP 和 CP, 可以切换)
1.下载: https://github.com/alibaba/nacos/releases/tag/1.2.1
2.环境要求: Java8/Maven 3.2.x+
3.解压,运行 bin/startup.cmd
4.浏览器 http://localhost:8848/nacos
5.用户名/密码 为 nacos


– 示意图

1.创建 member-service-nacos-provider-10004 并注册到 NacosServer8848
2.引入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-nacos-discoveryartifactId>
dependency>
3.修改yaml
server:
port: 10004
spring:
application:
name: member-service-nacos-provider #配置应用的名称
#配置nacos
cloud:
nacos:
discovery:
#配置nacos Server地址,localhost-nacos部署的服务器ip 8848-服务器端口
server-addr: localhost:8848
#配置暴露所有的监控点
management:
endpoints:
web:
exposure:
include: '*'
4.主启动类
//@EnableDiscoveryClient引入nacos发现注解
@EnableDiscoveryClient
@MapperScan(basePackages = {"com.llp.springcloud.dao"})
@SpringBootApplication
public class MemberNacosProviderApplication10004 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosProviderApplication10004.class, args);
}
}
5.创建 member-service-nacos-provider-10006 并注册到 NacosServer8848,同上
6.启动测试


– 示意图

1.创建 member-service-nacos-consumer-80

2.修改 pom.xml
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
3.创建 application.yml
server:
port: 80
spring:
application:
name: member-service-nacos-consumer-80
#配置nacos
cloud:
nacos:
discovery:
#配置nacos Server地址,localhost-nacos部署的服务器ip 8848-服务器端口
server-addr: localhost:8848
4.创建主启动类
//启用nacos发现注解
@EnableDiscoveryClient
@SpringBootApplication
public class MemberNacosConsumerApplication80 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosConsumerApplication80.class,args);
}
}
5.业务类
(1)配置类
@Configuration
public class CustomizationBean {
// 配置注入RestTemplate bean/对象
//这里的@LoadBalanced 就是赋予 RestTemplate 负载均衡的能力
//默认是使用轮询算法来访问远程调用接口/地址
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
(2)controller测试类
@Slf4j
@RestController
@RequiredArgsConstructor
public class MemberNacosConsumerController {
//定义一个服务端基础地址
//http://member-service-nacos-provider 就是服务提供方注册到Nacos server的服务吗,和eureka不同这里注册到nacos服务名是小写的
public static final String MEMBER_SERVICE_PROVIDER_URL = "http://member-service-nacos-provider";
//配置RestTemplate
private final RestTemplate restTemplate;
//添加member
@PostMapping("/member/nacos/consumer/save")
public Result save(Member member) {
log.info("member:{}", member);
/**
* url:请求的完整地址
* member:通过restTemplate发出的post请求携带的数据
* Result.class: 返回对象类型
* 注意:restTemplate底层发送数据是通过json字符串进行传输的,服务端接受数据需要加上@RequestBody注解才能解析数据
* 传输的数据通过流进行传输,需要实现序列化接口
*/
return restTemplate.postForObject(MEMBER_SERVICE_PROVIDER_URL + "/member/save", member, Result.class);
}
//查询member
@GetMapping("/member/nacos/consumer/get/{id}")
public Result<Member> getMemberById(@PathVariable("id") Long id) {
return restTemplate.getForObject(MEMBER_SERVICE_PROVIDER_URL + "/member//get/" + id, Result.class);
}
}
6.启动测试


7.配置自己的负载均衡算法,Nacos集成了ribbon可以直接使用
@Configuration
public class RibbonRule {
@Bean
public IRule myRibbon(){
return new RandomRule();
}
}

1、CP: 服务可以不能用,但必须要保证数据的一致性。
2、AP: 数据可以短暂不一致,但最终是需要一致的,无论如何都要保证服务的可用。
3、取舍:只能在 CP 和 AP 选择一个平衡点, 大多数都是选择 AP 模式
1.说明
(1) Nacos 集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则(一般不切 换)
(2) CURL切换命令: curl -X PUT ‘$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP’
(3) URL指令: $NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
2.参考: https://www.jianshu.com/p/c56e22c222bb
– 示意图

e-commerce-nacos-config-client-dev.yaml
1.创建 Module,创建 e-commerce-nacos-config-client5000 模块

2.修改 pom.xml
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
3.创建 application.yml
spring:
profiles:
#指定环境,场景的环境dev/test/prod
active: dev
4.创建 bootstrap.yml
server:
port: 5000
spring:
application:
#这里的name需要参考nacos 配置中心的Data Id
name: e-commerce-nacos-config-client
cloud:
#配置nacos
nacos:
discovery:
#服务注册中心地址
server-addr: localhost:8848
config:
#配置中心地址,注意实际开发中配置中心的地址和注册中心的地址可能是分离的
server-addr: localhost:8848
#指定yaml格式的配置
file-extension: yaml
#说明
#1. nacos 配置客户端/当前的微服务模块, 会根据配置,找到配置中心的数据(配置文件)
#2. config.server-addr: localhost:8848 可以找到配置中心
#3. spring.application.name 对应是DataId e-commerce-nacos-config
#4. 在application.yml: 配置 spring.profiles.active dev
#5. spring.cloud.nacos.config.file-extension 配置文件的扩展名 .yaml
#6. 小结: 根据配置 就是 到 localhost:8848 下的 e-commerce-nacos-config-client.yaml
# 获取配置信息/数据
#7. 规则就是: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 来定位配置中心的 Data ID
5.主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientApplication5000 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientApplication5000.class,args);
}
}
6.业务类
@Slf4j
//配置信息发生改变,自动刷新
@RefreshScope
@RestController
public class NacosConfigClientController {
/**
* 1. client 会拉取nacos server 的 e-commerce-nacos-config-client-dev.yaml
* config:
* ip: "192.168.109.1""
* name: "llp"
* 2. @Value("${config.ip}") 会将 config.ip 赋给 configIp
* 3. 这里${config.ip} 根据nacos配置内容来的
*/
@Value("${config.ip}")
private String configIp;
@Value("${config.name}")
private String configName;
@GetMapping("/nacos/config/ip")
public String getConfigIp(){
return configIp;
}
@GetMapping("/nacos/config/name")
public String getConfigName(){
return configName;
}
}
7.测试


8.注意事项和细节

Nacos作为配置中心如何实现配置隔离呢? 比如:开发环境、测试环境、生产环境的配置隔离,利用Nacos如何实现呢?

1.使用 Data ID 方案解决
2.Data ID 组成${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}==》服务名-配置文件actice-文件扩展名

spring:
profiles:
#指定环境,场景的环境dev/test/prod
active: test

– 示意图

1.使用 Group 方案解决
在 nacos server 创建新的配置:order/e-commerce-nacos-config-client-dev.yaml


在 nacos server 创建新的配置:seckill/e-commerce-nacos-config-client-dev.yaml

3.修改 application.yml
spring:
profiles:
#指定环境,场景的环境dev/test/prod
active: dev
5.修改 bootstrap.yml
#增加group参数
server:
port: 5000
spring:
application:
#这里的name需要参考nacos 配置中心的Data Id
name: e-commerce-nacos-config-client
cloud:
#配置nacos
nacos:
discovery:
#服务注册中心地址
server-addr: localhost:8848
config:
#配置中心地址,注意实际开发中配置中心的地址和注册中心的地址可能是分离的
server-addr: localhost:8848
#指定yaml格式的配置
file-extension: yaml
group: order
5.测试

– 示意图

除了前面的DataID和Group隔离配置的方式,Nacos支持命名空间进行配置隔离。我们主要还是需要掌握这三种方式的使用以及各自的区别。而具体使用哪一种需要结合业务实际情况,进行使用。



在 nacos server 创建新的 group/dataid




3.修改 application.yml
spring:
profiles:
#指定环境,场景的环境dev/test/prod
active: dev
4.修改 bootstrap.yml
server:
port: 5000
spring:
application:
#这里的name需要参考nacos 配置中心的Data Id
name: e-commerce-nacos-config-client
cloud:
#配置nacos
nacos:
discovery:
#服务注册中心地址
server-addr: localhost:8848
config:
#配置中心地址,注意实际开发中配置中心的地址和注册中心的地址可能是分离的
server-addr: localhost:8848
#指定yaml格式的配置
file-extension: yaml
group: search
namespace: a8e51ab6-bd7c-4544-9c42-6891804b4b8b
5.测试


说明
(1)Nacos默认的命名空间是public,Namespace主要用来实现配置隔离, 隔离范围大
(2)Group默认是DEFAULT GROUP,Group可以把不同的微服务划分到同一个分组里面去
(3)Service就是微服务, 相同的Service可以是一个Cluster(簇/集群), Instance 就是微服务 的实例