【Springcloud】Nacos

【Springcloud】Nacos

【一】介绍服务发现:Nacos

(1)服务发现原理

(1)服务发现机制就是通过一个中间件去记录服务提供者的ip地址,服务名以及心跳等数据(比如用mysql去存储这些信息,所以Nacos要配置持久化),然后服务消费者会去这个中间平台去查询相关信息,然后再去访问对应的地址,这就是服务注册和服务发现。
(2)当用户地址发生了变化也没有影响,因为服务提供方修改了用户地址,在中间件中会被更新,当服务消费方去访问中间件时就能及时获取最新的用户地址,就不会出现用户地址发生变化导致服务找不到

(2)什么是Nacos?如何安装和启动?

(1)官方文档:什么是Nacos

(2)下载安装搭建NacosServer
下载Nacos:Nacos下载
搭建Nacos:Nacos搭建
启动服务器:(单机启动模式,非集群)
下载解压后,终端进入bin目录:cd /Library/Java/AllenNacos/nacos/bin
Linux/Unix/Mac:

sh startup.sh -m standalone

Windows:

cmd startup.md

使用此地址进入界面,http://127.0.0.1:8848/nacos/

账号密码均为nacos
在终端进入bin目录使用sh shutdown.sh关闭nacos

(3)配置Nacos持久化到数据库
来到Nacos的解压目录下的conf下的application.properties文件中,将连接到外置本地数据库的代码去掉注释并修改为

自己的数据库和用户名和密码
在这里插入图片描述
修改内容

spring.datasource.platform=mysql
Count of DB:

db.num=1
Connect URL of DB:

db.url.0=jdbc:mysql://127.0.0.1:3306/ry-configcharacterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=你的密码

(3)将应用注册到Nacos

(1)目标
1-用户中心注册到Nacos
2-内容中心注册到Nacos

(2)用户中心注册到Nacos
1-pom加依赖

	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
	</dependency>

2-加注解
早期在启动类上需要加上 @EnableDiscoveryClient注解,现在已经可以不需要加了

3-加yml配置

	spring:
		cloud:
			discovery:
				server-addr: localhost:8848   #指定nacos server的地址
		application:
			name: 服务名称  # 比如 user-center,服务名称尽量用- ,不要用_

注册成功如图所示
在这里插入图片描述4-补充内容
使用DiscoverClient的相关Api可以在代码中获取Nacos提供的微服务的一些信息,调用方法如图:
在这里插入图片描述

【二】Nacos作为服务注册中心演示(替代Eureka)

(1)新建生产者Module,端口为9001

cloudalibaba-provider-payment9001

(2)修改pom,添加依赖

父模块pom引入SpringCloudAlibaba的依赖

<!--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.2.0.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

本模块pom引入nacos-discovery的依赖

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

(3)修改yml配置文件

将9001微服务注册到8848Nacos服务中心

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
@EnableDiscoveryClient
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+"\t id"+id;
    }
}

(6)测试

先启动安装好的Nacos,默认端口就是8848,启动成功后进入 http://127.0.0.1:8848/nacos/ 查看控制台页面

然后启动9001服务的Application,启动成功后再看Nacos页面,可以看到新的服务注册进来了
在这里插入图片描述

(7)参照9001新建9002,准备演示Nacos的负载均衡

Nacos天生自带负载均衡,内部封装集成了Ribbon
在这里插入图片描述

几乎完全拷贝,只是port端口不一样
也进行启动,然后看到新的服务注册进来了
在这里插入图片描述点进详情查看
在这里插入图片描述

(8)新建消费者Module,端口为83

cloudalibaba-consumer-nacos-order83

接下来的修改pom、修改yml配置文件、修改主启动类等等相同的步骤跳过

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848


#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

(9)编写消费者83端口的业务类

