SpringCloud-Alibaba的Nacos究竟有多好用?(下)

简介: SpringCloud-Alibaba的Nacos究竟有多好用?

注册中心使用方法

本文演示的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

b3c9a6db6f694942a51f6418befe027d.png


4.测试

成功启动后我们打开注册中心控制台,可以查看到注册成功的微服务。


7d0684fb3f0f4e3ca7b3b5d6bbcdf6a1.png


Nacos作为配置中心

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


76725a415fb34931a65344d8f9ccb22e.png


为了解决这种情况,就诞生了配置中心。配置中心会将配置从各个应用中剥离出来,对配置进行统一管理。使应用自身不需要自已去管理配置。

Nacos配置中心架构

配置中心本身并不复杂,前提是你先将 CAP 的取舍问题晾在一边的话。配置中心最基础的功能就是存储一个键值对,用户发布一个配置(configKey),然后客户端获取这个配置项(configValue);进阶的功能就是当某个配置项发生变更时,将变更告知客户端刷新旧值。


下方的架构图,简要描述了一个配置中心的大致架构,用户可以通过管理平台发布配置,通过 HTTP 调用将配置注册到服务端,服务端将之保存在 MySQL 等持久化存储引擎中;用户通过客户端 SDK 访问服务端的配置,同时建立 HTTP 的长轮询监听配置项变更,同时为了减轻服务端压力和保证容灾特性,配置项拉取到客户端之后会保存一份快照在本地文件中,SDK 优先读取文件里的内容。

e03c19175baf4acebb03121dd8240bf2.png


配置中心使用方法

配置中心与注册中心所有的版本都是一致的。

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

d08be91901b64e77b674ec0fcd406fc5.png

3. 在控制台添加配置规则

在配置中心添加一个叫 数据集(Data Id) lgmall-coupon.properties。

  • 默认规则 应用名.properties

fdd54012932c4b3b8bb4e14c582dfb62.png


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.测试

成功启动后,我们调用接口查看最终结果,发现成功读取到了配置中心的值

e1de45d0405a4f5098e1a2fddaa34b37.png

实战中如何使用Nacos配置中心

  1. 创建命名空间,微服务项目中每个环境创建不同的命名空间,使用分组区分不同的微服务


45e2f0f5c368496aadba305b6bad865c.png

e8f922ba0e324f0486468b0eb65108ff.png

4f13c0d4919642d7be0114e671528aa0.png

9f2bc888b9a24ff09078457ac9a77d92.png

b9f5d93de76e435eb7208a9cbbf68aa7.png

  1. 创建配置集,以下方项目为例,我们需要对除common外5个微服务进行分组,并创建其配置文件。这里我们以test测试环境为例


9603b8d81743452fb0b47ed9d92a3899.png


c9d2b0a07ea149da836623b95cb8aaaf.png

b9cb6864063a435ab6e4d60da072612a.png

aa19f76a2e0d404b98834449803f0609.png

8af5fc1c30454c8d98e985c05f572b5a.png

c9e2fc0b70814e53be29087c3784a62f.png

创建好后整体效果如下


a2c7dafec20b4f4d843ce7442d6b1a7a.png

读取多配置集并动态刷新,微服务任何配置信息都可以放在配置中心中,只需要在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代表动态刷新,可对应下图查看

120d39807b8f407c82d5dfabe3b0ba1e.png

  1. 启动并测试


b5dd5917d2b64ae99542e4795a575c33.png

通过上方日志我们可以发现,启动成功后他会优先读取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'}]}

我们访问数据库发现请求成功!


be5bf4f0127943debd567799ec7063df.png


相关文章
|
6天前
|
SpringCloudAlibaba 负载均衡 Java
【一】SpringCloud Alibaba之Nacos整合篇(作为注册中心)
【一】SpringCloud Alibaba之Nacos整合篇(作为注册中心)
268 1
【一】SpringCloud Alibaba之Nacos整合篇(作为注册中心)
|
6天前
|
SpringCloudAlibaba Java Nacos
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
SpringCloud Alibaba微服务 -- Nacos使用以及注册中心和配置中心的应用(保姆级)
|
6天前
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
246 0
|
6天前
|
SpringCloudAlibaba Dubbo 前端开发
【三】SpringCloud Alibaba之Nacos整合篇(作为配置中心)
【三】SpringCloud Alibaba之Nacos整合篇(作为配置中心)
259 0
|
6天前
|
SpringCloudAlibaba 负载均衡 Java
【二】SpringCloud Alibaba之Nacos整合篇(配置负载均衡)
【二】SpringCloud Alibaba之Nacos整合篇(配置负载均衡)
346 0
|
6天前
|
存储 Cloud Native Java
深入比较Spring Cloud Nacos和Eureka的区别
【2月更文挑战第12天】
118 0
|
6天前
|
Java Nacos 开发者
解决Spring Cloud整合Nacos与Gateway的探险之旅
解决Spring Cloud整合Nacos与Gateway的探险之旅
83 0
|
6天前
|
Java Nacos Docker
Spring Cloud Alibaba【什么是Nacos、Nacos Server下载安装 、Docker安装Nacos Server服务、微服务聚合父工程构建】(一)
Spring Cloud Alibaba【什么是Nacos、Nacos Server下载安装 、Docker安装Nacos Server服务、微服务聚合父工程构建】(一)
86 0
|
6天前
|
Java 应用服务中间件 Nacos
springcloud2-注册中心eureka及nacos
springcloud2-注册中心eureka及nacos
36 0
|
6天前
|
应用服务中间件 Nacos 数据库
SpringCloud微服务之Nacos集群搭建
SpringCloud微服务之Nacos集群搭建
92 0