nacos配置&gateway配置服務發現一直報500

蜗牛使劲冲發表於2024-07-31

專案場景:

這兩天不是一直在搞簡化配置、使用公共配置、我的服務可以透過閘道器訪問這幾個任務嘛,也是不斷地踩坑補知識才總算把這幾個任務都搞好了,下面就是記錄過程中遇到的問題。


使用公共配置

因為發現專案使用的配置檔案過多,有application、application-test.yml、bootstrap.yml、遠端nacos配置,我想不能搞得簡單些就儘量把所有配置都放到線上,本地只是做區分麼,然後自己惡補了下application和bootstrap區別

application和bootstrap區別和優先順序

順序:bootstrap.properties > bootstrap.yml > application.properties > application.yml
優先順序:properties>yml
檔案位置優先順序:
src裡的config資料夾>>根目錄>>resource裡的config資料夾>>resource下的
小結:
同樣的yml,bootstrap比application優先順序高,是由父上下文載入的,而application是由子載入
bootstrap一般配置的是引導配置,連線的是spring cloud配置中心,預設本地不能覆蓋遠端配置,遠端配置一些加密的資訊


使用公共配置common.yml

直接上配置程式碼,注意引數裡面

chixxxxx:
  nacos:
    server-addr: 123.123.000.000:8848
spring:
  profiles:
    active: test
  application:
    name: chixxxxx-gateway
    group: chixxxxx_GROUP
  cloud:
    nacos:
      discovery:
        group: ${spring.application.group}
        namespace: ${spring.profiles.active}
        server-addr: ${chixxxxx.nacos.server-addr}
      config:
        group: ${spring.application.group}
        namespace: ${spring.profiles.active}
        server-addr: ${chixxxxx.nacos.server-addr}
        prefix: ${spring.application.name}
        shared-configs:
          - data-id: common.yml
            group: ${spring.application.group}
        extension-configs:
          - data-id: chixxxxx-gateway-test.yml
            group: ${spring.application.group}


配置閘道器服務

我之前上家公司是配過閘道器的,其實就是指定服務+斷言路徑就行了,但是這邊還是有點區別,首先是nginx.conf那邊,先做了個匹配路徑轉發到閘道器的一個操作,如下

location /api/backend/ {
                proxy_pass http://localhost:8001;
            }

提前轉發到閘道器,然後閘道器配置

- id: platform後臺介面
        uri: lb://chixxxx-platform
        order: 1000
        predicates:
          - Path=/api/backend/**
        filters:
          - StripPrefix=0
          - name: RequestRateLimiter
            args:
              key-resolver: '#{@hostAddrKeyResolver}'
              redis-rate-limiter:
                replenishRate: 20
                burstCapacity: 50

這裡面尤其要注意的是StripPrefix這個引數,之前沒有太注意,還弄出個404,看了些講解才知道這個就是去掉我一開始請求的路徑上的字元,如:StripPrefix=1,那麼請求到服務就是backend/user/detail?id=1;StripPrefix=2,user/detail?id=1,這個數字代表去掉幾個/分割的字串。

請求服務轉發失敗

這個又是什麼呢,我照樣子請求url,但是返回報500,然後我檢視了下日誌

ERROR 1399157 [reactor-http-epoll-4] org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler [bfc53f9d-5959]  500 Server Error for HTTP GET "/api/backend/appVersion/detail?id=12"

就是伺服器錯誤,我再看目標伺服器上的日誌,沒有新增日誌,然後就因為報錯資訊有限,我前前後後花了靠一天時間最後透過“同義千問”找到靈感-好好對一下服務狀態是否正常,開啟:服務列表-服務詳情,看到健康狀態是ture啊,那為啥報500,再看ip地址,這個ip寫的是:172.17.0.5這個好像docker或者內網地址啊,一開始懷疑內網,但是想想不會啊,我的伺服器在外頭的,然後再去目標伺服器執行:docker inspect xxx,看到就是這個,哦~原來把docker分配的ip註冊到nacos上了,我應該是要把伺服器ip註冊上去,透過千問需要設定

spring:
  cloud:
    nacos:
      discovery:
        ip: 123.123.123.123

然後重新發下,再去詳情看下,ip變了,還有記得把埠號開放!最後再透過postman請求下就可以透過閘道器地址訪問到了


小結

最近這個禮拜做的這幾個任務都是我自發去做的,因為看到了配置比較亂現在使用者數比較少可以折騰,避免後期人多了再折騰損耗比較大,同時對gateway這塊知識查漏補缺也有了相應的提高。

相關文章