SpringCloud Alibaba Nacos 服务治理+配置管理


 

nacos可以同时作为微服务的注册中心、配置中心。
 

搭建nacos-server单机版

下载地址:https://github.com/alibaba/nacos/releases

下载zip压缩包,解压。

conf/application.properties 是nacos-server项目的配置文件,可以根据需要

  • 修改使用的端口(默认8848)、路径(默认nacos)
  • 修改存储方式,默认使用embedded storage内置存储,可以换为mysql方式的外置存储external storage。mysql存储方式需要在mysql中新建数据库 nacos_config ,执行 conf/nacos-mysql.sql 初始化数据库。

进入bin目录,linux执行sh启动|停止,win执行cmd启动|停止。

#linux
sh startup.sh -m standalone
sh shutdown.sh


#win。关闭窗口也会终止nacos server运行。
startup.cmd -m standalone
shutdown.cmd

-m standalone是指定模式为单机模式、不集群。

访问 127.0.0.1:8848/nacos 进入控制台 ,账号、密码默认都是 nacos。

 

搭建nacos-server集群

阿里开源的组件,很牛逼,但通常bug较多。nacos-server集群模式目前bug较多,了解大体流程即可,慎用。
 

推荐使用 域名 + VIP(虚拟ip)模式的注册中心地址,可读性好、切换ip方便。

在这里插入图片描述

1、在每个nacos节点的conf下新建配置文件 cluster.conf

# ip:port,一行一个,配置3个或3个以上节点
192.168.1.2:8848
192.168.1.3:8848
192.168.1.4:8848

 
2、在mysql中新建数据库 nacos_config ,执行 conf/nacos-mysql.sql 初始化数据库
 

3、修改 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&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=abcd

超时、连接池等配置也可以根据需要进行修改。

生产环境建议数据库至少主备模式,或者采用高可用数据库。
 

3、分别启动各个节点

sh startup.sh

sh shutdown.sh

打印出 Nacos started successfully in cluster mode. use external storage 说明启动成功。

访问任意一个nacos server节点即可进入控制台,ip:port/nacos ,集群管理 -> 节点列表 中查看nacos-server集群节点。
 

4、实际项目中,建议为nacos-server绑定一个域名(域名解析 && 修改nginx配置的server_name),在nacos-client端使用域名作为nacos-server的地址,这样即使未来nacos-server需要迁移,也无需修改nacos-client端的配置。

 

服务添加nacos-discovery作为nacos-client

1、父项目的pom.xml统一管理springcloud、springcloud alibaba的版本

<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>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

springcloud alibaba对springboot、springcloud版本有严格要求,版本对应关系参考:
https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

 

2、服务

<!--nacos-client也内置了ribbon-->
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:
  port: 7501

spring:
  application:
    name: user-server

  cloud:
    nacos:
      discovery:
      	#nacos注册中心地址
        server-addr: 127.0.0.1:8848

引导类加不加@EnableDiscoveryClient都行

 

nacos常见概念

服务发现的领域模型

  • namespace:命名空间,用于隔离不同环境,默认public
  • group:给服务划分分组,便于管理,默认DEFAULT_GROUP
  • service:服务
  • cluster:集群
  • instance:服务实例(一个服务节点)

先在控制台创建namespace,再在yml中指定namespace。

一个namespace下的消费者,从注册中心获取提供者节点列表时,只能获取到相同的namespace下的提供者节点列表,即只能调用相同namespace下的提供者。开发、测试、生产环境分别使用不同的namespace,即可实现环境隔离。

控制台的节点下线只是把该节点从负载均衡节点列表中排除,该节点实际仍处于运行状态、仍是正常的。

 

nacos元数据
用于描述服务、配置相关信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label)。根据作用范围可划分为

  • 服务级别的元信息
  • 集群的元信息
  • 实例的元信息

可以在直接控制台设置元数据,也可以在yml中设置,key=value的形式,不用加引号,一行一个。

元数据可以让服务调用更加灵活,eg. 可以在元数据中设置版本号 version=1.0 描述当前实例接口的版本,方便调用指定版本的接口。

 

权重

权重是实例级别的配置,0~1上的浮点数,权重越大,分配给该实例的流量越大,0表示不接受流量,不在负载均衡的节点列表中。

设置权重后,需要过一段时间才会生效(大概几十秒)。

 

