• 【微服务】- SpringCloudAlibaba的Nacos


    1.简介

    为什么叫Nacos

    前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service.

    是什么

    Nacos= Eureka +Config + Bus

    功能

    替代Eureka做服务注册中心
    替代Config做服务配置中心

    官网

    https://nacos.io/zh-cn/docs/what-is-nacos.html
    下载地址:https://github.com/alibaba/nacos/releases

    注册中心对比

    在这里插入图片描述
    据说Nacolp在阿里巴巴内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验

    安装及运行

    在这里插入图片描述

    2.nacos作为服务注册中心

    和eureka和zookeeper类似如果要使用nacos注册中心只需要在yml配置文件中进行配置即可。

    1.nacos作为服务提供者

    建立9001项目

    • 建项目
      项目名称:cloudalibaba-provider-payment9001
    • 写pom
    • 写yml
    server:
      port: 9001
    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    
    # 暴露端口,方便监控服务
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
    • 主启动
    • 业务类
      controller
    @RestController
    public class PaymentController {
    
        @Value("${server.port}")
        private String serverPort;
    
        @GetMapping(value = "/payment/nacos/{id}")
        public String getPayment(@PathVariable("id") Integer id) {
            return "nacos registry, serverPort: " + serverPort + "	 id" + id;
        }
    
    }
    

    简单的程序只输出其端口

    测试

    启动nacos和83项目,访问http://localhost:8848/nacos

    在这里插入图片描述
    已经注册入nacos
    访问http://localhost:9001/payment/nacos/3
    在这里插入图片描述
    可以正常访问服务提供者搭建成功。

    为了演示nacos的负载均衡功能参照9001,新建9002

    2.nacos作为服务消费者替代Eureka

    下面开始nacos作为服务中心项目的建立

    建项目

    若部分代码没有给出,请在远程仓库https://gitee.com/gyhdx/cloud2020查找

    • 新建项目
      项目名称:cloudalibaba-consumer-nacos-Order83

    • 写pom

    • 写yml

    server:
      port: 83
    spring:
      application:
        name: nacos-order-consumer
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    
    # 不在项目启动中起作用,仅作为一个公有配置,方便项目中使用
    service-url:
      nacos-user-service: http://nacos-payment-provider
    
    • 主启动
      NacosConsumerMain83.class类
    • 业务类
      config
    package wf.springcloudalibaba.config;
    
    /**
     * @Description TODO
     * @Author gyhdx
     * @Date 2020/4/25 21:46
     */
    @Configuration
    public class ApplicationContextConfig {
    
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemple(){
            return new RestTemplate();
        }
    }
    

    controller

    
    package wf.springcloudalibaba.controller;
    
    /**
     * @Description TODO
     * @Author gyhdx
     * @Date 2020/4/25 21:48
     */
    @RestController
    @Slf4j
    public class NacosController {
    
        @Resource
        private RestTemplate restTemplate;
    
    	//获取yml中的相关配置值
        @Value("${service-url.nacos-user-service}")
        private String path;
    
        @GetMapping(value = "/consumer/payment/nacos/{id}")
        public String paymentInfo(@PathVariable("id") Long id){
            return restTemplate.getForObject(path+"/payment/nacos/"+id,String.class);
        }
    }
    

    测试

    启动nacos和83项目,访问http://localhost:8848/nacos

    在这里插入图片描述

    访问http://localhost:83/consumer/payment/nacos/3
    第一次访问在这里插入图片描述
    刷新页面在这里插入图片描述
    实现了轮询访问服务提供者,证明Nacos负载均衡起作用

    nacos中的负载均衡

    在这里插入图片描述
    可以看到nacos依赖中已经自带了负载均衡Ribbon。

    3.nacos作为配置中心替代Config

    nacos的cap

    在这里插入图片描述

    在这里插入图片描述

    Nacos支持AP和CP模式的切换

    C是所有节点在同一时间看到的数据是一致的; 而A的定义是所有的请求都会收到响应。

    何时选择使用何种模式?

    一般来说,
    如果不需要存储服务级别的信息且服务实例是通过nacos- client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性, 因此AP模式下只支持注册临时实例。

    如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。

    CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

    可以通过cmd执行
    curl -XPUT ‘$NACOS_ SERVER:8848/nacos/v1/ns/operator/switches?ntry=serverMode&value=CP’
    来实现nacos的CP模式切换

    1.代码演示nacos配置中心功能

    新建项目

    • 建项目
      项目名称:cloudalibaba-config-nacos-client3377
    • 写pom
    • 写yml
      因为Nacos同springcloud-config一样,在项目初始化时,要保证先丛配置中心进行配置拉取,
      拉取配置之后,才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
      bootstrap.yml
      此次先使用这的配置,不然直接使用仓库中的会出问题
    server:
      port: 3377
    spring:
      application:
        name: nacos-config-client
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
          config:
            server-addr: localhost:8848
            file-extension: yaml
     
    

    application.yml
    该yml是为了支持DataId方案的开发

    spring:
      profiles:
    #    active: test
        active: dev
    
    • 主启动
    • 业务类
      controller
    @RestController
    @RefreshScope
    public class NacosController {
    
        @Value("${config.info}")
        String value;
    
        @GetMapping(value = "/config/nacos/info")
        public String info(){
            return value;
        }
    }
    

    注意在controller中@RefreshScope注解必须配置,为了实现动态刷新功能(Nacos的配置中心,配置发生改变,服务能感知到这种变化)

    在nacos中添加配置信息

    nacos中的匹配规则理论

    Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
    在这里插入图片描述
    简单来说就是
    在这里插入图片描述
    故按照我们在项目中yml的配置,改目标Data Id为nacos-config-client-dev.yaml

    在nacos中添加配置

    在这里插入图片描述
    配置完成下拉,点击发布即可
    在这里插入图片描述
    配置成功后:
    在这里插入图片描述

    测试

    启动3377项目,访问http://localhost:3377/config/nacos/info

    在这里插入图片描述

    配置成功。
    点击编辑修改配置
    在这里插入图片描述
    刷新http://localhost:3377/config/nacos/info
    在这里插入图片描述
    可以看到改变了,这就是上面yml的端口开放实现监控和@RefreshScope共同起作用。

    2.Nacos的分类配置

    多环境多项目的问题

    • 问题1:
      实际开发中,通常一个系统会准备
      dev开发环境
      test测试环境
      prod生产环境。
      如何保证指定环境启动时服务能正确读取到Nacos.上相应环境的配置文件呢?
    • 问题2:
      一个大型分布式微服务系统会有很多微服务子项目,
      每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…
      那怎么对这些微服务配置进行管理呢?

    nacos的图形化管理界面

    • 配置管理
      在这里插入图片描述
    • 命名空间
      在这里插入图片描述

    Namespace+ Group+Data ID3者关系?为什么这么设计?

    • 是什么
      类似Java里面的package名和类名
      最外层的namespace是可以用于区分部署环境的,Group和DatalD逻辑 上区分两个目标对象。
    • 三者关系
      在这里插入图片描述
      默认情况:
      Namespace=public, Group=DEFAULT GROUP,默认Cluster是DEFAULT

    Nacos默认的命名空间是public, Namespace主要用来实现隔离。
    比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三三个Namespace,不同的Namespace之间是隔离的。

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

    Service就是微服务;一个Service可以包含多个Cluster (集群),Nacos默认Cluster是DEFAULT, Cluster是对指定微服务的一个虚拟划分。
    比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,
    这时就可以给杭州机房的Service微服务起一个集群名称(HZ),
    给广州机房的Service微服务起一个集群名称 (GZ) ,还可以尽量让同一个机房的微服务互相调用,以提升性能。

    最后是Instance,就是微服务的实例。

    3.三种方案加载配置

    DataId方案

    指定spring.profile.active和配置文件的DatalD来使不同环境下读取不同的配置

    默认空间+默认分组+新建dev和test两个DatalD

    • 新建dev配置DatalD
      nacos-config-client-dev.yaml
    • 新建test配置DatalD
      nacos-config-client-test.yaml
      在这里插入图片描述
      我们开始配置的application.yml中为dev,此时修改为test
      在这里插入图片描述
      访问http://localhost:3377/config/nacos/info
      在这里插入图片描述
      可以看到,该方案起作用了。

    Group方案

    通过group实现环境区分
    在这里插入图片描述
    在新建时直接修改Group即可
    在这里插入图片描述
    想让项目成功访问,需要在bootstrap.yml中修改一下配置
    在这里插入图片描述
    重启项目,成功访问http://localhost:3377/config/nacos/info
    在这里插入图片描述
    注意此处浏览器显示的内容为nacos中配置的
    在这里插入图片描述
    是通过controller获取
    在这里插入图片描述
    具体规则
    在这里插入图片描述

    namespace方案

    在这里插入图片描述
    可以自定义命名空间的名称、描述和ID,新建dev(开发)、test(测试)两个命名空间。
    回到配置列表查看
    在这里插入图片描述

    在dev命名空间新建配置

    在这里插入图片描述
    然后,对项目的bootstrap.yml文件进行修改
    在这里插入图片描述
    在这里插入图片描述

    此处我的命名空间为dev,group为DEV_GROUP,active环境为dev,说明访问的是
    在这里插入图片描述
    重启项目,成功访问http://localhost:3377/config/nacos/info
    在这里插入图片描述
    namespace方案使用成功。

    3.nacos集群架构说明

    1.集群模式部署

    这个快速开始手册是帮忙您快速在你的电脑上,下载安装并使用Nacos,部署生产使用的集群模式。

    集群部署架构图

    因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面

    http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。

    http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。

    http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式
    在这里插入图片描述
    注意:VIP=virtue ip(虚拟ip,用来在集群环境映射Nacos的真实ip)
    在这里插入图片描述
    在这里插入图片描述
    实现上述架构的一种方案
    在这里插入图片描述

    Nacos支持三种部署模式

    单机模式 - 用于测试和单机试用。
    集群模式 - 用于生产环境,确保高可用。
    多集群模式 - 用于多数据中心场景。

    2.nacos持久化

    因为nacos具备注册中心的功能,以及支持cp故nacos需要数据的持久化。

    默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。
    为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。

    Nacos默认自带的是嵌入式数据库derby

    实现derby数据库到mysql数据库的切换

    官网https://nacos.io/zh-cn/docs/deployment.html
    在这里插入图片描述

  • 相关阅读:
    java之Arrays.asList
    MySql索引
    Maven私服搭建
    基于Docker的GitLab搭建
    ubuntu新建组合用户命令不管用
    Linux 安装jdk
    消息队列
    Netty之大动脉Pipeline
    Netty之大名鼎鼎的EventLoop
    Netty之揭开BootStrap 的神秘面纱
  • 原文地址:https://www.cnblogs.com/wf614/p/12919795.html
Copyright © 2020-2023  润新知