Spring Cloud Config配置中心学习

配置

  • 统一管理所有微服务的一个服务
  • 众多的微服务配置文件需要配置很麻烦,使用Spring Cloud Config配置中心解决配置问题()
  • 配置中心本身也是一个微服务,需要注册到配置中心
  • 将配置文件放到码云(访问国内的服务器比github快)

实现过程

在码云新建仓库

  • 将user-service的application.yml文件内容上传
  • 配置文件的命名方式:{application}-{profile}.yml或{application}-{profile}.properties
  • application为应用名称
  • profile用于区分开发环境dev,测试环境test,生产环境pro等
    • 开发环境 user-dev.yml
    • 测试环境 user-test.yml
    • 生产环境 user-pro.yml
      在这里插入图片描述
  1. 创建配置中心SpringBoot项目config_server

  2. 勾选Starter坐标依赖:配置中心starter,Eureka客户端starter

  3. 启动类:创建配置中心工程config_server的启动类ConfigServerApplication

    • @SpringBootApplication
      @EnableDiscoveryClient//开启Eureka客户端发现功能
      @EnableConfigServer //开启配置服务支持
      public class ConfigServerApplication {
          public static void main(String[] args) {
              SpringApplication.run(ConfigServerApplication.class,args);
          }
      }
      
  4. 配置文件:创建配置中心工程config_server的配置文件application.yml

    # 端口
    server.port: 12000
    # 应用名称
    spring.application.name: config-server
    # git仓库地址
    spring.cloud.config.server.git.uri: https://gitee.com/liuyaxiong01/ahu-spring-cloud-config.git
    # 注册中心地址
    eureka.client.service-url.defaultZone: http://127.0.0.1:10086/eureka
    
    • 注意:上述spring.cloud.config.server.git.uri是在码云创建的仓库地址
  5. 启动测试:启动eureka注册中心和配置中心;

    • 访问http://localhost:12000/user-dev.yml查看能否输出码云存储管理的user-dev.yml文件
      在这里插入图片描述

    • 并且可以在gitee上修改user-dev.yml,然后刷新上述测试地址也能及时更新数据
      在这里插入图片描述
      在这里插入图片描述

从配置中心获取配置

在这里插入图片描述

关于application.yml和bootstrap.yml文件的说明:

  • bootstrap.yml文件是SpringBoot的默认配置文件,而且其加载时间相比于application.yml更早。
  • bootstrap.yml和application.yml都是默认配置文件,但定位不同
    • bootstrap.yml相当于项目启动的引导文件
    • application.yml文件是微服务的常规配置参数,变化比较频繁
  • 搭配spring-cloud-config使application.yml的配置可以动态替换。

目标:改造user_service工程,配置文件不再由微服务项目提供,而是从配置中心获取。

实现步骤:

  1. 在user_service服务中,添加Config的starter依赖
  2. 删除application.yml配置文件,新增bootstrap.yml配置文件
  3. 配置bootstrap.yml配置文件:
    • 配置中心相关配置(配置文件前缀、后缀,仓库分支,是否开启配置中心)
    • 注册中心地址
  4. 启动服务,测试效果

实现过程:

  1. 添加依赖

    <!--spring cloud 配置中心-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
    </dependency>
    
  2. 修改配置

    • 删除user_service工程的application.yml文件

    • 创建user_service工程bootstrap.yml配置文件,配置内容如下

# 注册中心地址
eureka.client.service-url.defaultZone: http://127.0.0.1:10086/eureka

# 配置中心相关配置
spring:
  cloud:
    config:
      discovery:

        enabled: true
        # 配置服务中心的名称
        service-id: config-server
      # 与远程仓库中的配置文件的application和profile保持一致,{application}-{profile}.yml user-dev.yml
      # 配置文件的名称
      name: user
      # 配置文件的环境{dev test pro}
      profile: dev
      # 所在的分支
      label: master

启动项目可以看到从码云抓取配置文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