健康检查

确认实例 (Instance) 是否能提供服务,对服务发起解析请求时,不健康的实例不会返回给客户端(消费者)。

 

健康保护阈值

为防止因过多实例不健康导致流量全部流向健康实例 ,继而造成流量压力把健康 健康实例压垮并形成雪崩效应。

健康保护阈值是0 到 1 之间的浮点数,当健康实例占总服务实例的比例小于该值时,无论实例是否健康,都会将这个实例返回给客户端。这样做虽然损失了一部分流量,但是保证了集群剩余的健康实例 能正常工作。

 

使用nacos统一管理配置

配置中心用于统一管理配置,快速切换各个环境的配置。

相比于springcloud config,nacos提供了可视化的控制台,操作更方便。
 

nacos-conf的使用

1、pom.xml

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

 
2、bootstrap.yml

spring:
  application:
    name: user-server
  profiles:
    active: dev
  cloud:
    nacos:
      #nacos可以同时作为注册中心、配置中心,但配置的key是分开的,就是说可以用注册中心、配置中心可以是不同的nacos集群,职责可单一
      config:
        #配置中心地址
        server-addr: 127.0.0.1:8848
        #配置文件拓展名,可以使用yaml、properties,默认properties
        file-extension: yaml

配置读取优先级 bootstrap.yml > application.yml,需要将原来的application.yml改为bootstrap.yml作为服务的配置文件。

只需保留应用名称、使用环境、配置中心的3个配置,根据这3个配置就能在配置中心找到对应的配置文件,其余配置(包括使用的端口)都可以移到配置中心。
 

3、在nacos控制台新建配置

data id的完整格式

${prefix}-${spring.profiles.active}.${file-extension}

#示例:user-server-dev.yaml
  • prefix可以在bootstrap.yml中用spring.cloud.nacos.config.prefix指定,缺省时默认为使用spring.application.name的值
  • 未指定spring.profiles.active时,-${spring.profiles.active}为空串,data id变成 ${prefix}.${file-extension}

 

动态刷新配置

在nacos控制台修改服务配置后,默认需要重启服务才能获取最新的配置,使用动态刷新配置后,无需重启,配置立即下发到服务中。

@RestController
@RefreshScope  //@Value注入值的类上加@RefreshScope
public class TestController {

    @Value("${user.name}")
    public String name;   //不要使用static修饰

    @GetMapping("/name")
    public String name(){
        return name;
    }

}

说明

  • nacos-server要使用mysql方式的外置存储,才支持动态刷新配置。
  • @RefreshScope是springcloud的注解,不是nacos的注解,就是说其它种类的配置中心也可以使用此注解。

 

通用配置

同一服务、不同环境的公共配置

可以提取到 ${prefix}.${file-extension} 中,eg. user-server.yaml 。不需要在bootstrap.yml中添加额外的配置。
 

不同服务的公共配置

可以提取到单独的配置中,比如dev环境所有服务的注册中心配置。需要在bootstrap.yml中添加额外配置

spring:
  application:
    name: user-server
  profiles:
    active: dev
  cloud:
    nacos:
      config.:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        #所有服务通用的配置,List<Config>,有多个时逗号分隔
        shared-configs: common1.yaml,common2.yaml

 
nacos config部分源码

public static class Config {

		/**
		 * the data id of extended configuration.
		 */
		private String dataId;

		/**
		 * the group of extended configuration, the default value is DEFAULT_GROUP.
		 */
		private String group = "DEFAULT_GROUP";

		/**
		 * whether to support dynamic refresh, the default does not support .
		 */
		private boolean refresh = false;
		
		//......
		
}

所以上面的配置存在一个问题:公共配置的group只能是默认的DEFAULT_GROUP,不能动态刷新公共配置。
 

可以修改如下

        #所有服务通用的配置
        #shared-configs: common1.yaml,common2.yaml
        shared-configs:
          #List,一个 - 表示一个子元素,不一定要指定全部3个属性,未指定的属性自动取默认值
          - dataId: common1.yaml
            refresh: true
          - dataId: common2.yaml
            refresh: true
  • shared-configs 可以换成 extension-configs ,使用方式、效果相同。
  • 尽量不要利用优先级覆盖其它配置文件中的同名配置项,后续不好维护。
     

nacos还提供了历史配置回滚的功能,十分方便。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值