Spring cloud alibaba Nacos Discovery服务注册与发现和Config配置中心

Nacos是什么?

  Nacos是阿里巴巴2018年7月推出来的一个开源项目,是一个更易于构建云原生应用的动态服务注册与发现、配置管理和服务管理平台;Nacos致力于快速实现动态服务注册与发现、服务配置、服务元数据及流量管理;
  Nacos是spring cloud alibaba下的一个组件:
  Nacos约等于spring cloud eureka(注册中心) + spring cloud config(配置中心)

Nacos运行环境部署:

  1、下载Nacos最新的二进制压缩包;
  下载地址:https://github.com/alibaba/nacos/releases
  2、在服务器上解压下载下来的nacos最新的二进制压缩包;

tar -zxvf nacos-server-1.3.1.tar.gz
cd nacos/bin 

  3、启动Nacosserver并且查看logger日志

./startup.sh -m standalone 
tail -f ../logs/nacos.log

注意:单机环境启动nacos必须带-m standalone参数启动,否则无法启动
  nacos客户端访问地址:http://47.110.237.194:8801/nacos
  默认用户名密码:nacos/nacos
Spring cloud alibaba Nacos Discovery服务注册与发现和Config配置中心_第1张图片
Spring Cloud Alibaba Nacos Discovery服务注册发现
Spring cloud alibaba Nacos Discovery服务注册与发现和Config配置中心_第2张图片
  微服务开发是controller调用controller,调用者是服务消费者,被调用者是服务提供者,服务消费者和服务提供者是相对的概念,服务消费者也可以被另一个服务调用,那么此时的服务消费者也是一个服务提供者。

Nacos客户端信息缓存:

  如果消费者已经调用过提供者,此时nacos宕机的话 并不影响消费者调用提供者(利用ribbon缓存到private final Map metada当中),如果nacos宕机之前消费者并没有调用过提供者,则不能进行调用

Nacos作为注册中心使用:

