• 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 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
    

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

  • 相关阅读:
    Java日期计算之Joda-Time
    JAVABEAN EJB POJO区别
    Android 知识体系学习路线
    Linux学习路线(尚观)
    嵌入式学习课程实战(尚观)
    嵌入式学习课程体系(尚观)
    嵌入式学习路线尚观
    C/C++的培训路线(达内)
    部分C/C++书籍
    基本路线
  • 原文地址:https://www.cnblogs.com/linqing001/p/14154974.html
Copyright © 2020-2023  润新知