SpringCloud Alibaba——nacos

SpringCloud Alibaba——nacos

1.Nacos安装启动

  • 为什么叫Nacos?

    Nacos:前四个字符分别是Naming和Configuration的前两个字母,最后的s位Service

  • Nacos是什么?

    Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos就是注册中心+配置中心的组合——Nacos=Eureka+Config+Bus

  • Nacos能干嘛?

    替代Eureka做服务注册中心

    替代Config做服务配置中心

  • 下载:Nacos

  • 安装运行

    本地Java8和Maven环境已经OK

    解压下载好的压缩包

    进入bin目录,在当前目录下打开cmd命令行输入命令 startup.cmd -m standalone

    浏览器访问 http://localhost:8848/nacos
    在这里插入图片描述

    默认的用户名和密码为 nacos
    在这里插入图片描述
    nacos安装完成

2.Nacos做注册中心

  • 创建两个微服务模块作为服务的提供方,注册到Nacos中

    1.父工程pom文件

    <packaging>pom</packaging>
    <!--统一管理jar包版本-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>5.1.47</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>
    
    <!--子模块继承之后,提供作用:锁定版本+子module不用groupId和version-->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.1.0.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type> 
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.spring.boot.version}</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

    2.创建cloudalibaba-provider-payment9001服务

    3.pom文件

    <dependencies>
       <!--springcloud alibaba nacos-->
       <dependency>
           <groupId>com.alibaba.cloud</groupId>
           <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-actuator</artifactId>
       </dependency>
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <optional>true</optional>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-devtools</artifactId>
           <scope>runtime</scope>
           <optional>true</optional>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
    </dependencies>
    

    4.application.yml

    server:
      port: 9001
    spring:
      application:
      	name: nacos-provider-payment
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    

    5.主启动类

    @SpringBootApplication
    @EnableDiscoveryClient
    public class PaymentMain9001 {
      public static void main(String[] args) {
          SpringApplication.run(PaymentMain9001.class,args);
      }
    }
    

    6.简单的controller

    @RestController
    public class PaymentController {
    
      @Value("${server.port}")
      private String serverPort;
    
      @GetMapping("/payment/{id}")
      public String get(@PathVariable("id") String id) {
          return "payment get server.port: " + serverPort + "----->" + id;
      }
    }
    

    7.启动项目,查看http://localhost:8848/nacos上有没有启动的服务
    在这里插入图片描述
    8.第二个服务与上述步骤基本一致,除了端口号和业务逻辑,按照上述步骤创建第二个服务cloudalibaba-provider-payment9002

  • 创建微服务模块作为服务的消费方,注册到Nacos中

    1.创建cloudalibaba-consumer-order80服务
    2.pom文件

    <dependencies>
      <!--springcloud alibaba nacos-->
      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-devtools</artifactId>
          <scope>runtime</scope>
          <optional>true</optional>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
    </dependencies>
    

    3.application.yml

    server:
    port: 80
    spring:
    application:
      name: nacos-consumer-order
    cloud:
      nacos:
        discovery:
          server-addr: localhost:8848
    #消费者将要去访问的微服务名称(成功注册进Nacos的微服务提供方)
    service-url:
    nacos-user-service: http://nacos-provider-payment
    

    4.主启动类

    @SpringBootApplication
    @EnableDiscoveryClient
    public class OrderMain80 {
      public static void main(String[] args) {
          SpringApplication.run(OrderMain80.class,args);
      }
    }
    

    5.配置ribbon

    @Configuration
    public class RestTemplateConfig {
      @Bean
      @LoadBalanced
      public RestTemplate restTemplate(){
          return new RestTemplate();
      }
    }
    

    6.编写controller,远程调用微服务

    @RestController
    public class OrderController {
    
      @Autowired
      private RestTemplate restTemplate;
    
      @Value("${service-url.nacos-user-service}")
      private String serviceUrl;
    
      @GetMapping("/consumer/payment/{id}")
      public String orderGet(@PathVariable("id")String id){
          return restTemplate.getForObject(serviceUrl + "/payment/" + id,String.class);
      }
    }
    

    7.查看nacos中注册的服务
    8.访问 http://localhost/consumer/payment/33,可以发现默认的负载均衡策略为轮询
    Nacos默认支持负载均衡:因为nacos内部集成了ribbon
    在这里插入图片描述

