• SpringCloud Alibaba-Nacos


    SpringCloud Alibaba-Nacos

    1.Nacos 基础

    1.官网

    https://github.com/alibaba/Nacos

    2.Nacos 是什么?

    1.一句话: Nacos 就是注册中心[替代 Eureka]+配置中心[替代 Config]

    2.Nacos:Dynamic Naming and Configuration Service

    3.Nacos:架构理论基础: CAP 理论 (支持 AP 和 CP, 可以切换)

    3.Nacos 下载&运行

    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

    image-20220915214350385

    image-20220915214426779

    2.创建 Nacos 服务提供者

    1.需求说明/图解

    – 示意图

    image-20220915212757568

    2.代码实现

    1.创建 member-service-nacos-provider-10004 并注册到 NacosServer8848

    2.引入依赖

    
    <dependency>
       <groupId>com.alibaba.cloudgroupId>
       <artifactId>spring-cloud-alibaba-nacos-discoveryartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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: '*'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5.创建 member-service-nacos-provider-10006 并注册到 NacosServer8848,同上

    6.启动测试

    image-20220915223039786

    image-20220915223111184

    3.创建Nacos的服务消费者

    1.需求说明/图解

    – 示意图

    image-20220916215119504

    2.创建 member-service-nacos-consumer-80 并注册到 NacosServer8848

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

    image-20220916223801132

    2.修改 pom.xml

    
    <dependency>
       <groupId>com.alibaba.cloudgroupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4.创建主启动类

    //启用nacos发现注解
    @EnableDiscoveryClient
    @SpringBootApplication
    public class MemberNacosConsumerApplication80 {
        public static void main(String[] args) {
            SpringApplication.run(MemberNacosConsumerApplication80.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    5.业务类

    (1)配置类

    @Configuration
    public class CustomizationBean {
    
        // 配置注入RestTemplate bean/对象
        //这里的@LoadBalanced 就是赋予 RestTemplate 负载均衡的能力
        //默认是使用轮询算法来访问远程调用接口/地址
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate(){
            return new RestTemplate();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    (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);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    6.启动测试

    image-20220916224053923

    image-20220916224028365

    7.配置自己的负载均衡算法,Nacos集成了ribbon可以直接使用

    @Configuration
    public class RibbonRule {
    
        @Bean
        public IRule myRibbon(){
            return new RandomRule();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.Nacos AP 和 CP 切换-理论

    1.各种注册中心对比

    image-20220916224224313

    2.选择 AP 还是 CP?

    1、CP: 服务可以不能用,但必须要保证数据的一致性。

    2、AP: 数据可以短暂不一致,但最终是需要一致的,无论如何都要保证服务的可用。

    3、取舍:只能在 CP 和 AP 选择一个平衡点, 大多数都是选择 AP 模式

    3.AP 和 CP 切换

    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

    5.Nacos 配置中心实例

    1.需求分析/图解

    – 示意图

    image-20220916224610643

    2.在 Nacos Server 加入配置

    1. 进入到 Nacos Server
    2. 加入配置, 注意: 文件后缀.yaml

    e-commerce-nacos-config-client-dev.yaml

    3.创建 Nacos 配置客户端模块 e-commerce-nacos-config-client5000

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

    image-20220917100757299

    2.修改 pom.xml

    
    <dependency>
       <groupId>com.alibaba.cloudgroupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3.创建 application.yml

    spring:
      profiles:
        #指定环境,场景的环境dev/test/prod
        active: dev
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    5.主启动类

    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosConfigClientApplication5000 {
        public static void main(String[] args) {
            SpringApplication.run(NacosConfigClientApplication5000.class,args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    7.测试

    image-20220917223136489

    image-20220917223152426

    8.注意事项和细节

    1. 配置文件 application.yml 和 bootstrap.yml 结合会得到配置文件/资源的地址
    2. 参考文档: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

    image-20220917223341304

    1. 注意在 Nacos Server 的配置文件的后缀是 .yaml , 而不是 .yml
    2. 在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目 的正常启动, 也就是说如果项目不能正确的获取到 Nacos Server 的配置数据,项目是启动 不了的
    3. springboot 中配置文件的加载是存在优先级顺序的,bootstrap.yml 优先级高于 application.yml
    4. @RefreshScope 是 springcloud 原生注解,实现配置信息自动刷新, 如果在 Nacos Server 修改了配置数据,Client 端就会得到最新配置

    6.Nacos 分类配置 (实现配置隔离)

    1.DataID 方案

    1.需求分析/图解

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

    image-20220916225512381

    2.解决方案分析

    1.使用 Data ID 方案解决

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

    3.配置实现
    1. 在 nacos server 创建新的配置:e-commerce-nacos-config-client-test.yaml

    image-20220918152420981

    4.修改 application.yml
    spring:
      profiles:
        #指定环境,场景的环境dev/test/prod
        active: test
    
    • 1
    • 2
    • 3
    • 4
    5.测试

    image-20220918153011762

    2.Group 方案

    1.需求分析/图解

    – 示意图

    image-20220918153142973

    2.解决方案分析

    1.使用 Group 方案解决

    3.配置实现
    1. 在 nacos server 创建新的配置:order/e-commerce-nacos-config-client-dev.yaml

      image-20220918153643522

      image-20220918153709392

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

    image-20220918153859260

    3.修改 application.yml

    spring:
      profiles:
        #指定环境,场景的环境dev/test/prod
        active: dev
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.测试

    image-20220918154111431

    3.Namespace 方案

    1.需求分析/图解

    – 示意图

    image-20220918154202091

    2.解决方案分析

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

    3.配置实现
    1. 在 nacos server 创建新的 namespace , baidu 和 alibaba

    image-20220918154828433

    image-20220918154916063

    image-20220918155047354

    1. 在 nacos server 创建新的 group/dataid

      image-20220918155646453

    image-20220918155632661

    image-20220918155712573

    image-20220918155703003

    3.修改 application.yml

    spring:
      profiles:
        #指定环境,场景的环境dev/test/prod
        active: dev
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    5.测试

    image-20220918160002305

    4.Namespace/Group/Data ID 关系

    1.图解

    image-20220916225657254

    2.详解介绍

    说明

    (1)Nacos默认的命名空间是public,Namespace主要用来实现配置隔离, 隔离范围大

    (2)Group默认是DEFAULT GROUP,Group可以把不同的微服务划分到同一个分组里面去

    (3)Service就是微服务, 相同的Service可以是一个Cluster(簇/集群), Instance 就是微服务 的实例

  • 相关阅读:
    ZZNUOJ_C语言1035:分段函数求值(完整代码)
    #机器学习--高等数学基础--第三章:微分中值定理与导数的应用
    分布式计算实验3 基于PRC的书籍信息管理系统
    【微服务】SpringCloud-Nacos注册中心
    kubernetes集群之Pod优雅重启
    黑白影片智能上色,复原历史重现经典
    Ktor vs Spring Boot:哪个框架能帮助你构建更高性能的 Web 应用?
    JavaEE之CSS②(前端)
    API网关功能一览
    手膜手带你入门 Playwright(TS 版本)
  • 原文地址:https://blog.csdn.net/qq_44981526/article/details/126923634