编写RestTemplate类的封装,加上了@LoadBalanced注解,83端口消费者根据请求的接口到Nacos服务中心去找,结果会找到两个一样的接口,分别在9001和9002,加上@LoadBalanced注解以后就会实现负载均衡,在这两个接口之间选择使用。

如果不加@LoadBalanced注解会报错,表示分不清用哪一个端口的接口
在这里插入图片描述

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced//负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
@RestController
@Slf4j
public class OrderNacosController {

    @Resource
    private RestTemplate restTemplate;

		//value注解读取的是yml配置文件里的数据,将配置和代码分开
    @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);
    }
}

(10)测试消费者的负载均衡

启动83服务
在这里插入图片描述访问83的端口:http://localhost:83/consumer/payment/nacos/13
可以看到访问的接口在9001端口和9002端口轮流调用
在这里插入图片描述在这里插入图片描述

(11)服务注册中Nacos和Eureka以及Zookeeper、Consul的比较

在这里插入图片描述
在这里插入图片描述
Nacos支持AP和CP模式的切换!!!
在这里插入图片描述

【三】Nacos作为服务配置中心演示(替代Config和Bus)

【1】基本介绍

(1)什么是配置中心?

在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:
在这里插入图片描述总得来说,配置中心就是一种统一管理各种应用配置的基础服务组件。

(2)为什么使用配置中心?

配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。

(3)Nacos配置中心

Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
在这里插入图片描述
配置中心的服务流程如下:
1、用户在配置中心更新配置信息。
2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。

【2】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>

(3)修改yml配置文件

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

在这里需要由bootstrap.yml和application.yml两个配置文件,为的就是方便Nacos和springcloud的Config无缝的迁移。springboot中配置文件的加载是存在优先级顺序的,bootstrap>application。

所以我们要把重点的配置信息放在bootstrap.yml配置文件中,全局的一些配置放在bootstrap.yml,自己单独的配置放在application.yml

bootstrap.yml内容如下

spring:
  application:
    name: nacos-config-client
  profiles:
    active: dev # 表示开发环境,test表示测试环境,info
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定ymal格式的配置
# 配置文件名(data id):${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# nacos-config-client-dev.yaml
# 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

application.yml内容如下

server:
  port: 3377

这两个配置文件合并起来的意思就是:到8848上面找一个名字为XXX.yaml的配置文件

配置文件加载的优先级(由高到低)
bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml

(4)在Application启动类加入注解@SpringBootApplication

添加@EnableDiscoveryClient的注解

(5)创建业务类

