基于SpringCloud的微服务架构学习笔记(3)注册中心和配置中心Nacos

1.9 Nacos注册中心

1.9.1 Nacos说明

Nacos是阿里巴巴的产品,现在是SpringCloud的一个组件,相比Eureka功能更加丰富

1.9.2 Nacos的启动(解压即安装)

1)解压,进入bin目录
2)在bin目录中,进入cmd模式
3)敲入:startup.cmd -m standalone
4)进入网站:http://127.0.0.1:8848/nacos,密码和账户均为nacos

1.9.3 配置

  1. 在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:
            <!--nacos的管理依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
  1. 注释掉order-service和user-service中原有的eureka依赖。添加nacos的客户端依赖:
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
  1. 修改user-service&order-service中的application.yml文件,注释eureka地址,添加nacos地址:
    spring:
      cloud:
        nacos:
          server-addr: nacos:8848 # nacos服务地址
  1. 小结:更改配置,就是依赖和配置文件的变更。

1.9.4 Nacos的服务分级存储模型

1)模型:服务-》集群-》实例
user-service-》北京集群/上海集群/深圳集群-》8081/8082/8083

2)为什么要采用集群 集群是按照机房区域划分的,为了服务调用尽量使用本地集群服务,降低服务调用时延。 修改application.yml文件,spring.cloud.nacos.discovery.cluster-name添加属性

3)服务实例设置集群
在启动前修改配置,然后启动,就会给一个服务设置

```java spring: cloud: nacos: server-addr:localhost:8848 # nacos 服务端地址 discovery: cluster-name: HZ # 配置集群名称,也就是机房位置,例如:HZ,杭州 ``` ### 1.9.5 根据权重负载均衡 1. 为什么要有这个功能 有一些机子比较老,不承担很多的工作量; 在系统更新的时候,可以小范围更新,没有问题,再慢慢更新,不影响用户体验。 2. 如何更新 直接在nacos界面中修改,里面有一个改权重的地方。权重越高,访问频次越高,为0时不访问。

1.9.6 环境隔离namespace–配置功能

Nacos除了是注册中心外,还是一个配置中心

  1. 这是什么功能,为什么需要再分组
    在服务之上,还有一个分组,即为Group和Namespace,不是必须,其中Namespace下的分组目的是为了方便后续不同环境下的配置(例如开发环境dev,测试环境UAT,生产环境Prod)
  1. 如何进行配置

1)在nacos中创建新的命名空间,获取对应空间的id

2)在配置文件中添加命名空间的选取

cloud:    
	nacos:      
		server-addr:localhost:8848      
		discovery:        
			cluster-name: SH # 上海        
				namespace:492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
  1. 小结
    1)每一个namespace的id是唯一的
    2)服务设置namespoace是要填写的是id,而不是名称
    3)不同namespace下的服务是互相不可见的

1.9.7 nacos注册中心的细节

  1. 服务提供者:把拥有的服务信息传输给注册中心登记
  2. 注册中心对服务提供者服务的更新
    1)对于临时实例:服务提供者中的服务每隔一个心跳时间(30s)向注册中心信息更新
    2)对于非临时实例:注册中心每次主动向服务提供者询问
  3. 服务消费者获取有效的服务列表(存在服务列表缓存)
    1)对于临时实例:消费者定时向注册中心拉去服务列表
    2)对弈非临时实例:实例的新增和删除会主动推送给服务消费者。()

1.9.8 Nacos与Eureka的对比

  1. 相同点
    1)度支持服务注册和服务拉取
    2)都支持服务提供者心跳方式做健康监测
  2. 不同点(Nacos额外功能)
    1)临时实例心跳不正常会被提出,而非临时实例不会被剔除
    2)Nacos支持服务列表变更的消息推送模式,更新更加快捷

图片:

1.10 Nacos配置管理

1.10.1 统一配置管理

  1. 在Nacos中添加配置文件(优先级高于本地配置)
  1. 在微服务中引入nacos的config依赖
<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

  1. 在userservice中的resource目录添加一个bootstrap.yml文件,这个文件是引导文件,优先级高于application.yml:改文件能够配置nacos的地址,当前环境,服务名称和文件名侯准,决定程序启动去nacos读取那个文件。
spring:
  application:
      name: userservice # 服务名称
      profiles:
      active: dev #开发环境,这里是dev 
      cloud:
      nacos:
      server-addr: localhost:8848 # Nacos地址
          config:
            file-extension: yaml # 文件后缀名

  1. 做测试:配置能够成功实现
@RestController
@RequestMapping("/user")
public class UserController{
    
    
    // 注入nacos中的配置属性    
@Value("${pattern.dateformat}")    
	private String dateformat; 
    // 编写controller,通过日期格式化器来格式化现在时间并返回    
	@GetMapping("now")    
	public String now(){
    
            
		return LocalDate.now().format(                
		DateTimeFormatter.ofPattern(dateformat, Locale.CHINA)        );    
}

1.10.2 配置热更新

配置文件变更后,微服务无需重启就能够感知,可以通过以下两种方式实现:

  1. 方式一:在@Value注入的变量所在类上添加注解@RefreshScope
  1. 使用@ConfigurationProperties注解
  1. 小结
    1)不是所有配置都适合放到配置中心,维护起来比较麻烦
    2)建议将一些关键参数,运行时需要调整的参数放到nacos配置中心,其他都放到本地配置中。

1.10.3 配置共享

当配置多个服务时,如果配置对象为一个,那么久有一个优先级。
nacos中的配置大于本地配置
当前环境的配置大于统一环境的配置

1.10.4 搭建Nacos集群

1)搭建沐浴SQL集群初始化数据表
2)下载解压nacos
3)修改集群配置(节点信息),数据库配置
4)分别启动多个nacos节点
5)nginx进行反向代理

参考文献
1)黑马程序员SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课

猜你喜欢

转载自blog.csdn.net/qq_42974034/article/details/129469149