SpringCloud(Finchley.SR2版本)踩坑笔记(六)------- consul 作为配置中心

consul 除了作为服务发现以外,还有一个重要的功能,可以作为配置中心,从而替换 Spring Cloud Config 的 client-server 配置模式。利用 consul 提供的 key-value 数据存储功能,来实现使用 consul 中的配置覆盖应用程序中的配置。

首先需要知道 Spring Boot 项目还有一个配置文件叫做 bootstrap.yml ,这个配置文件是在 Spring Boot 项目启动引导时载入,比 application.yml 文件更早加载。使用 Consul 作为配置中心,我们就需要把相关配置写入 bootstrap.yml 中。项目代码依旧以  《SpringCloud(Finchley.SR2版本)踩坑笔记(三)-------服务注册与消费》为例

spring:
    application:
        name: spring-cloud-service
    cloud:
        consul:
            host: 10.150.1.99
            port: 8500
            discovery:
                healthCheckPath: /service/health
                healthCheckInterval: 15s
            config:
                # 启用配置
                enable: true
                # consul 中的 key-value 存储格式为 yaml
                format: YAML
                # consul 用于存储配置文件的根目录为 config
                prefix: config
                # 配置文件对应的应用名称
                defaultContext: spring-cloud-service
                # 多个配置文件的分割符
                profileSeparator: ','
                # 最后一层节点的key值名称,一般默认为data
                data-key: data

然后,我们在 application.yml 文件中,声明一个配置值 user.name=local

user:
    name: local

修改项目代码,输出配置文件中这个 name

    @Value("${user.name}")
    private String name;
    
    @RequestMapping(value = "hello", method = RequestMethod.GET)
    @ResponseBody
    public String hello(@RequestParam String name) throws AnkonException {
        String result = "hello " + name + ", you get the service, " + this.name;
        return new RestJson(result).toJson();
    }

此时,访问 http://localhost:9090/service/hello?name=张三 可以得到如下访问结果

然后在 consul 的管理后台中,我们添加相关的key-value值来改变这个变量

此间第二步设置的路径就需要跟据 bootstrap.yml 中配置来具体对应填写。然后重启项目,再次访问 http://localhost:9090/service/hello?name=张三,我们即可看到name的值变化了 

如果你运行的不是默认配置文件,比如 dev, test, prod 等配置文件,那么需要修改 name 值时,需要修改写入的 key-value 路径,比如 dev 配置

这时,使用 java -Dspring.profiles.active=dev -jar service.jar 运行 dev 配置,则会去加载这个dev配置下的name值,访问 http://localhost:9090/service/hello?name=张三 即可看到如下结果:

按照上述方式,我们成功修改了 application.yml 中项目实际运行时的某些变量,但是有一个弊端,每次修改完一个值之后,必须要重启项目,这样是一个比较麻烦的事情,我们可以通过 @ConfigurationProperties 来读取注入 yml 中的变量值,这样在 consul 中修改修个值的时候,代码中的值也会相应的修改掉。

首先,添加依赖:

        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-configuration-processor</artifactId>  
            <optional>true</optional>  
        </dependency>

然后写一个注入类:

package com.ankon.service1;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "user")
public class Config implements EnvironmentAware {

    private final static Logger LOGGER = LoggerFactory.getLogger(Config.class);

    private String name;

    //存储从环境变量读取的当前激活的配置文件名
    private String activeProfile;

    @Override
    public void setEnvironment(Environment e) {
        if (e.getActiveProfiles() != null && e.getActiveProfiles().length > 0) {
            this.activeProfile = e.getActiveProfiles()[0];
            LOGGER.info("Active Profile:[" + this.activeProfile + "]");
        } else {

            LOGGER.info("Active Profile:[null]");
        }
    }

    public String getActiveProfile() {
        return this.activeProfile;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

然后启动项目,按照之前的步骤在 consul 后台中修改变量值, 不用重启项目,访问 http://localhost:9090/service/hello?name=张三 可以看到 name 的值确实变化了。

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项目说明 该项目是一个典型的由Spring Cloud管理的微服务项目,主要包括如下模块 micro-service-cloud─────────────────顶层项目 ├──cloud-service-core───────────────基础核心模块 ├──cloud-service-tools──────────────全局通用工具类 ├──cloud-service-reids──────────────Redis二次封装 ├──cloud-eureka-server──────────────服务注册中心[8761] ├──cloud-turbine-server─────────────断路器聚合监控[8769] ├──cloud-zipkin-server──────────────链路追踪监控[9411] ├──cloud-zuul-server────────────────第一代服务网关(Zuul)[8080] ├──cloud-gateway-server─────────────第二代服务网关(Gateway)[8080] ├──cloud-modules-app────────────────App微服务模块 ├───────modules-app-user────────────App用户服务模块[努力更新中] ├───────modules-app-doctor──────────App医生服务模块[努力更新中] ├──cloud-modules-service────────────微服务通用服务模块 ├───────mongodb-file-service────────Mongodb文件服务模块[11010] ├───────redis-delay-service─────────延迟消费服务模块[11020] ├──cloud-modules-web────────────────Web微服务模块 ├───────modules-web-security────────Web医生服务模块[12010] ├───────modules-web-user────────────Web用户服务模块[12020] ├──cloud-modules-wechat─────────────Wechat微服务模块 ├───────modules-wechat-user─────────Wechat用户服务模块[努力更新中] └───────modules-wechat-doctor───────Wechat医生服务模块[努力更新中] 修改日志 修改日志 修改人 修改日期 版本计划 V1.0 刘岗强 2019-01-07 项目初始化 V1.1 刘岗强 待定 新增自动问答 项目介绍 基于Spring Cloud Finchley SR2 Spring Boot 2.0.7的最新版本。 核心基础项目内实现类自定义的权限注解,配合RBAC权限模型+拦截器即可实现权限的控制,具体的参考项目中的实现。同时也封装了一些顶层类和结果集等。 注册中心实现高可用配置,详情见eureka的one、two、three三个配置文件,摘要如下。 ------------------------------------------配置节点一---------------------------------------------- server: port: 8761 spring: application: name: cloud-eureka-server eureka: instance: hostname: cloud.server.one prefer-ip-address: true instance-id: ${spring.cloud.client.ip-address}:${server.port}:${spring.application.name} client: healthcheck: enabled: true register-with-eureka: false fetch-registry: false service-url: defaultZone: http://cloud.server.two:8762/eureka/,http://cloud.server.three:8763/eureka/ ------------------------------------------配置节点二----------------------------------------------

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值