架构-微服务-服务配置

news/2024/12/4 19:14:44/

文章目录

  • 前言
  • 一、配置中心介绍
    • 1. 什么是配置中心
    • 2. 解决方案
  • 二、Nacos Config入门
  • 三、Nacos Config深入
    • 1. 配置动态刷新
    • 2. 配置共享
  • 四、nacos服务配置的核心概念


前言

服务配置--Nacos Config

  微服务架构下关于配置文件的一些问题:

  • 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。
  • 配置文件无法区分环境微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。
  • 配置文件无法实时更新。我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一个正在运行的项目来说是非常不友好的。

  这时候就需要通过分布式架构中的配置中心来解决这些问题。


一、配置中心介绍

1. 什么是配置中心

  配置中心,就是一个集中管理所有应用程序使用到的配置信息,当需要修改配置的时候,只修改这一个地方,之后其他的微服务就可以重新加载配置信息,这样就不需要一个一个微服务的修改配置信息。

  • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
  • 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
  • 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

当加入了服务配置中心之后,系统架构图会变成下面这样:

配置中心<a class=架构图" />

2. 解决方案

在业界常见的服务配置中心,有下面这些:

  • Apollo
    Apollo是由携程开源的分布式配置中心。特点有很多,比如:配置更新之后可以实时生效,支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。并且资料也写的很详细。

  • Disconf
    Disconf是由百度开源的分布式配置中心。它是基于Zookeeper来实现配置变更后实时通知和生效的。

  • SpringCloud Config
    这是Spring Cloud中带的配置中心组件。它和Spring是无缝集成,使用起来非常方便,并且它的配置存储支持Git。不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新

  • Nacos
    这是SpingCloud alibaba技术栈中的一个组件,前面我们已经使用它做过服务注册中心。其实它也集成了服务配置的功能,我们可以直接使用它作为服务配置中心

二、Nacos Config入门

  使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。

  接下来我们以商品微服务为例,学习nacos config的使用。

  1. 搭建nacos环境【使用现有的nacos环境即可】

  2. 微服务中引入nacos的依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 微服务中添加nacos config的配置

注意:不能使用原来的application.yml作为配置文件,而是新建一个bootstrap.yml作为配置文件
配置文件优先级(由高到低):
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

spring:application:name: service-productprofiles:active: dev # 环境标识cloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中心地址file-extension: yaml # 配置文件格式
  1. 在nacos中添加配置

点击配置列表,点击右边+号,新建配置。在新建配置过程中,要注意下面的细节:
1)Data ID不能随便写,要跟配置文件中的对应,对应关系如图所示
2)配置文件格式要跟配置文件的格式对应,且目前仅仅支持YAML和Properties
3)配置内容按照上面选定的格式书写

nacos新建配置
5. 注释本地的application.yml中的内容, 启动程序进行测试。
如果依旧可以成功访问程序,说明我们nacos的配置中心功能已经实现。

三、Nacos Config深入

1. 配置动态刷新

  在入门案例中,我们实现了配置的远程存放,但是此时如果修改了配置,我们的程序是无法读取到的,因此,我们需要开启配置的动态刷新功能。

在nacos中的service-product-dev.yaml配置项中添加下面配置:

config:appName: product
  1. 方式一: 硬编码方式
@RestController
public class NacosConfigController {@Autowiredprivate ConfigurableApplicationContext applicationContext;@GetMapping("/nacos-config-test1")public String nacosConfingTest1() {returnapplicationContext.getEnvironment().getProperty("config.appName");}
}
  1. 方式二: 注解方式(推荐)

@RefreshScope

@RestController
@RefreshScope//在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {@Value("${config.appName}")private String appName;//2 注解方式@GetMapping("/nacos-config-test2")public String nacosConfingTest2() {return appName;}
}

2. 配置共享

  当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置文件提取出来,然后实现共享呢?当然是可以的。接下来我们就来探讨如何实现这一功能。

  1. 同一个微服务的不同环境之间共享配置

如果想在同一个微服务的不同环境之间实现配置共享,其实很简单。
只需要提取一个以 spring.application.name 命名的配置文件,然后将其所有环境的公共配置放在里面即可。

1 新建一个名为service-product.yaml配置存放商品微服务的公共配置

nacos配置共享同服务
2 新建一个名为service-product-test.yaml配置存放测试环境的配置

nacos配置共享同服务-test
3 新建一个名为service-product-dev.yaml配置存放开发环境的配置

nacos配置共享同服务-dev
4 添加测试方法

@RestController
@RefreshScope
public class NacosConfigController {@Value("${config.env}")private String env;//3 同一微服务的不同环境下共享配置@GetMapping("/nacos-config-test3")public String nacosConfingTest3() {return env;}
}

5 访问测试,目前bootstrap.yml中的配置,active=dev,同服务内共享配置生效

