注册中心使用方法
本文演示的nacos版本为1.1.3,springcloud版本为2.1.0.RELEASE,springcloud-alibaba采用的版本为Greenwich.SR3,springboot对应版本为2.1.8.RELEASE。
1.添加相关依赖
nacos的Maven依赖
<!--nacos 服务注册/发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId> </dependency>
要想引入上方依赖,首先需要确定本项目是个boot项目,还需先引入SpringCloud-Alibaba依赖。如果实在不会修改可参考下方pom
文件。
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--在下方填上自已的gva坐标--> <groupId>com.xxx</groupId> <artifactId>xxx-xxx</artifactId> <version>1.0-SNAPSHOT</version> <!--版本控制--> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> </properties> <dependencies> <!--nacos 服务注册/发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> </project>
2.编写配置文件
声明需注册到,注册中心的地址,以及服务名称等
spring: cloud: nacos: discovery: server-addr: xx.xxx.xxx.xx:8848 #注册中心地址 application: name: lgmall-coupon #服务名称 server: port: 8010 #端口号
3.编写启动类
使用@EnableDiscoveryClient注解在我们启动类上开启服务注册与发现
@EnableDiscoveryClient
4.测试
成功启动后我们打开注册中心控制台,可以查看到注册成功的微服务。
Nacos作为配置中心
在微服务架构中,当系统从一个单体应用拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图
为了解决这种情况,就诞生了配置中心。配置中心会将配置从各个应用中剥离出来,对配置进行统一管理。使应用自身不需要自已去管理配置。
Nacos配置中心架构
配置中心本身并不复杂,前提是你先将 CAP 的取舍问题晾在一边的话。配置中心最基础的功能就是存储一个键值对,用户发布一个配置(configKey),然后客户端获取这个配置项(configValue);进阶的功能就是当某个配置项发生变更时,将变更告知客户端刷新旧值。
下方的架构图,简要描述了一个配置中心的大致架构,用户可以通过管理平台发布配置,通过 HTTP 调用将配置注册到服务端,服务端将之保存在 MySQL 等持久化存储引擎中;用户通过客户端 SDK 访问服务端的配置,同时建立 HTTP 的长轮询监听配置项变更,同时为了减轻服务端压力和保证容灾特性,配置项拉取到客户端之后会保存一份快照在本地文件中,SDK 优先读取文件里的内容。
配置中心使用方法
配置中心与注册中心所有的版本都是一致的。
1.添加相关依赖
引入 Nacos Config Starter依赖。
<!--nacos 配置中心--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2.修改配置文件
创建bootstrap.properties
配置文件,并配置nacos config元数据
- bootstrap.properties 比yml文件优先加载
spring.application.name=lgmall-coupon spring.cloud.nacos.config.server-addr=xx.xxx.xxx.xx:xxxx
3. 在控制台添加配置规则
在配置中心添加一个叫 数据集(Data Id) lgmall-coupon.properties。
- 默认规则
应用名.properties
4.编写java代码
通过@Value
读取远程配置,另外为保证动态刷新配置还要加上@RefreshScope
注解
@RefreshScope @RestController @RequestMapping("coupon/coupon") public class CouponController { @Autowired private CouponService couponService; @Value("${user.ponName}") private String name; @GetMapping("/test") public R test(){ return R.ok().put("name",name); } }
5.测试
成功启动后,我们调用接口查看最终结果,发现成功读取到了配置中心的值
实战中如何使用Nacos配置中心
- 创建命名空间,微服务项目中每个环境创建不同的命名空间,使用分组区分不同的微服务
- 创建配置集,以下方项目为例,我们需要对除common外5个微服务进行分组,并创建其配置文件。这里我们以test测试环境为例
创建好后整体效果如下
读取多配置集并动态刷新,微服务任何配置信息都可以放在配置中心中,只需要在bootstrop.properties中说明加载哪些配置文件即可,以前springboot任何从配置文件中获取值的方法(如:@Value @ConfigurationProerties)都能使用,配置中心有的优先读取配置中心的。
# bootstrap.properites 比yml文件优先加载 spring.application.name=lgmall-coupon spring.cloud.nacos.config.server-addr=xx.xxx.xxx.xx:8848 #使用哪个命名空间下的配置,注意需要写命名空间的唯一id不能写名字 spring.cloud.nacos.config.namespace=ef375233-21be-646b-b955-6f3e0d855951 #数据源相关配置 spring.cloud.nacos.config.ext-config[0].data-id=datasource.yaml spring.cloud.nacos.config.ext-config[0].group=coupon spring.cloud.nacos.config.ext-config[0].refresh=true #mybatis相关配置 spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yaml spring.cloud.nacos.config.ext-config[1].group=coupon spring.cloud.nacos.config.ext-config[1].refresh=true #nacos相关配置 spring.cloud.nacos.config.ext-config[2].data-id=nacos.yaml spring.cloud.nacos.config.ext-config[2].group=coupon spring.cloud.nacos.config.ext-config[2].refresh=true #其它配置 spring.cloud.nacos.config.ext-config[3].data-id=other.yaml spring.cloud.nacos.config.ext-config[3].group=coupon spring.cloud.nacos.config.ext-config[3].refresh=true
data-id代表具体哪个配置,group代表读取哪个组,refresh=true代表动态刷新,可对应下图查看
- 启动并测试
通过上方日志我们可以发现,启动成功后他会优先读取lgmall-coupon.properties配置文件,我们没有配置该配置文件,它就会继续读取datasource.yaml,other.yaml,nacos.yaml,mybatis.yaml
Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='lgmall-coupon.properties'}, NacosPropertySource {name='other.yaml'}, NacosPropertySource {name='nacos.yaml'}, NacosPropertySource {name='mybatis.yaml'}, NacosPropertySource {name='datasource.yaml'}]}
我们访问数据库发现请求成功!