SpringCloud-Nacos

Nacos服务注册使用

服务注册到Nacos:引入nacos.discovery依赖,配置nacos地址spring.cloud.nacos.server-addr

1、在cloud-demo父工程中添加spring-cloud-alilbaba的管理依赖:

<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>

2、添加nacos的客户端依赖:

<!-- nacos客户端依赖 -->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3、application.yml文件添加nacos地址:

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos 服务端地址

Nacos和Eureka的区别

Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差异:

image

  • Nacos与eureka的共同点

    • 都支持服务注册和服务拉取
    • 都支持服务提供者心跳方式做健康检测
  • Nacos与Eureka的区别

    • Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
    • 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
    • Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
    • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式

Nacos服务分级存储模型

  1. 一级是服务,例如userserivice
  2. 二级是集群,例如北京或上海
  3. 三级是实例,例如杭州机房的某台部署了userservice的服务器

把同在一个机房的多个实例称为集群,服务调用尽可能选择本地集群的服务,跨集群调用延迟较高,本地集群不可访问时,再去访问其他集群。
image

配置集群

配置实例的集群属性:
orderService/src/resources/applicatiom.yml

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ

配置NacosRule负载均衡

服务在选择实例时的规则是由负载均衡的规则决定的(IRULE),默认轮询。为保证orderService远程调用userService时优先选择本地集群:使用NacosRule

NacosRule的访问特点:优先选择本地集群,在本地集群内的多个服务,采用随机方式进行负载均衡。当本集群的服务全部宕机,会跨集群访问,此时orderService会有一个警告信息A cross-cluster call occurs

修改负载均衡规则:
orderService/src/resources/applicatiom.yml

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848 # nacos服务端地址
      discovery:
        cluster-name: HZ # 集群名称
userservice: # 要做配置的微服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则

通过在控制台设置实例的权重还可以根据权重负载均衡,可以让性能好的机器承担更多的用户请求

权重设置为0后,可以进行版本升级等操作。然后将权重改为0.01等让少数用户进行访问,当没有问题时逐步扩大比例依次升级,这样做可以做到用户无感知的平滑升级。

配置namespace环境隔离

Nacos中服务存储和配置存储、数据存储的最外层都是一个名为namespace的东西用来做最外层的隔离;每个namespace都有唯一的id,不同的namespace下的服务不可见。

Namespace->Group->Service/Data

修改配置的命名空间:
orderService/src/resources/applicatiom.yml

spring:
  cloud:
    nacos:
      server-addr: localhost:8848
      discovery:
        cluster-name: HZ
        namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID

配置永久实例

Nacos会把实例划分成临时实例和非临时实例【临时的主动联系nacos,非临时的nacos主动联系你】

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。

配置一个服务实例为永久实例:

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

Nacos配置管理

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

image

Spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,bootstrap.yaml一般配置nacos的配置信息,然后拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

pom.xml

<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

bootstrap.yaml

spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置;本例中,就是去读取userservice-dev.yaml

然后就可以使用@Value获取配置信息了

Nacos配置热更新

  1. 方式一:在@Value注入的变量所在类上添加注解@RefreshScope
  2. 方式二:使用@ConfigurationProperties注解代替@Value注解。

pattern:
  dateformat: yyyy-MM-dd
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private PatternProperties patternProperties;

    @GetMapping("now")
    public String now(){
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
    }
}

多环境配置共享

微服务启动时会去nacos读取多个配置文件,例如[spring.application.name]-[spring.profiles.active].yaml[spring.application.name].yaml[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

优先级:服务名-profile.yaml>服务名.yaml>本地配置

pattern:
  envSharedValue: 111
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String envSharedValue;
}
posted @ 2024-04-22 18:04  燕子去了  阅读(17)  评论(0编辑  收藏  举报

Powered by .NET 8.0 on Kubernetes

我会翻山越岭,到每一个我想去的地方

...