在业务开发中需要将数据配置放在k8s configMap中,并且需要根据线上业务进行调整。需求:避免服务频繁重启、通过configMap实时更新配置。

添加依赖

pom.xml

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
            <version>1.1.10.RELEASE</version>
        </dependency>

启用reload

bootstrap.properties

spring.cloud.kubernetes.config.name=istio-demo-config
spring.cloud.kubernetes.config.namespace=istio-demo
management.endpoint.restart.enabled=true
# Reload Config
spring.cloud.kubernetes.reload.enabled=true
spring.cloud.kubernetes.reload.mode=polling
# 5s刷新,主动pull
spring.cloud.kubernetes.reload.period=5000
spring.cloud.kubernetes.reload.strategy=refresh

使用@RefreshScope或@ConfigurationProperties进行动态配置

controller.java

@RefreshScope
@Slf4j
@RestController
@RequestMapping("/api")
public class FileController {

    @Autowired
    private UserFeignClient userFeignClient;

    @Value("${age:0!}")
    private String age;

    @Value("${attrs:#{null}}")
    private Optional<String[]> attrs;
    
    @GetMapping("/test")
    public JSONObject test() {
        JSONObject res = new JSONObject();
        res.put("age", age);
        res.put("attrs", attrs);
        return res;
    }
}

测试接口:http://loaclhost:8080/api/test

configMap:

kind: ConfigMap
apiVersion: v1
metadata:
  name: istio-demo-config
  namespace: istio-demo
  annotations:
    kubesphere.io/creator: wbyu3
    kubesphere.io/description: springboot服务静态资源配置
data:
  age: '28'
  attrs: '[ "tag3","tag4" ]'
  logging.level.root: DEBUG


测试:

修改configMap中的age attrs值,然后测试接口返回值是否变更。