简介
Nacos是Alibaba在2018年7月发布的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。(官方文档解释)
简单说就是集注册中心与配置中心于一身(nacos = eureka + config)
属于spring-cloud-alibaba开源组件中的一员(Spring Cloud 加盟重量级成员Spring Cloud Alibaba,打造更符合中国国情的微服务体系)
官网:https://nacos.io/en-us/ (当前版本1.1.0,从0.8.0版本开始进入正式版)
源码:https://github.com/alibaba/nacos
官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
三大功能
- 服务发现与服务管理
Nacos同时支持基于DNS和基于RPC(如Dubbo/gRPC)的服务发现,并提供服务的实时健康检查,基于Nacos更方便的实现服务断路器。Nacos提供的服务的元数据管理,路由及流量管理策略能够帮助更好的构建更强壮的微服务平台 - 动态配置管理
动态配置服务允许在所有环境中以集中和动态的方式管理所有应用程序或服务的配置。动态配置消除了配置更新时重新部署应用程序和服务的需要。可以更方便的实现无状态服务,更轻松地实现按需弹性扩展服务实例 - 动态DNS服务
支持权重路由的动态DNS服务可以更轻松地在数据中心内的生产环境中实施中间层负载平衡,灵活的路由策略,流量控制和简单的DNS解析服务,更容易的实现DNS-based服务发现
Nacos安装
github下载
windows下解压后运行/bin/startup.cmd 关闭服务运行shutdown.cmd
Linux环境执行 sh startup.sh -m standalone 关闭服务 sh shutdown.sh -m standalone
待服务启动成功后,访问控制台显示的地址:
进入管理页面:
管理页面分为三大类:
- 配置管理(配置中心)
- 服务管理(服务注册中心)
- 集群管理
资料:
源码分析:http://www.iocoder.cn/categories/Nacos/#
使用Nacos作为注册中心完成服务注册与发现
服务提供者
新建springboot项目,配置pom文件
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Finchley.SR1
pom
import
org.springframework.cloud
spring-cloud-alibaba-dependencies
0.2.2.RELEASE
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-discovery
在应用主类上加上springcloud服务注册发现注解@EnableDiscoveryClient
配置文件(配置注册地址与服务名称)
server.port=8000
spring.application.name=alibaba-nacos-zzb-demo
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
配置好后,启动项目
出现
2019-08-01 10:41:06.741 INFO 8064 --- [ main] o.s.c.a.n.registry.NacosServiceRegistry : nacos registry, alibaba-nacos-zzb-demo 172.xx.xx.xxx:8000 register finished
便表示注册成功了
打开nacos管理页会看到一条服务注册信息
点击详情
可以查看当前服务集群数等详情
服务消费者
新建springboot工程,作为服务的消费者
pom文件、工程应用主类、配置文件与提供者相同
通过Robbin实现
应用主类
@EnableDiscoveryClient
@SpringBootApplication
public class NacosDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDemoApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
controller实例
@RestController
public class TestController {
private final RestTemplate restTemplate;
private static final String SERVICE_NAME = "alibaba-nacos-zzb-demo";
@Autowired
public TestController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/demoTest")
public String demoTest() {
String url = "http://" + SERVICE_NAME + "/test"; //不能通过url直接调用
String forObject = restTemplate.getForObject( url, String.class);
return "URL: " + url + " RETURN: " + forObject;
}
}
启动工程
nacos管理平台已经显示注册上来了
接口访问
通过FeignClient实现
pom文件需要添加
org.springframework.cloud
spring-cloud-starter-openfeign
应用主类
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class NacosDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDemoApplication.class, args);
}
}
controller实例
@RestController
public class TestController {
@Resource
private TestService testService;
@GetMapping("/feignTest")
public String feignTest() {
return testService.test();
}
}
接口访问
使用Nacos作为配置中心
Nacos配置要点
基本概念
- Data Id —— 相当于文件名
- Group —— 分组管理
- Namspace —— 命名空间
解释
Data Id - 默认值为: {spring.profile.active}.${spring.cloud.nacos.config.file-extension}
- spring.cloud.nacos.config.prefix的默认值为${spring.application.name}
- spring.cloud.nacos.config.file-extension的默认值为properties
- 当spring.profiles.active未配置时,则匹配${spring.application.name}.properties
- 若设置了spring.profiles.active而Nacos中存在{spring.application.name}-${spring.profiles.active}.properties,则默认匹配后者,若不存在,则会自动匹配前者
- 由于Nacos建议且默认用spring.application.name作为Data Id的前缀,若要在不同服务中共享项目统一配置,则可以通过配置spring.cloud.nacos.config.shared-dataids或spring.cloud.nacos.config.refreshable-dataids来添加共享配置,前者不支持自动刷新,后者支持 (需要支持刷新的话,需要两个都设置上,亲测有效)
Group
这是一个很灵活的配置项,并没有固定的规定,可以用作多环境、多模块、多版本之间区分配置
Namespace
推荐使用命名空间来区分不同环境的配置,因为使用profiles或group会使不同环境的配置展示到一个页面
可在nacos管理平台服务管理->命名空间配置多个基于不同场景的配置
namespaceSetting
这一项配置将在配置列表中展现
namespaceSetting
nacos在配置命名空间时使用的是命名空间id,不配置默认public环境
配置示例如下
namespace
(注册时配置相同)
nacos后台提供历史版本查询功能(保留30天)
添加配置
在启动好的nacos管理后台创建一条配置
按照需要的情况进行设置(注意Data Id命名规范)
新建springboot项目,配置pom文件
org.springframework.boot
spring-boot-starter-parent
2.0.5.RELEASE
org.springframework.cloud
spring-cloud-dependencies
Finchley.SR1
pom
import
org.springframework.cloud
spring-cloud-alibaba-dependencies
0.2.2.RELEASE
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-alibaba-nacos-config
(above all, 可以看出来discovery和config可以分开用,没有互相依赖的关系)
使用
@RestController
@RefreshScope
public class TestController {
@Value("${serviceTitle:}")
private String serviceTitle;
@Value("${serviceText:}")
private String serviceText;
@GetMapping("/test")
public String test() {
return "GET " + serviceTitle + ":" + serviceText + ";SUCCESS...";
}
}
@RefreshScope用来让这个类下的配置内容支持动态刷新
创建配置文件bootstrap.yml
作为配置中心时,必须要使用bootstrap.yml,因为bootstrap.yml加载顺序优先于application.properties,会默认查找项目名.yml的配置文件
spring:
cloud:
nacos:
config:
server-addr: 172.xx.xx.xxx:8848
启动项目
2019-08-01 18:15:20.920 INFO 15296 --- [ main] o.s.c.a.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'alibaba-nacos-zzb-demo.properties', group: 'DEFAULT_GROUP'
2019-08-01 18:15:20.922 INFO 15296 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='alibaba-nacos-zzb-demo.properties'}]}
当出现上述日志则表示成功
现在访问接口试试
成功 :)