Nacos是什么
Nacos是什么?好像没听过,不要紧。那Eureka听说过吧,在SpringCloud中做服务注册中心组件,类似的还有Zookeeper、Consul。
所以Nacos也是一个注册中心组件咯,当然是,不过它不仅仅是注册中心。
Nacos也是一个配置中心,比如SpringCloud中的Config,将配置文件版本化管理。
那么Nacos到底是什么呢, 总结为官网一句话就是:
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos能做什么
-
服务注册,发现,的健康检查
Nacos支持基于DNS和基于RPC的服务发现,服务端可以通过SDK或者Api进行服务注册,相应的服务消费者可以使用DNS或者Http查找的方式获取服务列表。Nacos同时提供对服务的实时健康检查,阻止想不健康的主机或服务发送请求,与Eureka类似Nacos也有友好的控制台界面。(其实就是身为一个注册中心应该有的三个功能)
-
动态配置管理
接触过SpringCloud应该对config有所了解,那么配置中心也就很好理解,Nacos支持动态的配置管理,将服务的配置信息分环境分类别外部管理,并且支持热更新。不过与Config不同Nacos的配置信息存储与数据库中,支持配置信息的监听和版本回滚。(其实就是配置中心应该具有的功能)
Nacos无缝接入各大生态
除了对于阿里开源生态体系如 Dubbo 等自身的支持,也非常强调融入其它的开源生态,这里就包括 Java 的微服务生态体系 Spring Cloud,Kubernetes/CNCF 云原生生态体系。
Nacos 无缝支持 Spring Cloud,为 Spring Cloud 用户其提供更简便的配置中心和注册中心的解决方案。
Nacos支持目前几乎所有主流的微服务生态体系。
总结
Nacos从官方的介绍上看,就像是SpringCloud中Eureka+Config+Bus+Git+MQ的一个结合体,当然也不能完全这么理解。Nacos是脱胎于阿里内部的ConfigServer,而ConfigServer早在3.0版本就解决了Eureka在1.0版本留下的隐患,所以从技术的更新和迭代角度来看,稳定版本的Nacos将更适合做为微服务体系中的服务注册发现组件,当然了他也不单单只是注册和发现。更多的特性和功能,不如一起搭建试试吧。
Spring Cloud 接入Nacos作为注册中心
版本以及依赖
<properties>
<spring.boot.version>2.2.5.RELEASE</spring.boot.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
<java.version>1.8</java.version>
</properties>
引入springcloud和springcloudalibaba约定的版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
服务的提供者
添加nacos客户端依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动类配置注解表示可以从nacos发现服务
@EnableDiscoveryClient
配置文件配置nacos地址,服务名称,端口号
server:
port: 10001
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
application:
name: nacos-provider
服务消费者
同样的添加nacos客户端依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动类配置注解表示可以从nacos发现服务
@EnableDiscoveryClient
暂时注入RestTemplate来调用服务,后期再改用Feign
@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer")
public String test(){
return restTemplate.getForObject("http://nacos-provider/test",String.class);
}
}
配置文件
server:
port: 10086
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
application:
name: nacos-consumer
启动nacos服务端,启动nacos-provider,启动nacos-consumer
看到nacos上已经注册了我们的两个服务
访问消费者上的服务,看到服务已经成功的调用完成
到此为止,一个基于nacos的基础服务调用已经完成
nacos接入Feign来调用远程接口
上一节中我们使用了RestTemplate来调用服务端接口,发现不是十分的方便,需要在代码中写死路径,我们希望使用Feign来伪装我们的调用,让代码看上去比较优雅
改造服务消费者
加入feign客户端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类添加feign开启注解
@EnableFeignClients
创建feign调用client
@FeignClient(name="nacos-provider",fallback = DemoClientFallback.class)
public interface DemoClient {
@GetMapping("/test")
public String test();
}
调用失败的降级处理
@Component
public class DemoClientFallback implements DemoClient {
@Override
public String test() {
return "服务调用失败";
}
}
@SpringBootApplication
@RestController
@EnableDiscoveryClient
@EnableFeignClients
public class NacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
// @Bean
// @LoadBalanced
// public RestTemplate restTemplate(){
// return new RestTemplate();
// }
// @Autowired
// private RestTemplate restTemplate;
@Autowired
private DemoClient demoClient;
@GetMapping("/consumer")
public String test(){
// return restTemplate.getForObject("http://nacos-provider/test",String.class);
return demoClient.test();
}
}
启动nacos-consumer,查看调用结果
Spring Cloud接入Nacos作为注册中心
新建nacos配置文件
在Nacos-Server中新建配置,其中Data ID它的定义规则是:${prefix}-${spring.profile.active}.${file-extension}
- prefix 默认为
spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。 - spring.profile.active 即为当前环境对应的
profile
,可以通过配置项spring.profile.active
来配置。 - file-exetension 为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
我这里新建nacos-provider-dev-yaml配置文件,文件内容为:
server:
port: 10010
provider:
name: 张三
改造服务提供者
添加nacos配置中心客户端依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
启动类添加注解,表示修改了配置文件,服务自动更新值
@RefreshScope
使用@Value注入内容
@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RefreshScope
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@Value("${provider.name}")
private String name;
@GetMapping("/test")
public String test(){
return name;
}
}
修改application.yml 为 bootstrap.yml 添加nacos配置发现的注解
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848 ## 服务发现的地址,也就是nacos的地址
file-extension: yaml ## 配置文件的扩展名
application:
name: nacos-provider
profiles:
active: dev ## 环境
重启服务提供者,测试调用结果
可以发现,客户端通过Feign
调用了服务端,服务端从配置中心拿到了值返回给了客户端。
配置共享的规则
- 默认是读取
nacos-provider-dev.yaml
的配置文件(因为本地配置了服务名称了,环境,后缀) - 如果存在
nacos-provider.yaml
的配置文件,会先加载此配置文件,如果nacos-provider-yaml
中的配置和nacos-provider-dev.yaml
中的配置存在冲突,后者会覆盖前者的配置内容 - 如果本地也同样配置了内容,不会被加载,(application.yml存在的时候暂时未测试)
- 上面三种基于组相同的情况下测试的,如果组相同,名称不是服务名,也期望加载,需要配置
shared-configs: nacos.yaml
总结:
如果需要加载同组下的其他配置,可以使用
shared-dataids: shareconfig1.yml,shareconfig2.yml
refreshable-dataids: shareconfig1.yml,shareconfig2.yml
如果需要加载不用组的其他配置,可以使用
ext-config:
- data-id: shareconfig3.yml
group: SHARE3_GROUP
refresh: true
- data-id: shareconfig4.yml
group: SHARE4_GROUP
refresh: true
nacso持久化配置
创建数据库
Nacos的数据库脚本文件在我们下载Nacos-server时的压缩包中就有
进入nacos-server-1.0.1
acosconf
目录,初始化文件:nacos-mysql.sql
修改配置文件
这里是需要修改Nacos-server的配置文件
Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在nacos-server-1.0.1
acosconf
目录下,名为 application.properties
,在文件底部添加数据源配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/mynacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456