作为注册中心所需要的核心POM依赖:

	
        .version>1.8</java.version>
        .build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        .reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        -boot.version>2.3.0.RELEASE</spring-boot.version>
        -cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
    </properties>


    
        <!--spring boot web依赖-->
        
            org.springframework.boot</groupId>
            spring-boot-starter-web</artifactId>
        </dependency>

        <!--spring-cloud-alibaba nacos服务注册/发现的依赖-->
        
            com.alibaba.cloud</groupId>
            spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            2.2.1.RELEASE</version>
        </dependency>

        <!--spring-boot-starter-actuator监控接口-->
        
            org.springframework.boot</groupId>
            spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--lomboc注解-->
        
            org.projectlombok</groupId>
            lombok</artifactId>
        </dependency>
    </dependencies>

    
        
        	<!-- spring-cloud-alibaba-dependencies父版本控制 -->
            
                com.alibaba.cloud</groupId>
                spring-cloud-alibaba-dependencies</artifactId>
                ${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                import</scope>
            </dependency>
            <!-- spring-cloud-dependencies父版本控制 -->
            
                org.springframework.cloud</groupId>
                spring-cloud-dependencies</artifactId>
                Hoxton.SR3</version>
                <type>pom</type>
                import</scope>
            </dependency>
            <!-- spring-boot-dependencies父版本控制 -->
            
                org.springframework.boot</groupId>
                spring-boot-dependencies</artifactId>
                ${spring-boot.version}</version>
                <type>pom</type>
                import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

在application.properties(或application.yaml) 配置文件中配置 NacosServer地址;

#内嵌tomcat
server.port=8082
#服务名称
spring.application.name=29-nacos-discovery-customer
##注册中心地址
spring.cloud.nacos.discovery.server-addr=http://47.110.237.194:8848

#nacos账户密码
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

#spring boot actuator功能
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always

服务提供者使用 @EnableDiscoveryClient 注解开启服务注册与发现功能;

 @SpringBootApplication
 @EnableDiscoveryClient		//开启服务注册与发现
 public class ProviderApplication {
 	public static void main(String[] args) {
 		SpringApplication.run(ProviderApplication.class, args);
 	}
}

服务消费者@EnableDiscoveryClient 注解开启服务注册与发现功能;@EnableFeignClients开启feign声明式调用

@SpringBootApplication
@EnableDiscoveryClient		//开启服务注册与发现
@EnableFeignClients			//开启Feign声明式调用
public class Application {
    /**
     * Spring cloud Alibaba ribbon负载均衡,默认是ZoneAvoidanceRule策略,
     * 综合判断服务节点所在区域的性能和服务节点的可用性,来决定选择哪个服务;
     * @return
     */
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Spring Cloud Alibaba Nacos Config 配置中心:

  Nacos 提供用于存储配置和其它元数据功能,为分布式系统中的外部化配置提供服务器端和客户端支持,使用Spring Cloud Alibaba Nacos Config就可以在Nacos Server集中管理Spring cloud应用的外部属性配置。
  Spring Cloud Alibaba Nacos config是在启动的bootstrap阶段,将配置加载到Spring环境中;
  Spring Cloud Alibaba Nacos Config使用DataId和GROUP和NAME SPACE确定一个配置;启动好Nacos之后,在Nacos添加如下的配置:

  在项目中使用Nacos来实现应用的外部化配置,需要添加如下依赖:

<!--spring-cloud-alibaba nacos config配置依赖-->

    com.alibaba.cloud</groupId>
    spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

  一、可以在Nacos后台新建配置和管理配置信息:
Spring cloud alibaba Nacos Discovery服务注册与发现和Config配置中心_第3张图片
Spring cloud alibaba Nacos Discovery服务注册与发现和Config配置中心_第4张图片
bootstrap.properties配置文件内容解读分析:

#内嵌tomcat端口配置
server.port=8083

#配置服务名称
spring.application.name=29-nacos-discovery-spring-cloud-config
#spring.application.name=nacos-config
#注册中心地址
spring.cloud.nacos.discovery.server-addr=47.110.237.194:8848


#配置nacos用户名和密码
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos

#配置nacos作为配置中心地址
spring.cloud.nacos.config.server-addr=47.110.237.194:8848


#基于DataId为yam扩展名配置方式
#配置文件格式(默认是properties,不配置就是读取29-nacos-discovery-spring-cloud-config.properties文件,也可以手动配置成yaml那么在nacos创建的时候就要写成29-nacos-discovery-spring-cloud-config.yaml)
spring.cloud.nacos.config.file-extension=yaml
/**
* the suffix of nacos config dataId, also the file extension of config content.
*/
private String fileExtension = "properties";


#Nacos Config配置中心动态刷新
#是否开启读取配置文件自动刷新(默认情况下是开启,修改文件之后前台就自动刷新获取最新的),如果不需要自动刷新设置为false就行
spring.cloud.nacos.config.refresh-enabled=false
/**
* the master switch for refresh configuration, it default opened(true).
*/
private boolean refreshEnabled = true;



#配置默认命名空间下MY_GROUP下的配置数据(此配置就是可以设置默认命名空间下,根据配置的组名称在nacos后台配置的数据当中去获取相应的配置信息,默认是DEFAULT_GROUP,可修改)
#spring.cloud.nacos.config.group=MY_GROUP
/**
* nacos config group, group is config data meta info.
*/
private String group = "DEFAULT_GROUP";



#激活哪份配置文件,原来在spring boot中代表:application-dev.properties
#nacos配置类似:29-nacos-discovery-spring-cloud-config-dev.properties
#              29-nacos-discovery-spring-cloud-config-test.properties(此配置就用开启读取哪份配置文件)
#spring.profiles.active=dev

#基于profile粒度的多环境配置
#${spring.application.name}-${spring.profiles.active}.${file-extension:properties}



#配置命名空间和分组
#spring.cloud.nacos.config.namespace=d6daf259-bd8d-4e95-841e-7ec6c10cbcc6
#spring.cloud.nacos.config.group=DEV_GROUP


#注册服务命名空间和分组
#spring.cloud.nacos.discovery.namespace=d6daf259-bd8d-4e95-841e-7ec6c10cbcc6
#spring.cloud.nacos.discovery.group=DEV_GROUP

使用SpringBoot启动类读取配置参数:

@SpringBootApplication
@EnableDiscoveryClient  //开启注册服务与发现
public class CloudAlibabaConfigApplication {
    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(CloudAlibabaConfigApplication.class, args);
        while (true){
            //当动态配置刷新时,会更新到 Enviroment中,因此此处每隔一秒从Enviroment中获取配置
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.out.println("user name : " + userName + "; age: " + userAge);

            TimeUnit.SECONDS.sleep(1);
        }
    }
}
2021-01-07 14:54:41.139  INFO 2068 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8083 (http) with context path ''
2021-01-07 14:54:41.141  INFO 2068 --- [           main] com.alibaba.nacos.client.naming          : [BEAT] adding beat: {"cluster":"DEFAULT","ip":"192.168.0.56","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":8083,"scheduled":false,"serviceName":"DEFAULT_GROUP@@29-nacos-discovery-spring-cloud-config","stopped":false,"weight":1.0} to beat map.
2021-01-07 14:54:41.185  INFO 2068 --- [           main] com.alibaba.nacos.client.naming          : [REGISTER-SERVICE] public registering service DEFAULT_GROUP@@29-nacos-discovery-spring-cloud-config with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"192.168.0.56","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":8083,"weight":1.0}
2021-01-07 14:54:41.258  INFO 2068 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, DEFAULT_GROUP 29-nacos-discovery-spring-cloud-config 192.168.0.56:8083 register finished
2021-01-07 14:54:42.874  INFO 2068 --- [           main] c.n.c.CloudAlibabaConfigApplication      : Started CloudAlibabaConfigApplication in 13.701 seconds (JVM running for 14.971)
2021-01-07 14:54:42.876  INFO 2068 --- [           main] c.a.n.client.config.impl.ClientWorker    : [fixed-47.110.237.194_8801-47.110.237.194_8802-47.110.237.194_8803] [subscribe] 29-nacos-discovery-spring-cloud-config.properties+DEFAULT_GROUP
2021-01-07 14:54:42.877  INFO 2068 --- [           main] c.a.nacos.client.config.impl.CacheData   : [fixed-47.110.237.194_8801-47.110.237.194_8802-47.110.237.194_8803] [add-listener] ok, tenant=, dataId=29-nacos-discovery-spring-cloud-config.properties, group=DEFAULT_GROUP, cnt=1
2021-01-07 14:54:42.884  INFO 2068 --- [           main] c.a.n.client.config.impl.ClientWorker    : [fixed-47.110.237.194_8801-47.110.237.194_8802-47.110.237.194_8803] [subscribe] 29-nacos-discovery-spring-cloud-config+DEFAULT_GROUP
2021-01-07 14:54:42.884  INFO 2068 --- [           main] c.a.nacos.client.config.impl.CacheData   : [fixed-47.110.237.194_8801-47.110.237.194_8802-47.110.237.194_8803] [add-listener] ok, tenant=, dataId=29-nacos-discovery-spring-cloud-config, group=DEFAULT_GROUP, cnt=1
user name : zhangsan; age: 14
user name : zhangsan; age: 14

