zoukankan      html  css  js  c++  java
  • 十四、Nacos服务注册和配置中心

    一、Nacos简介

    1、为什么叫Nacos

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

    2、Nacos是什么

    一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心;
    Nacos:Dynamic Naming and Configuration Service;
    Nacos就是注册中心+配置中心的组合:Nacos = Eureka+Config+Bus

    3、能干嘛

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

    4、去哪下

    https://github.com/alibaba/Nacos

    官网文档:

    nacos官网
    springcloud 中nacos介绍

    各种注册中心比较:
    在这里插入图片描述

    二、安装并运行Nacos

    2.1 基础环境及配置:

    1)本地Java8+Maven环境已经OK
    2)先从官网下载Nacos: https://github.com/alibaba/nacos/releases/tag/1.1.4
    3)解压安装包,直接运行bin目录下的startup.cmd
    4)命令运行成功后直接访问http://localhost:8848/nacos
    默认账号密码都是nacos

    在这里插入图片描述

    三、Nacos作为服务注册中心演示

    3.1 基于Nacos的服务提供者

    在这里插入图片描述

    2、POM文件

    父POM文件增加:

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

    最终文件:

      <!-- 统一管理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>
    
      <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
      <dependencyManagement>
        <dependencies>
    
          <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
          </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>
    
          <!--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>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.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>
    </project>
    

    3、YML文件

    server:
      port: 9001
    
    spring:
      application:
        name: nacos-payment-provider
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #配置Nacos地址
    
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    

    4、主启动

    @EnableDiscoveryClient  #开启客户端服务注册发现
    @SpringBootApplication
    public class PaymentMain9001 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain9001.class,args);
        }
    }
    

    5、业务类

    @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;
        }
    }
    

    6、测试

    测试网址:

    http://lcoalhost:9001/payment/nacos/1
    

    或者

    http://127.0.0.1:9001/payment/nacos/1
    

    7、nacos控制台

    在这里插入图片描述

    查看nacos服务注册中心+服务提供者9001都ok了?

    如果没有问题 为了下一章节演示nacos的负载均衡,参照9001新建9002;

    3.2 基于Nacos的服务消费者

    在这里插入图片描述

    1、新建Module(cloudalibaba-consumer-nacos-order83)

    2、POM文件

        <dependencies>
            <!--SpringCloud ailibaba nacos -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency> 
        </dependencies>
    

    3、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
    

    4、主启动

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

    5、业务类

    ApplicationContextBean类:

    @Configuration
    public class ApplicationContextConfig
    {
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate()
        {
            return new RestTemplate();
        }
    }
    

    OrderNacosController类:

    @RestController
    @Slf4j
    public class OrderNacosController
    {
        @Resource
        private RestTemplate restTemplate;
    
        @Value("${service-url.nacos-user-service}")
        private String serverURL;
    
        @GetMapping(value = "/consumer/payment/nacos/{id}")
        public String paymentInfo(@PathVariable("id") Long id)
        {
            return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
        }
    }
    

    6、测试

    nacos控制台:

    在这里插入图片描述

    测试网址: 查看83访问9001/9002,轮询负载OK?
    http://localhost:83/consumer/payment/nacos/13

    3、服务注册中心对比
    Nacos全景图所示:
    在这里插入图片描述

    Nacos和CAP关系

    在这里插入图片描述

    7. Nacos支持AP和CP模式的切换

    在这里插入图片描述

    四、Nacos作为服务配置中心演示

    Nacos作为配置中心-基础配置

    在这里插入图片描述

    1、新建Module(cloudalibaba-config-nacos-client3377)

    2、POM文件

            <!--nacos-config-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            </dependency>
            <!--nacos-discovery-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!--web + actuator-->
            <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>
         
    

    3、YML

    在这里插入图片描述

    application.yml配置信息

    spring:
      profiles:
        active: dev
    

    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 #指定yaml格式的配置
    

    4、主启动

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

    5、业务类

    @RestController
    @RefreshScope
    public class ConfigClientController
    {
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/config/info")
        public String getConfigInfo() {
            return configInfo;
        }
    }
    

    注意:
    @RefreshScope

    在这里插入图片描述

    6、在Nacos中添加配置信息

    Nacos界面配置对应

    在这里插入图片描述
    配置完成
    在这里插入图片描述

    7、Nacos中的匹配规则

    Nacos中的匹配规则,Nacos中的dataid的组成格式与SpringBoot配置文件中的匹配规则
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    运行后找不到配置文件 :这里有大坑

    在这里插入图片描述

    五、Nacos作为配置中心-分类配置

    在这里插入图片描述

    1、问题:多环境多项目管理

    在这里插入图片描述

    2、Nacos的图形化管理界面

    配置管理:
    在这里插入图片描述

    命名空间:

    在这里插入图片描述

    3、Namespace+Group+Data ID三者关系?为什么这么设计?

    在这里插入图片描述

    4、举例子: Case

    在这里插入图片描述

    也可以直接指定需要加载的配置

    spring.application.name=gulimall-product
    #
    spring.cloud.nacos.config.server-addr=121.89.172.98:8848 #nacos服务地址
    spring.cloud.nacos.config.namespace=aa1cc650-df22-4230-951f-ab259c8d1847 命名空间id
    spring.cloud.nacos.config.group=dev	#分组id
    ##
    spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
    spring.cloud.nacos.config.ext-config[0].group=dev
    spring.cloud.nacos.config.ext-config[0].refresh=true
    ##
    spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml
    spring.cloud.nacos.config.ext-config[1].group=dev
    spring.cloud.nacos.config.ext-config[1].refresh=true
    ##
    spring.cloud.nacos.config.ext-config[2].data-id=other.yml
    spring.cloud.nacos.config.ext-config[2].group=dev
    spring.cloud.nacos.config.ext-config[2].refresh=true
    #
    

    六、centos7安装nacos

    下载地址:nacos

    解压运行
    官方安装运行步骤

    https://nacos.io/zh-cn/docs/quick-start.html 单机版运行
    运行日志:在nacos/logs/下查看运行日志

    问题1运行出错:

    readlink: 缺少操作数
    Try 'readlink --help' for more information.
    dirname: 缺少操作数
    Try 'dirname --help' for more information.
    ERROR: Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! !!
    

    解决方案:
    参考地址:Nacos启动报错解决:which: no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

    1. 没有配置java的环境变量

    2. java环境变量的配置方法不是安装JAVA_HOME的方式

    3. nacos这边是java_home下的bin目录,当时安装jdk使用的yum命令安装的,自动没带上jre目录。所以修改了java_home的路径到jre即可。

    最终的配置文件
    在这里插入图片描述

    运行成功:

    问题2:虚拟机内部可以访问 nacos 在windows中无法访问

    解决方案
    关闭防火墙

    CentOS 7.0默认使用的是firewall作为防火墙
    查看防火墙状态

    firewall-cmd --state
    

    停止firewall

    systemctl stop firewalld.service
    

    禁止firewall开机启动

    systemctl disable firewalld.service 
    

    application.properties配置

    把样例配置复制出来一份 注意后缀 应该为 .properties
    在这里插入图片描述

    配置mysql
    在这里插入图片描述
    mysql 授权远程访问
    GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘123456’ WITH GRANT OPTION;
    flush privileges;
    如果不是本地的还要注意远程的端口是否开放

    配置集群

    centos7配置

    复制出集群配置文件(注意后缀.conf)并编辑
    在这里插入图片描述

    192.168.88.3:3333
    192.168.88.3:4444
    192.168.88.3:5555
    

    把nacos项目复制3份 份别修改各自端口号
    最终失败!!!

    问题:运行后虚拟机卡死

    解决办法
    修改nacosinstartup.sh文件调整java虚拟机启动内存

    默认为2G 修改为128M即可

    在这里插入图片描述

    转换采用windows版本的

    windows版本配置(数据库配置参考上边)

    启动方式:

    startup -m cluster 以集群方式启动

    1.把项目复制三份(避免复制这里采用虚拟机运行参数设置把一个项目启动三次)
    2. 配置nacosconfcluster.conf 注意 是.conf 最终加载的是,conf文件 不加载.example(示例文件)

    格式为 ip地址:端口号
    在这里插入图片描述

    1. 修改nacosin下的startup.cmd

    修改启动的端口号 把startup.cmd复制三份 分别修改端口为3333 4444 5555
    在这里插入图片描述

    1. 最终启动这三个cmd 注意加参数 -m cluster 为集群启动 windwos下默认为单击模式
      在这里插入图片描述
    2. 进入http://127.0.0.1:4444/nacos/查看

    在这里插入图片描述

    安装nginx

    参考地址CentOS 7 下 yum 安装和配置 Nginx (亲测无坑)

    修改 ginx-1.18.0conf ginx.conf

    在这里插入图片描述
    运行

    ./nginx -c /tool/nginx/nginx.conf
    

    查看是否运行成功

    ps -ef|grep nginx
    

    在这里插入图片描述
    由于nacos在centos7下集群启动失败
    所以nginx也采用windows配置 (和centos7配置相同)

    http://127.0.0.1:1111/nacos/ 查看
    成功
    在这里插入图片描述

    测试服务注册

    yml中注册中心地址修改为nginx 利用nginx负载均衡到nacos
    在这里插入图片描述

    最后发现 三个nacos中都存在该服务了
    在这里插入图片描述

    用消费端远程调用服务提供者 也是好用的

    现在关闭nginx 发现三个nacos中的服务都没了 但是 不影响 消费端调用服务提供者不知道为什么

  • 相关阅读:
    别人走的路--2
    win7下80端口被(Pid=4)占用的解决方法
    实习第一天原来是配置环境
    api接口大全
    java计算两个日期之间相隔的天数
    【转】overload与override的区别
    Overload和Override的区别?
    浅析Java中的final关键字
    JAVA中的finalize()方法
    封装
  • 原文地址:https://www.cnblogs.com/idcode/p/14551370.html
Copyright © 2011-2022 走看看