欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

SpringCloud Config 配置中心数据库无限存储后端解决方案

最编程 2024-03-23 19:32:28
...

一、问题引出

       今天公司让做一个配置中心,可以在redis上作为SpringCloud 配置中心后端,本人是springcloud的菜鸟,但是很懵逼,但还是硬着头皮接下了。翻看官方文档发现,居然只有三种配置中心后端。我那个难受哈,百度了百度发现只有数据库后端可以使,而且还要换springCloud版本,还要写死数据库查询语句,就感觉对我来说没希望了。但是,对微服务的理解还是有的,通信通过httpClient,可以知道,它还是通过访问url获取数据来完成配置的,数据还是json得数据格式。开始追踪问题了。

二、问题追踪

开始寻找解决方案,采用本地配置的文件,然后修改数据库,修改本地配置文件,进一步来达到修改配置的目的,麻烦不,哈哈,我也感觉很麻烦,但是没办法,硬着头皮试试。

配置中心主函数

@EnableConfigServer
@SpringBootApplication
public class TestServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(TestServerApplication.class, args);
	}
}

配置中心配置文件

server:
  port: 7777
spring:
  application:
    name: config-server
  profiles:
    active: native

客户端主函数

@SpringBootApplication
public class TestClientApplication {
	public static void main(String[] args) {
		SpringApplication.run(TestClientApplication.class, args);
	}
}

测试的数据访问接口

@RefreshScope
@RestController
public class TestController {
    @Value("${name}")
    private String name;
    @Value("${name.id}")
    private String id;


    @ResponseBody
    @RequestMapping(value="/from",method= RequestMethod.GET)
    public JSONObject query( ) throws Exception{
        JSONObject rest = new JSONObject();
        rest.put("from",name);
        rest.put("name","didispace");
        rest.put("id",id);
        return rest;
    }
}

配置文件

spring:
  application:
    name: service-gatway
  cloud:
    config:
      discovery:
        enabled: true
        service-id: config-server
      profile: dev

好了,上面的服务和配置都写完成了,中间省略了很多分析过程,直接看找出问题的关键所在

记住一点,如果配置文件读取失败的话,上面的注入是要去掉的,不然项目启动不起来,我们这样是启动不了 的,要把客户端上的字段注入部分要删掉。

启动看日志后会发现,客户端实际上是访问了上面的URL来获取配置的,端口是8888,而我们配置中心的端口是7777,所以访问不了。后来我灵机一动,在配置中心上实现了一个Controller,模拟这个链接返回了请求所要的配置数据。配置中心其他不变增加代码如下:

@RestController
public class TestController {
    @ResponseBody
    @RequestMapping(value="{application}/{dev}",method= RequestMethod.GET)
    public String query(@PathVariable (value = "application") String application,@PathVariable (value = "dev") String dev) throws Exception{
        if(application.equals("service-gatway1")){
            String str ="{\"name\":\"service\",\"profiles\":[\"dev\"],\"label\":null,\"version\":null,\"state\":null,\"propertySources\":[{\"name\":\"dey.yml\",\"source\":{\"server.port\":7003,\"name\":123,\"name.id\":\"123\"}}]}";
            return str;
        }else{

            String str ="{\"name\":\"service\",\"profiles\":[\"dev\"],\"label\":null,\"version\":null,\"state\":null,\"propertySources\":[{\"name\":\"dey.yml\",\"source\":{\"server.port\":7002,\"name\":123,\"name.id\":\"123\"}}]}";
            return str;
        }


    }
}

我给他返回一个符合格式的json数据看看会怎么样,(注:上述数据格式,是在测试正确的情况下,访问上面http://localhost:8888/service-gatway/dev链接得到的),将配置中心端口号改成8888,再继续访问。

配置中心的链接可以访问了,我们改回客户端代码,注入name  和  name.id,启动客户端

这时你会发现客户端起来了,而且端口号也发生了改变,变成咋们配置的7002端口了

访问客户端url,数据返回的是我们所需要的

有了这个,大家感觉是不是什么后端都可以用了,想怎么配置就怎么配置,是不是很爽哈。。。

有什么不对的欢迎大家指正和留言

项目码云地址 https://gitee.com/zhangzexu/SpringCloud.git

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1r0a380nbe7fv