SpringCloud微服务(一),nacos注册与配置中心

nacos安装

  1. 下载地址:https://github.com/alibaba/nacos/releases/tag/1.3.2,本文选择nacos1.3.2 windows版本;
    在这里插入图片描述

  2. 解压之后双击startup.cmd即可启动nacos服务
    在这里插入图片描述

  3. 启动成功界面如下
    在这里插入图片描述
    4.启动失败界面会一闪而过,常见问题有两种:1、db.num is null,2、Unable to start embedded Tomcat
    解决办法:
    a)本地新建nacos数据库,字符集utf-8,将/nacos/config/nacos-mysql.sql文件导入数据库
    在这里插入图片描述
    b)修改**/nacos/config/application.properties**文件,将数据库设置为自己新建数据库地址
    在这里插入图片描述
    c)修改/nacos/bin/startup.cmd文件,原文件为集群模式启动,修改为standalone单机模式启动
    在这里插入图片描述

  4. 启动成功后运行http://localhost:8848/nacos,默认用户名和密码都为nacos,进入nacos
    在这里插入图片描述

Nacos注册中心

  1. 新建父项目,pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringCloud</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <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>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  1. 新建子项目provide1,pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.springcloud</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.springcloud</groupId>
    <artifactId>provider1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider1</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>0.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</project>
  1. 将application.properties文件重命名为bootstrap.yaml文件,添加配置
server:
  port: 9001
spring:
  application:
    name: provide1
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  1. 在启动程序class上添加@EnableDiscoveryClient注解,目的是为了让注册中心能够发现,扫描到改服务。
    在这里插入图片描述
  2. 启动项目,进入nacos控制台界面,provide1服务已成功注册至nacos

在这里插入图片描述

Nacos配置中心

  1. 添加privode1服务配置文件privode1.yml,点击发布
    在这里插入图片描述

  2. 添加mysql.yml公共配置文件,点击发布
    在这里插入图片描述

  3. 修改provide1服务中bootstrap.yaml文件, 引入provide1.yml配置文件,file-extension设置配置文件后缀名,可使用ext-config进行多文件配置,此处引入mysql.yml公共配置文件。

server:
  port: 9001
spring:
  application:
    name: provide1
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yml
        prefix: ${spring.application.name}
        ext-config:
          - dataId: mysql.yml
            refresh: true
  1. 添加Provide01Controller,添加@RefreshScope注解,使该控制器bean范围内的配置都可实现springCloud热配置
@RefreshScope
@RestController
@RequestMapping("/provide1")
public class Provide01Controller {

    @Value("${spring.datasource.driver-class-name}")
    private String driver;

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${user.age}")
    private Integer age;


    @GetMapping("/info")
    public Map<String,Object> getDatasourceInfo(){
        Map<String,Object> map = new HashMap<>();
        map.put("driver",driver);
        map.put("url",url);
        map.put("username",username);
        map.put("password",password);
        map.put("age",age);
        return map;
    }
  1. 启动项目,浏览器输入http://localhost:9001/provide1/info,出现mysql.yml文件的信息,证明provide1服务已成功从nacos读取配置文件。
    在这里插入图片描述
  2. 再次修改nacos控制台mysql.yml文件中age为18,点击发布后
    在这里插入图片描述
    privode1服务已成功刷新读取的配置文件并已重新热部署,再次刷新http://localhost:9001/provide1/info页面,age参数更新为18
    在这里插入图片描述

Nacos配置中心namespace、group、dataId

1. namespace命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

2. group分组
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和 MQ_topic 配置。说人话,就是可以分组,不同的系统或微服务的配置文件可以放在一个组里。比如用户系统和订单系统的配置文件都可以放在同个组中。
3. dataId
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。这个概念来自于官方文档,说人话就是配置文件的名字,相当于主键的作用

  1. 案例安排起来,新建命名空间prod与dev
    在这里插入图片描述
  2. prod命名空间下添加,添加以下文件
    在这里插入图片描述

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

  1. 在实际开发中,通常将开发环境与生产环境配置发布在nacos的不同命名空间内,这里使用spring.profiles.active进行配置文件区分,新建bootstrap-dev.yaml和bootstrap-prod.yaml,修改bootstrap.yaml配置,详细如下

bootstrap-dev.yaml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yml
        # 指定命名空间
        namespace: b9aabac5-fa08-4597-9a0a-61c9121b4509
        # 指定分组,不写则默认为DEFAULT_GROUP
        group: test   
        ext-config:
          - dataId: mysql.yml
            refresh: true
            namespace: b9aabac5-fa08-4597-9a0a-61c9121b4509
            group: DEFAULT_GROUP

bootstrap-prod.yaml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
      config:
        server-addr: localhost:8848
        file-extension: yml
        namespace: 7e9cd221-8123-40d1-8375-e2301edbb276
        group: test
        ext-config:
          - dataId: mysql.yml
            refresh: true
            namespace: 7e9cd221-8123-40d1-8375-e2301edbb276
            group: DEFAULT_GROUP

bootstrap.yaml

server:
  port: 9001
spring:
  application:
    name: provide1
  profiles:
  	# 生产环境prod   开发环境dev
    active: prod

项目结构如下
在这里插入图片描述
7. 修改控制器文件,运行项目

@RestController
@RequestMapping("/provide1")
public class Provide01Controller {


    @Value("${spring.datasource.driver-class-name}")
    private String driver;

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${user.age}")
    private Integer age;

    @Value("${nacos.namespace}")
    private String namespace;


    @Value("${nacos.group}")
    private String group;

    @GetMapping("/info")
    public Map<String,Object> getDatasourceInfo(){
        Map<String,Object> map = new HashMap<>();
        map.put("driver",driver);
        map.put("url",url);
        map.put("username",username);
        map.put("password",password);
        map.put("age",age);
        map.put("namespace",namespace);
        map.put("group",group);
        return map;
    }
}

  1. 再次进入http://localhost:9001/provide1/info页面刷新,可以看到,命名空间prod的配置文件参数已经被加载到privode1服务里面了,后面只需要对bootstrap-prod.yaml或者bootstrap-dev.yaml文件的 namespace参数以及group参数修改,就可以加载到不同的配置文件了!!!!!
    在这里插入图片描述

完结

后面陆续踩坑:FeignSentinelkafkagatewayzipkinSeataDubbo ,欢迎各位大佬指点!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值