微服务架构——配置中心

「配置中心」,顾名思义,就是用来统一管理项目中所有配置的系统。虽然听起来很简单,但也不要小瞧了这个模块。如果一个中型互联网项目,不采用配置中心的模式,一大堆的各类配置项,各种不定时的修改需求,一定会让开发同学非常头疼且管理十分混乱。我认为甚至可以直接用 “一个项目中是否有无采用「配置中心」” 这一粗略的条件,来判断一个互联网研发团队是否规范和成熟。

一、为什么需要「配置中心」?🍉

我们先来看看在没有「配置中心」的传统项目中,我们是怎么处理各类配置参数问题的:

  1. 一般是静态化配置。大多数在项目中单独写一个配置文件,例如 “config.conf”,然后将各类 参数配置、应用配置、环境配置、安全配置、业务配置 都写到这个文件里。当项目代码逻辑中需要使用配置的时候,就从这个配置文件中读取。这种做法虽然简单,但如果参数需要修改,就非常的不灵活,甚至需要重启运行中的项目才能生效。相信大多数开发同学都深有体会。

  2. 配置文件无法区分环境。由于配置文件是放在项目中的,但是我们项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置参数理论上都是不同的,所以我们在配置文件中根据不同环境配置不同的参数,这些都是手动维护,在项目发布的时候,极其容易因开发人员的失误导致出错。

  3. 配置文件过于分散。如果一个项目中存在多个逻辑模块独立部署,每个模块所使用的配置内容又不相同,传统的做法是会在每一个模块中都放一个配置文件,甚至不同模块的配置文件格式还不一样。那么长期的结果就是配置文件过于分散混乱,难以管理。

  4. 配置修改无法追溯。因为采用的静态配置文件方式,所以当配置进行修改之后,不容易形成记录,更无法追溯是谁修改的、修改时间是什么、修改前是什么内容。既然无法追溯,那么当配置出错时,更没办法回滚配置了。

上面只是拿配置文件的形式来举例,有的项目会采用数据库配置,虽然灵活一点,但是依旧不能完全解决上述问题。既然传统的项目配置有这么多弊端,那我们看看「配置中心」的方案是如何解决这些痛点的:

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

那么,按照上述思路,我们理想中的「配置中心」应该具备如下特点:

1)配置集中管理、统一标准

2)配置与应用分离

3)实时更新

4)高可用

具有上述特性的「配置中心」是如何解决上面传统配置所面临的问题的呢?

1.采用“配置集中管理”,可以很好的解决传统的“配置文件过于分散”的问题。所有的配置都集中在配置中心这一个地方管理,不需要每一个项目都自带一个,这样极大的减轻了开发成本。

2.采用“配置与应用分离”,可以很好的解决传统的“配置文件无法区分环境”的问题,配置并不跟着环境走,当不同环境有不同需求的时候,就到配置中心获取即可,极大的减轻了运维部署成本。

3.具备“实时更新”的功能,就是用来解决传统的“静态化配置”的问题。线上系统需要调整参数的时候,只需要在配置中心动态修改即可。

4.既然配置都统一管理了,那配置中心在整个系统中的地位就非常重要了,一旦配置中心不能正常提供服务,就可能会导致项目整体故障,因此“高可用”就是配置中心又一个很关键的指标了。

二、「配置中心」的原理与应用?🍉

通过上面的介绍,其实就可以了解到「 配置中心 」的原理不是很复杂。其核心功能也不多,主要是:

1.实现配置的记录

2.实现配置的读取、更新、取消

3.实现配置的查看

但是围绕着这几个核心功能,我们还需要保障高可行、要实现实时更新、要能方便的使用,还希望有权限管理的功能、操作审计的功能等等,加上这些周边辅助功能之后,一个完善的「 配置中心 也就不那么简单了。

我们再来看一下在实际项目中如何去选型和应用:

虽然配置中心的核心原理并不复杂,我们可以根据原理自己去实现一个配置中心,但是如果没有特殊需求,还是不建议重复造轮子了,毕竟业内已经有很多成熟的开源方案可以直接选用了。下面就列举几个比较热门的配置中心开源组件给大家参考:

Apollo

Apollo是由携程开源的分布式配置中心。