@RestController
@RefreshScope//支持Nacos的动态刷新功能
public class ConfigClientController {
		//可以从8848配置中心中读取到${config.info}的值
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

(6)给配置中心默认添加一个数据集 (Data Id)

在这里插入图片描述

在Nacos的配置列表中添加data id,这个id名称的命名规则如下,配置文件名(data id):

${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

1-spring.application.name的值在这里就是配置文件中的nacos-config-client
2-spring.profile.active的值就是dev
3-spring.cloud.nacos.config.file-extension的值就是yaml
4-所以最终的dataId的名称就是nacos-config-client-dev.yaml

加下来开始实操在Nacos中添加配置信息
在这里插入图片描述在这里插入图片描述然后点击发布就行了

(7)编写测试类在Controller类中通过@Value注解获取配置值

启动3377,然后调用接口查看配置信息:http://localhost:3377/config/info
在这里插入图片描述
在这里插入图片描述

(8)动态刷新@RefreshScope

通常会在Controller里边用@Value取出使用,但是你要是想改变他,就要重新改代码,打包,部署,十分麻烦,我们需要让配置文件的值变得动起来,Nacos也采用了Spring Cloud原生注解@RefreshScope实现配置自动更新。

在Nacos配置中心中修改配置的内容,然后在不重启3377的情况,重新访问接口查看3377获取到的配置信息有没有实时刷新
在这里插入图片描述可以看到修改过后的配置信息已经实时刷新了,而且不需要重新服务

【3】Nacos作为配置中心-分类配置

(1)问题:多环境多项目管理

问题1:在实际开发中,通常一个系统会准备 dev开发环境、test测试环境、prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

问题2:在一个大型分布式微服务系统中有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境等等。那怎么对这些微服务配置进行管理呢?

(2)Nacos的图形化管理界面

(3)Namespace+Group+DataID三者关系?为什么这么设计?

在这里插入图片描述默认情况:Namespace=public, Group=DEFAULT_GROUP, 默认Cluster是DEFAULT

在这里插入图片描述

(4)案例

(1)将开发环境配置dev和测试环境配置test放在同一个分组Group(DEFAULT_GROUP)下面,命名空间namespace为默认的public
在这里插入图片描述
(2)将开发环境配置dev和测试环境配置test放在不同的分组,同一个命名空间中
创建配置文件DataID的时候,DataID是一样的,但是指定不同的分组,分别为TEST_GROUP和DEV_GROUP两个分组
在这里插入图片描述在这里插入图片描述
创建完成后的效果如下
在这里插入图片描述
在bootstrap.xml配置文件中引入配置信息的方式,只需要多指明一个分组就可以了
在这里插入图片描述

(3)在不同的命名空间下面新建配置文件
首先新建命名空间
在这里插入图片描述
在这里插入图片描述然后回到服务列表就可以看到上方多出来了两个刚刚创建好的命名空间,可以点进去查看分组和配置文件信息
在这里插入图片描述
在bootstrap.xml配置文件中指定命名空间
在这里插入图片描述

【4】mysql支持,持久化存储配置信息

在单机模式时nacos使用自带的嵌入式数据库derty实现数据的存储,不方便观察数据存储的基本情况,而且在集群情况下会出现数据不一致的情况。我们可以配置mysql数据库,可视化的查看数据的存储。

1、安装数据库,版本要求:5.6.5+
2、进入nacos安装包下的conf文件,找到nacos-mysql.sql文件,复制里面的sql脚本到mysql执行,会创建nacos-config库,专门用来存放nacos的配置信息
3、修改conf/application.properties文件增加mysql支持

# db mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=password

这个application.properties指nacos的解压目录nacos/conf目录下的文件

【四】Nacos配置中心案例

(1)概述

应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数 据库连接参数、启动参数等。

微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移 (分割),这样配置就分散了,不仅如此,分散中还包含着冗余

(2)配置特点

1-配置项容易读取和修改
2-分布式环境下应用配置的可管理性,即提供远程管理配置的能力
3-可以查看配置修改的历史记录
4-不同部署环境下应用配置的隔离性

(3)nacos优点

1-读写性能高
2-自带运维管理界面
3-阿里巴巴开源

(4)配置管理模型

对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。

在这里插入图片描述

(1)Namespace-命名空间:代表不同环境,如开发、测试、生产环境
(2)Group-分组:代表某个项目,如XX医疗项目、XX电商项目
(3)DataId-配置集:每个橡木匣往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件

(5)配置中心案例

1-创建命名空间Namespace

命名空间->新建命名空间,这里我们可以创建uat1、uat2、dev、test等命名空间,代表不同开发环境,例如uat1-验收环境、dev-开发环境、test-测试环境等等,不同环境的ip和文件路径可能会有不同

在这里插入图片描述

在这里插入图片描述

新建配置
在这里插入图片描述
在这里插入图片描述
示例
在这里插入图片描述

(2)在nacos-consumer 项目 中添加pom依赖

<!--配置中心-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

(3)在bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件)文件配置以下内容:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: nacosip:nacosport
        cluster-name: DEFAULT # 默认集群,可不填写
      config:
        file-extension: yaml #nacos选的配置格式
        group: DEFAULT_GROUP # nacosgroup
        namespace: 8ee806e0-6fa8-4842-a051-6f55df4972bc # nacos命名空间
        server-addr: nacosip:nacosport
        cluster-name: DEFAULT # 默认集群,可不填写
        prefix: nacos-rest-consumer #prefix 默认为 spring.application.name 的值

(4)项目结构

在这里插入图片描述

(5)写一个RestController,在Controller上添加 @RefreshScope 实现配置的热加载。代码如下:

 
/**
 * RefreshScope 配置热加载
 * @author BSL
 */
@RestController
@RefreshScope
public class RestConsumerController {
    /**
     * 服务id即注册中心的中的服务名
     */
    private String serviceId = "nacos-provider";
 
