一、問題引出
今天公司讓做一個配置中心,可以在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