Nacos入门学习

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

image-20201218131237776

看到nacos上已经注册了我们的两个服务

访问消费者上的服务,看到服务已经成功的调用完成

image-20201218131553870

到此为止,一个基于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 来配置。目前只支持 propertiesyaml 类型。

注意:当 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 ## 环境

重启服务提供者,测试调用结果

image-20201218135234285

可以发现,客户端通过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\nacos\conf目录,初始化文件:nacos-mysql.sql

修改配置文件

这里是需要修改Nacos-server的配置文件

Nacos-server其实就是一个Java工程或者说是一个Springboot项目,他的配置文件在nacos-server-1.0.1\nacos\conf目录下,名为 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

参考:https://www.cnblogs.com/larscheng/

posted @ 2020-12-18 14:59  xdsax  阅读(328)  评论(0编辑  收藏  举报