springcloud本地調試feign調用出現的詭異404問題及解決
本地調試feign調用出現的詭異404問題
問題產生
最近在給公司準備做分布式事務框架seata的調研,準備搭建一套demo,根據阿里云官網的案例,我準備搭建一套微服務架子,分別含有business、order、storage三個微服務組成,其中第一個微服務實現業(yè)務聚合,調用后面兩個微服務,后面兩個微服務只需要暴露接口,操作相關的數據庫,我再利用seata來做分布式的場景演示!
技術框架
SpringCloud eureka mybatis-plus feign ribbon seata
核心代碼
business調用方,在一個接口中通過feign調用其他2個服務
package com.blue.seata.business.service; import com.blue.seata.order.api.remote.RemoteOrderService; import com.blue.seata.storage.api.remote.RemoteStorageService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @author liulei * @version 1.0 */ @Service public class BusinessService { private static final Logger logger = LoggerFactory.getLogger(BusinessService.class); @Autowired RemoteOrderService orderService; @Autowired RemoteStorageService storageService; public boolean buy(String userId, String code, Integer count) throws InterruptedException { logger.info("用戶購買商品[{}],[{}]", code, count); orderService.create(userId, code, count); logger.info("調用訂單中心服務成功"); Thread.sleep(2000); storageService.minus(code, count); logger.info("調用庫存中心服務成功"); return true; } }
Eureka客戶端配置,我使用的是網上公益注冊中心
eureka: instance: prefer-ip-address: true #以IP地址注冊到服務中心,相互注冊使用IP地址 client: service-url: defaultZone: http://eurekdsa.springclouddsds.cn/edsdureka/ registry-fetch-interval-seconds: 5
詭異的404
問題描述:在保證Feign接口暴露的配置沒有錯誤的前提下【一定沒問題】,我使用postman調用business的測試接口,第一次調用成功,但是再點擊同樣的接口,出現了以下報錯,我貼一下postman
第一次:
第二次:
心態(tài)
很絕望,但是沒辦法,還是得埋頭進去看看是哪個錯誤,看控制臺的錯誤提示,發(fā)現這個地方對于服務最終解析的URL與我預期有出入
business中,第二次再調用接口的時候出現的,為什么是個問題,我解釋一下,我的business端口是6000,order端口是7000,storage是8000,大家反應過來沒有,這塊解析出來的order接口調用怎么都不應該是8000的端口,很明顯,解析出了問題,也就是說Feign解析出問題了,再往下想,Feign的組成由Ribbon+HttpClient組成,即服務路由+http訪問兩部分組件組成,這樣,我就基本可以確定,Ribbon的配置,出了問題,很遺憾我自己沒有解決,而且花費了大量時間去查詢資料,但是沒有一個匹配上,大多說的都是常規(guī)配置,比如context-path,和consume、produce等格式配置的問題,最后問了一個小伙伴,他就調整了我business服務一個地方的代碼,看圖
小結:
我到現在都不知道@RibbonClient這個注解,小伙伴解釋說這是服務級別的負載均衡,而注入Bean的方式的負載是全局負載,這可能和我本地的調試環(huán)境有關系,我再描述一下我的測試環(huán)境:
1.本地三個服務,基本上代碼都一樣,使用同一個Eureka注冊中心
2.Ribbon和Feign的代碼符合日常咱們開發(fā)所見的代碼
3.自己近期狀態(tài)不好,過分相信百度,各種嘗試,發(fā)現問題定位的太晚,找到問題也不知道如何去描述,尷尬
4.關于這一塊的解釋,我后續(xù)需要翻閱資料才能給出,抱歉啦!
springcloud在本地調試的踩坑記錄
1、在本地調試的時候
可以專門配置一個application-local.yml。這個yml只在本地調試的時候使用。我覺得這個還是很有必要的,可以只在本地保存,不提交到Git。
2、修改配置文件中關于eureka的配置
之前自己一直沒有注意到這個問題,導致在服務本地運行起來之后,一直不能再eureka的控制臺看到本地的服務。后來才注意到時自己沒有修改eureka中關于instance_id的配置。由于運行了兩個相同id的服務,所以會沖突。解決的辦法可以在eureka的instant_id的配置后面添加:{random.value},通過添加隨機數使得服務可以注冊兩次。
3、還是關于eureka的配置
在本地服務調用其他服務的時候,我發(fā)現一直是報超時的。看了后臺服務的運行情況,用postman試一試,用swagger試一試,結果都沒有超時,我一度以為是我的網絡有問題。后來突然想到服務的eureka配置。
我們的配置文件是這樣的:
prefer-ip-address: true ip-address: 1**.***.***.49 # 訪問的路徑變?yōu)镮P地址
上面代碼中的ip是阿里云的內網地址,外部是無法直接訪問的,于是我把第二行代碼注釋掉,換成相應的外網地址。問題就這樣解決了。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java中Thread和Runnable創(chuàng)建線程的方式對比
本文主要介紹了Java中Thread和Runnable創(chuàng)建線程的方式對比,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07Spring AOP有多少個通知以及它們的執(zhí)行順序介紹
這篇文章主要介紹了Spring AOP有多少個通知以及它們的執(zhí)行順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11java開發(fā)ServiceLoader實現機制及SPI應用
這篇文章主要為大家介紹了java開發(fā)ServiceLoader實現機制及SPI應用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10Sentinel源碼解析入口類和SlotChain構建過程詳解
這篇文章主要為大家介紹了Sentinel源碼解析入口類和SlotChain構建過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09Java源碼解析阻塞隊列ArrayBlockingQueue常用方法
今天小編就為大家分享一篇關于Java源碼解析阻塞隊列ArrayBlockingQueue常用方法,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01