微服务——Nacos 第二篇

本贴最后更新于 565 天前,其中的信息可能已经时移世改

上次学的 Nacos 注册中心还未完成,现在来继续学习

Nacos 注册中心 ➡ 第二篇

image.png

1.Nacos 配置管理

Nacos 除了可以做注册中心,同样可以做配置管理来使用。

1.1.统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

image.png

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

1.1.1 在 nacos 中添加配置文件

如何在 nacos 中管理配置呢?

image.png

然后在弹出的表单中,填写配置信息:

image.png

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

1.1.2 从微服务拉取配置

微服务要拉取 nacos 中管理的配置,并且与本地的 application.yml 配置合并,才能完成项目启动。

但如果尚未读取 application.yml,又如何得知 nacos 地址呢?

因此 spring 引入了一种新的配置文件:bootstrap.yaml 文件,会在 application.yml 之前被读取,流程如下:
image.png

1)引入 nacos-config 依赖

首先,在 user-service 服务中,引入 nacos-config 的客户端依赖:

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

2)添加 bootstrap.yaml

然后,在 user-service 中添加一个 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

3)读取 nacos 配置

在 user-service 中的 UserController 中添加业务逻辑,读取 pattern.dateformat 配置:
image.png

在 controller 中写入以下代码 ⬇

@Value("${pattern.dateformat}")
    private String dateformat;

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

在页面访问,可以看到效果:image.png

1.2.配置热更新

我们最终的目的,是修改 nacos 中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

要实现配置热更新,可以使用两种方式:

1.2.1.方式一

在 @Value 注入的变量所在类上添加注解 @RefreshScope:
image.png

1.2.2.方式二

使用 @ConfigurationProperties 注解代替 @Value 注解。

在 user-service 服务中,添加一个类,读取 patterrn.dateformat 属性:

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@Data
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
    private String dateformat;
}

在 UserController 中使用这个类代替 @Value:image.png

1.2.3 总结

image.png

1.3.配置共享

其实微服务启动时,会去 nacos 读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
  • [spring.application.name].yaml,例如:userservice.yaml

[spring.application.name].yaml 不包含环境,因此可以被多个环境共享。

下面我们通过案例来测试配置共享

1.3.1 添加一个环境共享配置

我们在 nacos 中添加一个 userservice.yaml 文件:image.png

1.3.2 在 user-service 中读取共享配置

在 user-service 服务中,修改 PatternProperties 类,读取新添加的属性,然后修改 UserController,添加一个方法image.png
image.png

1.3.3 运行两个 UserApplication,使用不同的 profile

修改 UserApplication2 这个启动项,改变其 profile 值:
image.png

这样,UserApplication(8081)使用的 profile 是 dev,UserApplication(1)(8082)使用的 profile 是 test。

启动 UserApplication 和 UserApplication2

访问 http://localhost:8081/user/prop

http://localhost:8082/user/prop
结果可以看出来,不管是 dev,还是 test 环境,都读取到了 envSharedValue 这个属性的值。

1.3.4 配置共享的优先级

当 nacos、服务本地同时出现相同属性时,优先级有高低之分:

  • 🔴 服务名-profile.yaml> 服务名称.yaml> 本地配置

1.4.搭建 Nacos 集群

1.4.1 结构图

Nacos 生产环境下一定要部署为集群状态,部署方式为:

image.png

1.4.2 搭建集群

搭建集群的基本步骤:

  • 搭建数据库,初始化数据库表结构
  • 下载 nacos 安装包
  • 配置 nacos
  • 启动 nacos 集群
  • nginx 反向代理

配置 Nacos
进入 nacos 的 conf 目录,修改配置文件 cluster.conf.example,重命名为 cluster.conf:
然后添加内容(主机地址 + 端口):

127.0.0.1:8845
127.0.0.1.8846
127.0.0.1.8847

然后修改 application.properties 文件,添加数据库配置

spring.datasource.platform=mysql

db.num=1

db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123

将 nacos 文件夹复制三份,分别命名为:nacos1、nacos2、nacos3,然后分别修改三个文件夹中的 application.properties,

nacos1:

server.port=8845

nacos2:

server.port=8846

nacos3:

server.port=8847

然后分别启动三个 nacos 节点:
集群启动

startup.cmd

nginx 反向代理

修改 conf/nginx.conf 文件,配置如下:

upstream nacos-cluster {
    server 127.0.0.1:8845;
	server 127.0.0.1:8846;
	server 127.0.0.1:8847;
}

server {
    listen       80;
    server_name  localhost;

    location /nacos {
        proxy_pass http://nacos-cluster;
    }
}

而后在浏览器访问:http://localhost/nacos 即可。

代码中 application.yml 文件配置如下:

spring:
  cloud:
    nacos:
      server-addr: localhost:80 # Nacos地址
  • 实际部署时,需要给做反向代理的 nginx 服务器设置一个域名,这样后续如果有服务器迁移 nacos 的客户端也无需更改配置.
  • Nacos 的各个节点应该部署到多个不同服务器,做好容灾和隔离

Nacos 总结

到此为止 Nacos 就全部结束了,下面要开始组件 Feign 的学习了

  • Nacos
    23 引用 • 4 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...