【JAVA】SpringCloud-Alibaba 结合 Nacos 实现配置动态刷新和服务注册发现

前言

SpringCloud通常指的是Netflix的,今天我们讲的SpringCloud-Alibaba,有大厂背书,我选择相信,而且阿里巴巴的各项业务复杂度都在你我公司之上,所以经过大厂实战验证的可信度很高。

目前SpringCloud-Alibaba提供的组件官网也有介绍,的确没有Netflix多,但是还在发展,没问题。

其实大家用SpringCloud的核心目的就是转型微服务,做架构升级,而微服务大家最关心的就是需要一个服务注册中心来帮我们自动维护服务注册和服务发现的机制,而传统的方式可能是手动配置nginx的upstream来达到这个效果,缺乏自动化,没有融入云时代(当然基于openresty+lua的APISIX网关也可以达到微服务的效果)。

分析

SpringCloud-Alibaba配套的服务注册中心也是阿里自研的nacos。

nacos=配置中心+注册中心,一举两得。

说到服务注册发现都是这张图,只不过实现的方式有多种,有ZK,EUREKA,CONSUL,ETCD,NACOS等,但是核心都是一致性算法,都在CAP三者中择优选择。

NACOS官网的架构图如下

nacos_arch.jpg

附上官网的介绍

服务 (Service)

服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.

服务注册中心 (Service Registry)

服务注册中心,它是服务,其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。

服务元数据 (Service Metadata)

服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据

服务提供方 (Service Provider)

是指提供可复用和可调用服务的应用方

服务消费方 (Service Consumer)

是指会发起对某个服务调用的应用方

配置 (Configuration)

在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。

配置管理 (Configuration Management)

在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。

名字服务 (Naming Service)

提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。

配置服务 (Configuration Service)

在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。

那么Nacos是如何整个到SpringCloud的标准中无缝连接的呢。

SpringCloud标准中启动服务注册发现就一个注解

@EnableDiscoveryClient

这个注解是springcloud官方定义的

里面使用了Import注解引入EnableDiscoveryClientImportSelector

这个方法中import了一个类

org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration

这个类的定义比较简单了,实例化这个类

再看NacosDiscoveryAutoConfiguration这个类的注解,AutoConfigureAfter表明上面的AutoServiceRegistrationConfiguration实例化完之后会实例化NacosDiscoveryAutoConfiguration这个类。

该类中会实例化nacos注册类,这些注册类也都是继承实现了spring cloud的标准接口

以上是SpringCloud-Alibaba Nacos如何整合到SpringCloud的服务注册标准中的过程,如果你想自定义实现一个服务注册实现,也可以基于SpringCloud Common的标准来做。

安装部署

参照nacos官网,实际生产环境使用,安装部署三台nacos即可,通过nginx代理,使用官方的数据库初始化脚本初始化数据库即可。

安装完如图所示,三台nacos实例构成集群。nacos同样使用raft算法实现数据一致性。

配置中心

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

引入上述依赖,版本我是定义在自定义的parent里了

大家要单独定义一个配置文件bootstrap.properties,因为使用nacos配置中心,它刷新的是application.properties的配置,所以不能再把nacos的配置写到application里了。

Spring是有上下文一说的,也叫Application Context,Application Context又是有父子关系的,所以必须要理解ApplicationContext是什么。SpringCloud启动时,会先创建一个Bootstrap Context,然后创建一个Application Context,Bootstrap Context是Application Context的父上下文,Bootstrap负责从外部源加载配置并解析,这两个上下文共用一个从外部获取的Environment。Bootstrap配置具有较高的优先级,不会被本地配置覆盖。Bootstrap典型的应用场景是使用SpringConfig,这个时候你需要把配置信息配在bootstrap里面。Bootstrap属于引导配置,Application属于应用配置。

所以bootstrap优先于application,nacos属于引导配置,放到bootstrap里。

#spring cloud config
spring.application.name=phoenixNacos
#spring.cloud.nacos.discovery.service=${spring.application.name}
spring.cloud.nacos.config.server-addr=172.28.72.120:8848
spring.cloud.nacos.config.file-extension=properties

在SpringCloud-Alibaba Nacos中的dataId完整定义如下

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

具体如图所示

放了一些动态配置,报文加解密开关,大家在实际使用中比较常用的场景。

代码里如何让动态配置更新,这也是SpringCloud的标准,通过@RefreshScope注解标明该类下用到的配置动态刷新。

如果该Bean被RefreshScope注解注释了,那么一旦配置变更该Bean会被销毁,然后重新实例化用的配置。

服务注册中心

启动后会在nacos控制台看到注册上的服务实例,注意,这里注册的是实例级别,不是实例中的N个具体的服务接口。

发布了227 篇原创文章 · 获赞 211 · 访问量 73万+

猜你喜欢

转载自blog.csdn.net/chiweitree/article/details/104407506