3.Nacos做配置中心

  • 创建cloudalibaba-config-nacos-client3377模块

    1.pom文件

    <dependencies>
        <!--springcloud alibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    

    2.application.yml和bootstrap.yml

    • Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
    • PS:项目启动的时候先加载 bootstrap.yml,然后再加载application.yml,所以在使用配置中心的时候,项目中使用bootstrap.yml,在其中配置一些固定不变的信息,在配置中心配置可变信息
      bootstrap.yml
      server:
         port: 3377
       
       spring:
         application:
           name: nacos-config-client
         cloud:
           nacos:
             discovery:
               server-addr: localhost:8848 #Nacos服务注册中心地址
             config:
               server-addr: localhost:8848 #Nacos作为配置中心地址
               file-extension: yml  #指定yaml格式的配置
               group: DEV_GROUP
               #group: DEV_GROUP
               namespace: e69dbe0a-233d-4b73-a173-89e9e8a1d041
      
       # DataID:
       # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file.extension}
       # nacos-config-client-dev.yml
      
      application.yml
      spring:
        profiles:
          active: dev #开发环境
          #active: test #测试环境
          #active: info
      	```
      
      

    3.主启动类

    @SpringBootApplication
    @EnableDiscoveryClient
    public class NacosConfigClientMain3377 {
        public static void main(String[] args) {
            SpringApplication.run(NacosConfigClientMain3377.class,args);
        }
    }
    

    4.controller编写

    @RestController
    @RefreshScope //支持Nacos的动态刷新功能,实现配置的自动更新
    public class ConfigController {
    
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/config/info")
        public String getConfigInfo(){
            return configInfoN;
        }
    }
    

    5.在Nacos上添加配置
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    6.启动项目,访问http://localhost:3377/config/info
    7.更改Nacos上的配置信息,再访问上面的地址,发现修改的信息自动更新了

  • Nacos分类配置

    问题一:实际开发中,通常一个系统会有不同的环境,dev开发环境、test测试环境、prod生产环境,如何指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
    问题二:一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?
    在这里插入图片描述

    在这里插入图片描述

    namespace用于区分部署环境,Group和DataID逻辑上区分两个目标对象
    默认情况下,namespace=public,Group=DEFAULT_GROUP,cluster=DEFAULT
    ①Namespace:主要用来实现隔离。比如现在有三个开发环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
    ②Group:Group可以把不同的微服务划分到同一个分组里面去。
    ③Service:Service就是微服务,一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比如说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
    ④Instance:就是微服务的实例。
    三种方案加载配置

    1. DataID方案:指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置
      ①新增DataID为nacos-config-client-test.yml的配置
      在这里插入图片描述

      ②将resources下的application.yml文件中spring.profile.active改为test
      在这里插入图片描述

      ③访问http://localhost:3377/config/info,可以发现注册信息变成了nacos上配置的DataID为nacos-config-client-test.yml的信息

    2. Group方案
      ①新建Group分别为DEV_GROUP和TEST_GROUP的配置
      在这里插入图片描述

      ②修改bootstrap.yml和application.yml文件
      在这里插入图片描述

      在这里插入图片描述

      ③访问http://localhost:3377/config/info,可以发现注册信息变成了nacos上配置的group为TEST_GROUP的信息

    3. Namespace方案
      ①在命名空间新建命名空间dev
      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

      ②在namespace为dev下新建配置
      在这里插入图片描述

      在这里插入图片描述

      ③修改application.yml和bootstrap.yml文件
      在这里插入图片描述

      在这里插入图片描述

      ④访问http://localhost:3377/config/info,可以发现注册信息变成了nacos上配置的namespace为dev的信息

4.Nacos集群化和持久化配置

  • 目前我们只有一个nacos服务:localhost:8848,在实际生产环境中不可能只有一个nacos服务,肯定是部署多个nacos服务,部署到多台服务器上,搭建成集群,保证高可用。

  • 默认Nacos使用嵌入式数据库实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储。简单来说,就是每个Nacos把自己的配置信息存放到内嵌的derby数据库中,启动三个nacos节点,就会有三份数据库,而每个数据库中的配置信息都不一样,所以采用外部的高可用的MySQL集群来统一存放的配置信息。

  • Nacos集群架构图

    在这里插入图片描述

  • 单机Nacos持久化配置(MySQL版本要在5.6.5以上)

    ① 由于Nacos默认采用自己内嵌的derby数据库,所以要先从derby切换到本地MySQL。在Nacos目录下的conf目录下找到nacos-mysql.sql,在本地创建数据库nacos_config,在此数据库下执行sql脚本
    ② 还是在conf目录下找到application.properties文件,在此文件最下方添加以下配置

    spring.datasource.platform=mysql
    
    db.num=1
    db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
    db.user=root
    db.password=root
    

    ③ 再次单机启动nacos,添加的配置信息就会出现在nacos_config下的config_info表中

  • Nacos集群配置

    **准备工作:**三台Linux服务器,nacos压缩包,nginx压缩包,
    ① 下载以.tar.gz结尾的文件:Nacos,然后将下载好的文件分别放入三台服务器中,并解压

    tar -zxvf nacos-server-2.0.0-BETA.tar.gz
    
    tar -zxvf nginx-1.18.0.tar.gz
    

    ② 在其中一台服务器上安装MySQL数据库,具体步骤请看 链接
    ③ 找到指定的SQL脚本,在Linux上的MySQL中执行

    1. 进入解压好的nacos文件下的conf目录
      在这里插入图片描述

    2. 编辑nacos-mysql.sql文件,复制全部内容

    3. 然后用数据库软件SQLyog或navicat连接虚拟机上的MySQL,先创建一个nacos_config库

      CREATE DATABASE nacos_config;
      USE nacos_config;
      
    4. 然后将复制好的脚本执行一遍
      在这里插入图片描述

    ④ 分别在三台服务器中的nacos目录下的conf目录下修改配置文件application.properties,在文件末尾添加以下配置,注意IP地址为安装了MySQL的服务器地址

    spring.datasource.platform=mysql
    
    db.num=1
    db.url.0=jdbc:mysql://192.168.23.131:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=Asia/Shanghai
    db.user=root
    db.password=root
    

    ⑤ 分别启动三台服务器的nacos,浏览器访问 http://IP:8848/nacos 查看效果

    在这里插入图片描述

    ⑥ 配置nginx

    • 安装nginx,请看 链接

    • 修改配置文件

      vim /usr/local/nginx/conf/nginx.conf
      

      将以下内容复制到对应的位置上

      upstream cluster{
              server 192.168.23.131:8848;
              server 192.168.23.132:8848;
              server 192.168.23.133:8848;
      }
      proxy_pass http://cluster;
      

      在这里插入图片描述

    • 按照指定配置文件启动nginx

       cd /usr/local/nginx/sbin
      ./nginx -c /usr/local/nginx/conf/nginx.conf
      

    ⑦ 访问浏览器,查看效果
    在这里插入图片描述

    用户名:nacos
    密码:nacos
    在这里插入图片描述

    • 添加配置
      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

    • 查看配置是否在数据库中持久化

      mysql -uroot -p#登录进入数据库
      
      show databases;#查看所有数据库
      

      在这里插入图片描述

      use nacos_config;#进入nacos_config库中
      show tables;查看库中有哪些表
      

      在这里插入图片描述

      select * from config_info;#查询表中的所有数据
      

      在这里插入图片描述

    到此,Nacos集群化和持久化的配置就完成了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值