nacos配置共享同服务测试
6 接下来,修改bootstrap.yml中的配置,将active设置成test,再次访问,观察结果

spring:profiles:active: test # 环境标识
  1. 不同微服务中间共享配置

不同为服务之间实现配置共享的原理类似于文件引入,就是定义一个公共配置,然后在当前配置中引入。

1 在nacos中定义一个DataID为all-service.yaml的配置,用于所有微服务共享

spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: rootjpa:properties:hibernate:hbm2ddl:auto: updatedialect: org.hibernate.dialect.MySQL5InnoDBDialectcloud:nacos:discovery:server-addr: 127.0.0.1:8848

2 在nacos的中修改service-product.yaml中为下面内容

server:port: 8081
config:appName: product

3 修改bootstrap.yaml

spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中心地址file-extension: yaml # 配置文件格式shared-dataids: all-service.yaml # 配置要引入的配置refreshable-dataids: all-service.yaml # 配置要实现动态配置刷新的配置profiles:active: dev # 环境标识

4 启动商品微服务进行测试,不同服务间共享配置生效

四、nacos服务配置的核心概念

  • 命名空间(Namespace)
    命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间

  • 配置分组(Group)
    配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组

  • 配置集(Data ID)
    在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集

nacos服务配置的核心概念


本文的引用仅限自我学习如有侵权,请联系作者删除。
参考知识
传智教育·黑马程序员



http://www.ppmy.cn/news/1551279.html

相关文章

【计算机操作系统】操作系统引论(学习笔记)

目录 操作系统的目标和作用 目标 作用 操作系统的发展过程 单道批 多道批 分时系统 实时系统 微机操作系统 嵌入式操作系统​编辑 网络操作系统​编辑 分布式操作系统 操作系统的基本特性 并发 共享 虚拟 异步 操作系统的运行环境 操作系内核​ 处理机的双…

你的网站真的安全吗?如何防止网站被攻击?

你的网站被黑客攻击过&#xff0c;很可能不止一次&#xff01; 这可不是危言耸听。微软最近发布了《2024 年微软数字防御报告》&#xff0c;报告中写到&#xff1a;“Windows 用户每天面临超过 6 亿次网络犯罪和国家级别的攻击&#xff0c;涵盖了从勒索软件到网络钓鱼再到身份…

DevExpress的web Dashboard应用

本文旨在从零开始创建一个包含dashboard的应用 一、前期准备 1、语言&#xff1a;C# 2、软件&#xff1a;Visual Studio 2019 3、框架&#xff1a;DevExpress19.2(付费)、ASP.NET(Web) 4、组件&#xff1a;dashboard 二、创建ASP.NET Web窗体仪表板应用程序 1、创建一个空的w…

istio中wasm插件是做什么的?

在 Istio 中&#xff0c;WASM 插件 是用来扩展和自定义数据平面&#xff08;即 Envoy Proxy&#xff09;行为的一种机制。它允许用户以更灵活、更高效的方式增强流量处理能力&#xff0c;而不需要修改 Envoy 的源码。以下是它的主要功能和应用场景&#xff1a; 1. 增强 Envoy …

Ubuntu WiFi检测

ubuntu检测到多个同名wifi&#xff0c;怎么鉴别假冒的wifi&#xff1f; 在Ubuntu中&#xff0c;如果检测到多个同名的Wi-Fi网络&#xff0c;可能存在假冒的Wi-Fi&#xff08;例如“蜜罐”攻击&#xff09;。以下是一些鉴别假冒Wi-Fi的方法&#xff1a; 检查信号强度&#xff1a…

Spring Cloud Gateway API 网关

Spring Cloud Gateway API 网关 一、Spring Cloud Gateway1.API 网关2.Gateway 核心概念3.工作流程 二、Gateway 路由1.断言 Predicate(1) 定义与作用(2) Route Predicate 工厂 2.动态路由 三、Gateway 过滤器1.局部过滤器(1) GatewayFilter 工厂 2.全局过滤器 一、Spring Clou…

【mac】mac自动定时开关机和其他常用命令,管理电源设置的工具pmset

一、操作步骤 1、打开终端 2、pmset 是用于管理电源设置的强大工具&#xff0c;我们将使用这个命令 &#xff08;1&#xff09;查询当前任务 pmset -g sched查看到我当前的设置是 唤醒电源开启在 工作日的每天早上8点半 上班时不用手动开机了 &#xff08;2&#xff09;删…

详解 PyTorch 中的 Dataset:功能、实现及应用示例

详解 PyTorch 中的 Dataset&#xff1a;功能、实现及应用示例 在机器学习和深度学习中&#xff0c;Dataset 类是一个抽象类&#xff0c;通常用于封装对于数据集的各种操作&#xff0c;包括访问、处理和预处理数据。Dataset 为数据加载提供了一个标准的接口&#xff0c;使其能够…