Apollo的特点有很多,比如:配置更新之后可以实时生效,还可以支持灰度发布功能。并且能对所有的配置进行版本管理、操作审计等功能,提供开放平台API。另外由于Apollo使用的人很多,所以网上的资料也非常的丰富,并且github上资料也写的很详细。

Spring Cloud Config

看名字就知道,这是Spring Cloud中带的配置中心组件。也正是这个原因,所以它和Spring是无缝集成,使用起来非常方便。并且它的配置存储支持Git,不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新。所以比较适用于小型项目快速上手。
Spring Cloud Config包含了Config Client和Config Server两部分,Config Server 实现配置文件的存储,对外以接口的形式提供获取配置文件,然后Config Client通过这些接口获取数据。

Disconf

Disconf是由百度开源的分布式配置中心。其实很多一线大厂都有开源自己的配置中心组件,这里挑出百度的Disconf也是因为网上比较火热,易用性也还不错,项目也是托管在github上很容易找到。它是基于Zookeeper来实现配置变更后实时通知和生效的。

l Nacos

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

三、实现配置中心🍉

我这里是基于nacos完成的配置中心,没有下载小伙伴可以看一下我之前的文章,有详细步骤

快速入门🥝

1.开启nacos
在这里插入图片描述

2.新建配置
在这里插入图片描述

3.在工程中编辑配置文件
在这里插入图片描述

#读取配置中心的id名
spring.application.name=lzq-01#nacos地址
spring.cloud.nacos.config.server-addr=localhost:8848#配置中心组名
spring.cloud.nacos.config.group=aaa#zipkin地址  不写默认就是9411
spring.zipkin.base-url=http://localhost:9411/#引用公共的配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=gg.properties
spring.cloud.nacos.config.extension-configs[0].group=aaa
spring.cloud.nacos.config.extension-configs[0].refresh=true

在这里插入图片描述
在这里插入图片描述

微服务集群共享一个配置文件🥝

集群生产环境下一定是部署到不同的服务器上。

(1)需要在nacos配置中心创建一个配置文件

名称必须为: 微服务名.后缀

在这里插入图片描述

(2)微服务中使用nacos配置中的配置文件在这里插入图片描述

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

必须使用bootstrap.properties—用来加载外部配置文件内容

在这里插入图片描述

#读取配置中心的id名
spring.application.name=lzq-03#nacos地址
spring.cloud.nacos.config.server-addr=localhost:8848#配置中心组名
spring.cloud.nacos.config.group=aaa#指定文件后缀
spring.cloud.nacos.config.file-extension=yaml#zipkin地址  不写默认就是9411
spring.zipkin.base-url=http://localhost:9411/#引用公共的配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=gg.properties
spring.cloud.nacos.config.extension-configs[0].group=aaa
spring.cloud.nacos.config.extension-configs[0].refresh=true

测试

在这里插入图片描述

实时刷新🥝

在这里插入图片描述

