微服务-服务配置

1.服务配置中心介绍

⾸先我们来看⼀下,微服务架构下关于配置⽂件的⼀些问题

  • 配置⽂件相对分散 。在⼀个微服务架构下,配置⽂件会随着微服务的增多变的越来越多 ,⽽且分散在各个微服务中,不好统⼀配置和管理

  • 配置⽂件**⽆法区分环境** 。微服务项目可能会有多个环境。例如:测试环境、预发布环境、⽣产环境。每⼀个 环境所使⽤的配置理论上都是不同的,⼀旦需要修改,就需要我们去各个微服务下⼿动维护,这⽐较困难。

  • 配置⽂件**⽆法实时更新** 。我们修改了配置⽂件之后,必须重新启动微服务才能使配置⽣效,这对⼀个正在运 ⾏的项⽬来说是⾮常不友好的。

需要配置中心来解决这些问题

配置中⼼的思路是:

  • ⾸先把项⽬中各种配置全部都放到⼀个集中的地⽅进⾏统⼀管理 ,并提供⼀套标准的接⼝
  • 当各个服务需要获取配置的时候,就来配置中⼼的接⼝拉取⾃⼰的配置。
  • 当配置中⼼中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。(将这些放入云端

当加⼊了服务配置中⼼之后,我们的系统架构图会变成下⾯这样:

微服务项目主要使用nacos

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

2.Nacos Config入门案例

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

创建一个java项目,来进行一个入门案例。

2.1打开nacos

首先打开nacos,在哪里下载的在哪里打开。

例如:我实在Linux中下载的,在Linux中的**/nacos/bin目录** 下输入sh startup.sh打开即可

在浏览器中输入192.168.xx.xx:8848,出现下面图片中的内容即成功打开

注:192.168.xx.xx为Linux的IP地址

2.2配置nacos

按照下列图片进行操作

在上图中依次进行填写

例如:

注:要选择命名空间

2.2引入依赖

XML 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

2.3编写启动项

java 复制代码
package com.jiazhong.mingxing.project.cloud.nacos.config;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

@SpringBootApplication
@Slf4j
public class CloudNacosConfigApplication {
    @SneakyThrows
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(CloudNacosConfigApplication.class, args);
       
    }
}

2.4配置application.yml文件

java 复制代码
server:
  port: 8010
spring:
  application:
    name: cloud-nacos-config

2.4.1读取application.yml文件中的内容

2.5读取云端中的配置

2.5.1在resources目录下创建bootstrap.properties(bootstrap必须是这个名字)

配置bootstrap.properties

java 复制代码
# 加载云端的配置内容
spring.cloud.nacos.config.namespace=5dde225c-61e0-4015-8a2f-5eabe8407195
spring.cloud.nacos.config.server-addr=192.168.11.88:8848

2.5.2读取云端的内容

application.yml文件中name必须与在nacos中配置的文件名字一致。

在启动文件中编写代码获取配置信息

3.Nacos配置深入

3.1配置一个yaml文件

3.2将properties文件修改成ymal文件

java 复制代码
spring:
  cloud:
    nacos:
      config:
        namespace: 5dde225c-61e0-4015-8a2f-5eabe8407195
        server-addr: 192.168.11.88:8848
        file-extension: yaml

3.3重新启动即可获取远端配置的ymal文件的内容

3.4配置动态刷新

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

java 复制代码
refresh-enabled: true

3.4.1修改启动类

将其改为循环即可输出,将云端的配置修改后下一个循环会改变输出的内容

3.4.2通过配置文件输出

新建controller包,在该包下写ConfigController文件

java 复制代码
@RefreshScope
@RestController
@RequestMapping("/config")
public class ConfigController {
    @Value("${student.id}")
    private String stuId;
    @Value("${student.name}")
    private String stuName;
    @Value("${student.gender}")
    private String stuGender;
    @GetMapping
    public JsonResult a() {
        return ResultTool.success("The Name is " + stuName + " and Gender is " + stuGender + ",userId is " + userId + ",schoolId is " + schoolId + ",userName is " + userName + ",userAge is " + userAge + ",schoolName is " + schoolName);
    }
}

启动后在浏览器中输入http://localhost:8010/config即可获取到,如果改变云端配置文件的内容,刷新即可获取到改变的内容。

3.5可支持profile粒度的配置

3.5.1新建三个配置文件

3.5.2加载

在bootstrap.yml文件中加入下述代码

java 复制代码
  profiles:
    active: test/dev/priduct

在浏览器中输入相应地址即可出现相应内容。

4.⽀持⾃定义Group的配置

在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使⽤的是 DEFAULT_GROUP 。如 果需要⾃定义⾃⼰的 Group ,可以通过以下配置来实现:

需要注意的是:该配置必须放在 bootstrap.properties|yaml ⽂件中。并且在添加配置时 Group 的值⼀
定要和 spring.cloud.nacos.config.group 的配置值⼀致。

5.支持自定义扩展的Date Id配置(重点)

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

  • 拓展配置
  • 共享配置

5.1共享方式(shared-configs)

5.1.1新建两个配置

5.1.2在bootstrap.yml文件中写入下述代码

java 复制代码
        #读取云端的三个配置文件
        shared-configs:
          - data-id: abc.yaml
            group: DEFAULT_GROUP # 默认是DEFAULT_GROUP
            refresh: true
          - data-id: wsgfhin.yaml
          - data-id: uw.yaml
            group: BBBB_GROUP

5.1.3ConfigConroller.java文件

java 复制代码
// 另外两个文件中的内容
    @Value("${user.id}")
    private String userId;
    @Value("${user.name}")
    private String userName;
    @Value("${user.age}")
    private String userAge;
    @Value("${school.id}")
    private String schoolId;
    @Value("${school.name}")
    private String schoolName;

    @GetMapping
    public JsonResult a() {
        return ResultTool.success("The Name is " + stuName + " and Gender is " + stuGender + ",userId is " + userId + ",schoolId is " + schoolId + ",userName is " + userName + ",userAge is " + userAge + ",schoolName is " + schoolName);
    }

5.1.4在浏览器中输入相应地址查看即可

5.2拓展方式(extension-configs)

和上述的共享方式相同,只需将bootstrap.yml文件中的shared-configs修改为extension-configs

注:自己写的优先级>拓展方式>共享方式

相关推荐
大柏怎么被偷了42 分钟前
【Git】基本操作
linux·运维·git
纯粹的热爱44 分钟前
Windows 10/11解决“无法访问共享文件夹—组织安全策略阻止未经身份验证的来宾访问”
运维
_院长大人_1 小时前
Spring Boot 客户端设计示例:自动刷新 Token 并重试接口调用(Springboot Starter 封装)
java·spring boot·后端
乾元1 小时前
AI + Jinja2/Ansible:从自然语义到可执行 Playbook 的完整流水线(工程级深度)
运维·网络·人工智能·网络协议·华为·自动化·ansible
卷到起飞的数分1 小时前
19.Spring Boot原理1
java·spring boot·后端
消失的旧时光-19431 小时前
彻底理解 synchronized:实例锁、类锁与自定义锁的原理和最佳实践
java·开发语言
开源之眼1 小时前
github star 较多的Java双亲委派机制【类加载的核心内容加星】
java
编程火箭车1 小时前
【Java SE 基础学习打卡】19 运算符(中)
java·java入门·运算符·编程基础·赋值运算符·复合赋值·自增自减
是一个Bug1 小时前
Spring事件监听器源码深度解析
java·数据库·spring