    @Value("${common.name}")
    private String common_name;
    @GetMapping(value = "/configs")
    public String getvalue(){
        return common_name;
    }
     @Autowired
    private ConfigurableApplicationContext applicationContext;
    @GetMapping(value = "/configs2")
    public String getvalue2(){
        String common_name = applicationContext.getEnvironment().getProperty("common.name");
        return common_name;
    }
   @Autowired
   LoadBalancerClient loadBalancerClient;
 
    @GetMapping(value = "/service")
    public String service() {
        RestTemplate restTemplate = new RestTemplate();
        ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
        URI uri = serviceInstance.getUri();
        String forObject = restTemplate.getForObject(uri+"/service", String.class);
        return "consumerinvoke" + forObject;
    }
}

(6)测试

启动工程nacos-consumer ,在浏览器上访问localhost:8089/configs,可以返回在nacos控制台上配置的common.name。在nacos 网页上更改common.name的配置,在不重启nacos-provider工程的情况下,重新访问localhost:8089/configs,返回的事修改后的值,可见nacos作为配置中心实现了热加载功能。

(7)配置中心拓展

在使用Spring Cloud配合Nacos Config作为配置中心来使用的时候,Nacos支持对多个环境的配置管理,通常通过命名空间来实现,比如
在这里插入图片描述

public、dev,而如果使用同一个配置中心有多个项目组或者团队或者不同的模块管理的时候,通常使用Group来区分Nacos Config相关的配置详情,在官方文档中都有过介绍,通过阅读可以了解,https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Nacos-config

如果想支持对多个配置文件的使用,bootstrap.yml 需要用到ext-config

创建一个新配置
在这里插入图片描述

bootstrap.yml

spring:
  cloud:
    nacos:
      discovery:
        server-addr: nacosip:nacosport
        cluster-name: DEFAULT # 默认集群,可不填写
      config:
        server-addr: nacosip:nacosport
        cluster-name: DEFAULT # 默认集群,可不填写
        prefix: nacos-rest-consumer #prefix 默认为 spring.application.name 的值
        file-extension: yaml #file-exetension 为配置内容的数据格式
        namespace: 8ee806e0-6fa8-4842-a051-6f55df4972bc # nacose 命名空间id
        ext-config:
          - data-id: nacos-rest-consumer.yaml
            group: DEFAULT_GROUP
          - data-id: nacos-consumer-data-source.yaml # Nacos上配置集的ID,这里要注意的是这个        data-id一定要有后缀名
            group: MYSQL # 自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP
            refresh: true # 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是false,代表启动时获取一次

上面案例中配置了两个拓展配置集分别分配在DEFAULT_GROUP和MYSQL 组上,其中nacos-rest-consumer.yaml不实时刷新,这里nacos-consumer-data-source.yaml优先级大于nacos-rest-consumer.yaml,因为优先级大小的排序是extension-configs[n]中n越大优先级越大,配置集的配置值就越优先

(1)data-id:Nacos上配置集的ID,这里要注意的是这个data-id一定要有后缀名
(2)group:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP
(3)refresh:控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是false,代表启动时获取一次

controller

@Value("${datasource2.root}")
private String root;
@GetMapping(value = "/configs3")
public String getvalue3(){
    return root;
}

【五】实际使用案例

(1)新建命名空间

在这里插入图片描述

在这里插入图片描述

项目的bootstrap.yml配置文件里通过命名空间id找到这个命名空间

(2)在选中的命名空间下面新建配置

命名空间已经指定了,DataId-配置集也就是这个配置文件的名字,会拼上选择的文件格式,也就是damp-ind-api.yml。

Group分组可以自动手写,不改的话就用默认的DEFAULT_GROUP,也可以改成例如global标记成全局的配置
在这里插入图片描述

在这个配置文件中可以写入例如线程池配置、xxljob配置、hdfs配置、mybatis-plus配置等等

(3)编写项目中的bootstrap.xml

配置文件的结构,只需要改动bootstrap.xml即可,根据参数不同去引用不同后缀的配置文件
在这里插入图片描述
例如uat1

bootstrap.yml

server:
  port: 20124 ## 指定端口号
spring:
  main:
    ## 允许循环依赖
    allow-circular-references: true
  ## 应用配置
  application:
    ## 应用名称
    name: damp-ind-api-0965
  profiles:
	## active: dev 
    active: uat1 ## 通过spring.profiles.active 配置多份不同环境的配置文件
  ## cloud 配置
  cloud:
    nacos:
      config:
        file-extension: yml ## 配置文件的后缀
        shared-configs: ## 共享配置,通过【命名空间+分组+配置集】确定一个配置文件
          - data-id: global-common.yml ## 配置集,即配置文件名称
            group: global ## 分组为group
            refresh: true ## 热刷新
          - data-id: global-mybatisplus.yml
            group: global
            refresh: true
          - data-id: global-config.yml
            group: global
            refresh: true
        prefix: damp-ind-api-0965

bootstrap-uat1.yml

spring:
  ## cloud 配置
  cloud:
    ## nacos 配置
    nacos:
      ## nacos 注册中心配置
      config:
        ## 服务器地址
        server-addr: 服务器ip:8848
        ## 命名空间ID
        namespace: 命名空间id
        username: nacos登录名
        password: nacos登录密码

总结一下就是把不同环境通用的一些配置放在bootstrap.yml,而不同环境不同的配置信息放在具体的环境配置文件bootstrap-uat1.yml里。最后把bootstrap.yml里的重点信息放到nacos的配置中心里,最后只在bootstrap.yml取引用nacos配置中心里的配置文件

(4)spring.profiles.active和nacos.config.prefix配置参数详解

(1)spring.profiles.active配置
我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。

对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。

在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:bootstrap.yml加上active就变成了bootstrap-uat1.yml

项目会先从bootstrap-uat1.yml加载配置,再从bootstrap.yml配置文件加载配置,如果有重复的配置,则会以bootstrap-dev.yml的配置为准。

补充:如果是application.yml,application.properties配置文件同时存在,会以application.properties配置文件为准,因为后加载的配置文件中重复的配置项会覆盖先加载的配置项。两者中如果用spring.profiles.active指定其他配置文件,最终重复项以spring.profiles.active指定的配置文件为准。

(2)nacos.config.prefix配置
在 Nacos Spring Cloud 中,数据集(Data Id) 的配置完整格式如下:

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

prefix:就是配置的服务名,默认是你配置的,通俗的说就是服务注册时注册到服务中心的服务名的值。所以一开始设置服务名damp-ind-api启动时候没有问题,匹配到的nacos配置文件也是damp-ind-api.yml,但是如果服务名改成了damp-ind-api-0965再启动,就会报错找不到配置文件,就是因为配置文件名称默认是和服务名称一致的,这个时候就要使用prefix去指明配置文件名称

【六】集群部署(在Linux系统下搭建Nacos的集群)

【1】介绍

之前在使用Eureka的时候,如果要搭建集群就要启动好几个Eureka服务,让它们之间互相注册互相守望,而且还要添加Eureka的自我保护机制。现在换成Nacos不用手动创建和启动多个服务中心了,也屏蔽了自我保护机制。

如果只有一台Nacos,如果它挂了,那就没有备用的了,单点故障后整个系统都挂了,所以需要搭建集群模式。

在实际开发过程中,如果使用Nacos的话,为了确保高可用,我们一般都会对其进行集群的部署。Nacos规定集群中Nacos节点的数量需要大于等于3个;同时,单机模式下Nacos的数据默认保存在其内嵌数据库中,不方便观察数据存储的基本情况。而且如果集群中启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储;此外,我们还需要借助Nginx实现负载均衡。这一过程的部署架构图如下所示:

在这里插入图片描述

【2】Nacos下载Linux版

【3】Nginx配置

Nginx搭建和学习的笔记:Nginx的学习和搭建

(1)回到nginx安装目录,并且开始编辑配置文件nginx.conf,可以修改端口号

cd /usr/local/nginx/conf
(2)启动nginx服务

切换到/usr/local/nginx/sbin下面
执行启动命令
./nginx
(3)查看nginx服务是否启动成功
ps -ef | grep nginx
10-访问一下自己的服务器ip:http://192.168.19.11:9001/(因为之前已经配置了路由转发,会将9001转发到80端口)
在这里插入图片描述

【3】集群配置步骤(重点)

【4】测试

【5】高可用小总结

集群模式适用于生产环境需要依赖mysql,单机可不必,三个及以上Nacos节点才能构成集群。

1、在nacos的解压目录nacos/conf目录下,修改配置文件cluster.conf

192.168.100.101:8848
192.168.100.102:8848
192.168.100.103:8848

2、修改bootstrap.yml中的server-addr属性,添加对应集群地址。

server-addr: 192.168.100.101:8848,192.168.100.102:8848,192.168.100.103:8848

3、启动运行成功后显示如图表示成功。
在这里插入图片描述

【七】控制台使用

(1)服务管理

(1)服务列表管理

(2)服务流量权重支持及流量保护

Nacos为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0。

在这里插入图片描述
(3)服务元数据管理
Nacos提供多个维度的服务元数据的暴露,帮助用户存储自定义的信息。这些信息都是以K-V的数据结构存储,在控制台上,会以{“version”:“1.0”,“env”:“prod”}这样的格式展示。类似的,编辑元数据可以通过相同的格式进行。例如服务的元数据编辑,首先点击服务详情页右上角的“编辑服务”按钮,然后在元数据输入框输入:{“version”:“1.0”,“env”:“prod”}。
在这里插入图片描述点击确认,就可以在服务详情页面,看到服务的元数据已经更新了。

在这里插入图片描述服务优雅上下线
Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的“上线”或者“下线”按钮,被下线的实例,将不会包含在健康的实例列表里。
在这里插入图片描述

(2)配置管理

Nacos支持基于Namespace和Group的配置分组管理,以便用户更灵活的根据自己的需要按照环境或者应用、模块等分组管理微服务以及Spring的大量配置,在配置管理中主要提供了配置历史版本、回滚、订阅者查询等核心管理能力。
在这里插入图片描述(1)配置的版本及一键回滚
Nacos基于Namespace帮助用户逻辑隔离多个命名空间,这可以帮助用户更好的管理测试、预发、生产等多环境服务和配置,让每个环境的同一个配置(如数据库数据源)可以定义不同的值。
在这里插入图片描述

(3)修改默认密码

修改用户名和密码,将ry-config中的user表username替换成你需要的登录账户,password改成你需要的密码,密码运行即可得到加密有算法。注意盐值是随机的,所以生成密码每次可能不一样,请不要担心。

public static void main(String[] args)
{
	System.out.println(new BCryptPasswordEncoder().encode("ruoyi"));
}

(4)会话时间

默认会话保持时间为30分钟。30分钟后需要重新登录认证。 暂时不支持修改该默认时间。

【八】Nacos的实现原理

【1】Nacos的整体架构

在这里插入图片描述

【2】Nacos信息同步的几种方式

(1)push (服务端主动push)
(2)pull (客户端的轮询), 超时时间比较短
(3)long pull (超时时间比较长)

【3】Nacos作为配置中心的原理

nacos配置中心同步信息采用是:客户端 long pull 的方式
在这里插入图片描述(1)Nacos 客户端会循环请求服务端变更的数据,并且超时时间设置为30s,当配置发生变化时,请求的响应会立即返回,否则会一直等到 29.5s+ 之后再返回响应
(2)客户端的请求到达服务端后,服务端将该请求加入到一个叫 allSubs 的队列中,等待配置发生变更时 DataChangeTask主动去触发,并将变更后的数据写入响应对象。
(3)与此同时服务端也将该请求封装成一个调度任务去执行,等待调度的期间就是等DataChangeTask 主动触发的,如果延迟时间到了 DataChangeTask 还未触发的话,则调度任务开始执行数据变更的检查,然后将检查的结果写入响应对象(基于文件的MD5)

【4】Nacos作为注册中心的原理

nacos注册中心采用了 :pull (客户端的轮询)和push (服务端主动push)
在这里插入图片描述(1)客户端启动时会将当前服务的信息包含ip、端口号、服务名、集群名等信息封装为一个Instance对象,然后创建一个定时任务,每隔一段时间向Nacos服务器发送PUT请求并携带相关信息。
(2)nacos服务器端在接收到心跳请求后,会去检查当前服务列表中有没有该实例,如果没有的话将当前服务实例重新注册,注册完成后立即开启一个异步任务,更新客户端实例的最后心跳时间,如果当前实例是非健康状态则将其改为健康状态。
(3)心跳定时任务创建完成后,通过POST请求将当前服务实例信息注册进nacos服务器。
(4)nacos服务器端在接收到注册实例请求后,会将请求携带的数据封装为一个Instance对象,然后为这个服务实例创建一个服务Service,一个Service下可能有多个服务实例,服务在Nacos保存到一个ConcurrentHashMap中Map(namespace,Map(group::serviceName, Service));
(5)nacos将实例添加到对应服务列表中会根据AP和CP不同的模式,采用不同协议。
(6)nacos在更新完成之后,通过发布服务变化事件,将服务变动通知给客户端,采用的是UDP通信,客户端接收到UDP消息后会返回一个ACK信号,如果一定时间内服务端没有收到ACK信号,还会尝试重发,当超出重发时间后就不在重发。
(7)客户端通过定时任务定时从服务端拉取服务数据保存在本地缓存。

服务端在发生心跳检测、服务列表变更或者健康状态改变时会触发推送事件,在推送事件中会基于UDP通信将服务列表推送到客户端,虽然通过UDP通信不能保证消息的可靠抵达,但是由于Nacos客户端会开启定时任务,每隔一段时间更新客户端缓存的服务列表,通过定时轮询更新服务列表做兜底,所以不用担心数据不会更新的情况,这样既保证了实时性,又保证了数据更新的可靠性。

【5】心跳机制

服务的健康检查分为两种模式:
(1)客户端上报模式:客户端通过心跳上报的方式告知nacos 注册中心健康状态(默认心跳间隔5s,nacos将超过超过15s未收到心跳的实例设置为不健康,超过30s将实例删除)
(2)服务端主动检测:nacos主动检查客户端的健康状态(默认时间间隔20s,健康检查失败后会设置为不健康,不会立即删除)

为什么nacos有两种心跳机制?
(1)对于临时实例,健康检查失败,则直接删除。这种特性适合于需要应对流量突增的场景,服务可以弹性扩容,当流量过去后,服务停掉即可自动注销。
(2)对于持久化实例,健康检查失败,会设置为不健康状态。它的优点就是可以实时的监控到实例的健康状态,便于后续的告警和扩容等一系列处理。

【6】自我保护

nacos也有自我保护机制(当前健康实例数/当前服务总实例数),值为0-1之间的浮点类型。正常情况下nacos 只会健康的实例。单在高并发场景,如果只返回健康实例的话,流量洪峰到来可能直接打垮剩下的健康实例,产生雪崩效应。

保护阈值存在的意义在于当服务A健康实例数/总实例数 < 保护阈值时,Nacos会把该服务所有的实例信息(健康的+不健康的)全部提供给消费者,消费者可能访问到不健康的实例,请求失败,但这样远比造成雪崩要好。牺牲了请求,保证了整个系统的可用。

简单来说不健康实例的另外一个作用:防止雪崩

如果所有的实例都是临时实例,当雪崩出现时,Nacos的阈值保护机制是不是就没有足够的(包含不健康实例)实例返回了,其实如果有部分实例是持久化实例,即便它们已经挂掉,状态为不健康,但当触发自我保护时,还是可以起到分流的作用。

【九】Nacos和Eureka的区别

【1】CAP理论

C一致性,A高可用,P分区容错性。

(1)eureka只支持AP
(2)nacos支持CP和AP两种
nacos是根据配置识别CP或AP模式,如果注册Nacos的client节点注册时是ephemeral=true即为临时节点,那么Naocs集群对这个client节点效果就是AP,反之则是CP,即不是临时节点