package com.lzq.controller;import com.lzq.Product1;
import com.lzq.pojo.Product;
import com.lzq.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.websocket.server.PathParam;@Controller
@ResponseBody
@RequestMapping("/aaa")
@RefreshScope//实现实施刷新nacos配置中心信息
public class ProductController {@Autowiredprivate ProductService productService;//{id} 这种方式表示在路径上以/的方式传输参数@GetMapping("/bbb/{id}")public Product1 getByid(@PathVariable Integer id){//@PathVariable该注解用来接收{id}的参数Product1 byId = productService.findById(id);return byId;}@Value("${student.name}")private String name;@GetMapping("/getname")public String getName(){return "name=========="+name;}}

多个微服务公用一个配置🥝

(1)把公共内容提取到一个公共配置文件中

该服务名必须带后缀Properties
在这里插入图片描述
在这里插入图片描述

(2)让微服务引入公共文件

在这里插入图片描述

#读取配置中心的id名
spring.application.name=lzq-01#nacos地址
spring.cloud.nacos.config.server-addr=localhost:8848#配置中心组名
spring.cloud.nacos.config.group=aaa#zipkin地址  不写默认就是9411
spring.zipkin.base-url=http://localhost:9411/#引用公共的配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=gg.properties
spring.cloud.nacos.config.extension-configs[0].group=aaa
spring.cloud.nacos.config.extension-configs[0].refresh=true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/28536.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STM32 ARM+FPGA伺服控制系统总体设计方案(一)

设计需求 一套完整的伺服控制方案包括了上位机、驱控一体控制器和功率板三者。操作人员 通过上位机发送各种不同指令&#xff0c;然后控制器解析指令后执行相应的伺服功能&#xff0c;其次控 制器将驱动信号传输至功率板驱动电机&#xff0c;最后控制器采集反馈信息进行闭环…

尚硅谷大数据Flink1.17实战教程-笔记03【Flink运行时架构】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…

宋浩线性代数笔记(一)行列式的计算

本帖更新b站宋浩老师的线代网课笔记&#xff0c;内容较为细致详细&#xff0c;参考书用的是科学出版社的第三版&#xff0c;之后会附加同济出版社第六版的教材内容。 &#xff08;字不好看大家将就看吧QAQ&#xff09;

css+js实现点击特效效果

话不多说&#xff0c;先上效果图 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title…

Linux(CentOS7)下源码编译 PostgreSQL13.10 安装手册

Linux&#xff08;CentOS7&#xff09;下PostgreSQL安装手册 文章目录 一、准备PostgreSQL二、安装PostgreSQL2.1解压安装包2.2编译PG2.3查看PG安装目录2.4配置PG环境变量2.5查看PG版本2.6创建postgres用户2.7创建PG数据库数据存放目录2.8授权PG数据库数据存放目录2.9切换postg…

在Windows下安装Anaconda平台

Anaconda介绍 安装Python的方法有很多&#xff0c;其中利用Anaconda来安装&#xff0c;是最为安全和便捷的方法之一。在Python中安装类库&#xff0c;各个类库之间可能存在相互依赖、版本冲突等问题。为了解决这个问题&#xff0c;Python社区提供了方便的软件包管理工具&#…

《数据结构》数据结构概念,顺序表,链表

目录 1. 为什么学习数据结构&#xff1f; 2. 数据结构 2.1. 数据 2.2. 逻辑结构 2.3. 存储结构 2.4. 操作 3. 算法 3.1. 算法与程序 3.2. 算法与数据结构 3.3. 算法的特性 3.4. 如何评价一个算法的好坏 4. 线性表 4.1. 顺序表 4.2. 单向链表 4.3. 单向循环链表&…

如何在Windows中将任务导入任务计划程序

任务计划程序使你能够在选定的计算机上自动执行例行任务。任务调度程序通过监视你选择的启动任务的任何条件&#xff08;称为触发器&#xff09;&#xff0c;然后在满足条件时执行任务来实现这一点。 你可以导入导出的任务&#xff0c;这将把导入的任务添加到任务文件夹中&…

复习java基础

复习一天有点忘了的知识&#xff1a; 结构化编程 结构化程式设计(英语:Structured programming)是1960年代开始发展起来的一种编程典范。它采用子程序、程式码区块、for循环以及while循环等结构来取代传统的goto。 指导思想 自顶向下、逐步求精、模块化 编程过程 流程图是…

SOMEIP协议----第一节(概述)

SOMEIP协议 概述 1.什么是SOME/IP? SOME/IP: 如上图所述,连起来就是基于车载以太网技术的面向服务的可扩展中间件 汽车某ECU软件算法如果需要和其他ECU交互,大部分都通过跨ECU之间的服务来实现,即可以通过车载以太网异步调用其他ECU上的服务,应用开发者只需要关注服务…

Linux下安装Mysql (CentOS 7) 详解

文章目录 前言环境检查查看是否安装MySql查看系统版本 源安装安装mysql的yum源官网下载从windows上传到linuxrz命令 方法2&#xff1a; 安装Mysql常见错误密钥问题安装后查看mysql是否可以工作查看是否安装成功启动服务 登录mysql配置文件方法&#xff08;免密码&#xff09; 使…

【ARM Cortex-M 系列 1 -- Cortex-M0, M3, M4, M7, M33 差异】

文章目录 Cortex-M 系列介绍Cortex-M0/M0 介绍Cortex-M3/M4 介绍Cortex-M7 介绍Cotex-M33 介绍 下篇文章&#xff1a;ARM Cortex-M 系列 2 – CPU 之 Cortex-M7 介绍 Cortex-M 系列介绍 Cortex-M0/M0 介绍 Cortex-M0 是 ARM 公司推出的一款微控制器&#xff08;MCU&#xff0…