启动多个项目的的时候发现端口冲突,user-service只能启动一个

猜想是从码云抓取的配置文件在-Dserver.port之后,无法通过VM options改变端口,导致端口无法改变
在这里插入图片描述

解决方案:
将server.port: 9091放在bootstrap.yml中并将其从码云的user-dev.yml中删除

测试结果:
顺利启动了多个项目
在这里插入图片描述

配置中心存在的问题

  • 只有在服务启动的时候获取配置文件,服务启动之后就配置文件更改是不能获取到改动的

实现步骤

  1. 更改码云的配置文件
    在这里插入图片描述

  2. 获取配置文件,在user-service中获取配置
    在这里插入图片描述

  3. 测试
    在这里插入图片描述

  4. 改变码云中的配置文件
    在这里插入图片描述

  5. 再次测试,获取的参数并没有变化
    在这里插入图片描述

消息总线

如何解决上面的那个问题呢?
消息总线可以广播配置文件的更改

在这里插入图片描述

需要借助rabbitmq,windows环境下安装可能会失败,选择使用linux中使用docker安装:安装教程

改造配置中心

改造步骤:

  1. 在config_server中,加入Bus和RabbitMQ的依赖
  2. 修改配置文件:RabbitMQ服务地址,触发配置文件更改接口

实现过程

  1. 在config_server项目中加入Bus相关依赖

    <!--消息总线依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-bus</artifactId>
    </dependency>
    <!--RabbitMQ依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
    </dependency>
    
  2. 在config_server项目中修改application.yml

    # RabbitMQ的服务地址
    spring.rabbitmq.host: 192.168.200.128
    spring.rabbitmq.port: 5672
    spring.rabbitmq.username: guest
    spring.rabbitmq.password: guest
    
    # 触发配置文件广播的地址actuator的endpoint
    management.endpoints.web.exposure.include: bus-refresh
    

改造用户服务

需要启动rabbitmq
改造步骤:

  1. 在user-service中,加入Bus和RabbitMQ的依赖
  2. 修改配置文件:RabbitMQ服务地址
  3. 在需要刷新配置的类上加@RefreshScope注解
  4. 测试效果

实现过程:

  1. 在用户微服务user_service项目中加入Bus相关依赖

    <!--消息总线依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-bus</artifactId>
    </dependency>
    <!--RabbitMQ依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
    </dependency>
    
  2. 修改user_service项目的bootstrap.yml

    # RabbitMQ的服务地址
    spring.rabbitmq.host: 192.168.200.128
    spring.rabbitmq.port: 5672
    spring.rabbitmq.username: guest
    spring.rabbitmq.password: guest
    
  3. 改造用户微服务user_service项目的UserController

    @RestController
    @RequestMapping("/user")
    @RefreshScope //刷新配置
    public class UserController {
    
        @Value("${server.port}")
        private String port;
    
        @Value("${test.hello}")
        private String name;
        
        @Autowired
        UserService userService;
        //查询所有
        @RequestMapping("/findAll")
        public List<User> findAll() {
            return userService.findAll();
        }
        //根据id查询
        @RequestMapping("/findById")
        public User findById(Integer id) {
            System.out.println("服务【"+port+"】被调用");
            User user = userService.findById(id);
            user.setNote("服务【"+port+"】被调用");
            user.setName(name);
            return user;
        }
    
    }
    
    

需要先启动配置中心再启动服务提供者,否则服务提供者无法启动: 这里的测试没有启动网关和消费者,直接访问服务
在这里插入图片描述
在这里插入图片描述
改变码云的配置文件
在这里插入图片描述
此时调用服务,并没有获取的参数并没有改变
在这里插入图片描述
需要发送post请求触发
在这里插入图片描述
在这里插入图片描述
再次测试

服务提供者中显示刷新了
在这里插入图片描述
但是浏览器中访问还是没有刷新
因为犯了一个很sb的错误,这个注解给加到启动类上面了,改回来后可以正常运行
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值