 #false为永久实例,true表示临时实例开启,注册为临时实例
spring.cloud.nacos.discovery.ephemeral=true

【2】连接方式

(1)nacos使用的是netty和服务直接进行连接,属于长连接
(2)eureka是使用定时发送和服务进行联系,属于短连接

【3】服务异常剔除

(1)Eureka
Eureka client在默认情况每隔30s向Eureka Server发送一次心跳,当Eureka Server在默认连续90s秒的情况下没有收到心跳,会把Eureka client 从注册表中剔除,在由Eureka-Server 60秒的清除间隔,把Eureka client 给下线

EurekaInstanceConfigBean类下
private int leaseRenewalIntervalInSeconds = 30;  //心跳间隔30s
private int leaseExpirationDurationInSeconds = 90;  //默认90s没有收到心跳从注册表中剔除
EurekaServerConfigBean  类下
private long evictionIntervalTimerInMs = 60000L; //异常服务剔除下线时间间隔

也就是在极端情况下Eureka 服务 从异常到剔除在到完全不接受请求可能需要 30s+90s+60s=3分钟左右(还是未考虑ribbon缓存情况下)

(2)Nacos
nacos client 通过心跳上报方式告诉 nacos注册中心健康状态,默认心跳间隔5秒,
nacos会在超过15秒未收到心跳后将实例设置为不健康状态,可以正常接收到请求
超过30秒nacos将实例删除,不会再接收请求

【4】操作实例方式

(1)nacos:
提供了nacos console可视化控制话界面,可以对实例列表进行监听,对实例进行上下线,权重的配置,并且config server提供了对服务实例提供配置中心,且可以对配置进行CRUD,版本管理

(2)eureka:
仅提供了实例列表,实例的状态,错误信息,相比于nacos过于简单

【5】自我保护机制

相同点:保护阈值都是个比例,0-1 范围,表示健康的 instance 占全部instance 的比例。

不同点:
(1)保护方式不同
Eureka保护方式:当在短时间内,统计续约失败的比例,如果达到一定阈值,则会触发自我保护的机制,在该机制下,Eureka Server不会剔除任何的微服务,等到正常后,再退出自我保护机制。自我保护开关(eureka.server.enable-self-preservation: false)

Nacos保护方式:当域名健康实例 (Instance) 占总服务实例(Instance) 的比例小于阈值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。

(2)范围不同
Nacos 的阈值是针对某个具体 Service 的,而不是针对所有服务的。但 Eureka的自我保护阈值是针对所有服务的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值