Nacos服务配置数据模型:

命名空间:

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

Group:

  Nacos当中的一组配置集合,是组织配置的维度之一,通过一个有意义的字符串(如DEFAULT_GROUP或DEV_GROUP或TEST_GROUP)对一组配置集合进行分组,从而区分Data ID相同的配置集合。如果在Nacos上创建一个配置时未填写分组名称,配置分组名称采用DEFAULT_GROUP。

Data Id:

  Nacos中的某个配置集合的ID,配置集合ID是组织划分配置的维度之一,Data ID通常用于组织划分系统的配置集合,一个系统或者应用可以包含多个配置集合,每个配置集都可以被一个有意义的名称标识;
  
Spring cloud alibaba Nacos Discovery服务注册与发现和Config配置中心_第5张图片
第一种方案:
  默认命名空间(public) + 默认Group分组(DEFAULT_GROUP) + 自定义Data Id(没有默认值);
  默认命名空间:public
  默认Group:DEFAULT_GROUP
  自定义Data Id:
  $ {spring.application.name}-$ {profile}.$ {file-extension:properties}
  例如:nacos-config-dev.yaml
第二种方案:
  默认命名空间 + 自定义Group分组 + 自定义的Data Id(没有默认值);
  默认命名空间:public
  默认Group:MY_GROUP
  自定义Data Id:
  $ {spring.application.name}-$ {profile}.$ {file-extension:properties}
  比如:nacos-config-dev.yaml
第二种方案:
  自定义命名空间 + 自定义Group分组 + 自定义的Data Id(没有默认值);
  默认命名空间:public
  默认Group:MY_GROUP
  自定义Data Id:
  $ {spring.application.name}-$ {profile}.$ {file-extension:properties}
  比如:nacos-config-dev.yaml

Nacos数据持久化和Nacos集群搭建部署后续更新,欢迎一起交流讨论。

你可能感兴趣的:(Spring,cloud,Alibaba,java,spring,cloud,alibaba,spring,boot,分布式,spring,cloud)