1. 背景
在公司對項目進行拆分,用consul做注冊中心。既然弄注冊中心了, 那就得遠端調用,那就得整上OpenFeign進行遠端調用,你說是不? 不能說就搞個RestTemplate+服務名調用吧?想法有了,說動就動,就對項目就行拆分,在拆分的過程中,就把我學到的拿出來和大家分享分享。(我也是第一次用consul,沒啥經驗)
2. 愛與恨
2.1 恨
2.1.1 遠端調用失敗
在資訊遠端接口調用時,一直抛出異常:Load balancer does not have available server for client:xxx, 調用一直無法成功,看了很多解決辦法,都沒啥用。不過看這類型的日志我們知道,就是服務擷取失敗。 這真是一個頭疼的問題(這個問題搞了一天),TMD,疼都炸了。說一下解決方案。
# 在application.yml中加上以下配置
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
這個問題的根本原因就是consul整個openFeign用ribbon調用擷取不到服務問題。把服務關閉就好了。
2.1.2 一個服務配置多個FeignClient
在拆分過程中,一個服務有很多service接口拿出來調用。例如:A服務中有 service1,service2,B在用Feign調用A接口時,就想對每個Service都有一個代理。預設情況下,不允許有多個代理。 看了很多,發現了一種最簡單的寫法,如下:
/**
* <br>通過contextId就可以區分</br>
*
* @author fattyca1
*/
@FeignClient(name = "PRODUCER", contextId = "bye")
public interface ByeService {
@RequestMapping("/bye")
String sayBye(@RequestParam("bye") String bye);
}
/**
* <br>ceshi</br>
*
* @author fattyca1
*/
@FeignClient(name = "PRODUCER", contextId = "hello")
public interface HelloService {
@RequestMapping("/hello")
String test(@RequestParam("hello") String hello);
}
2.1.3 consul注冊服務覆寫
在用consul進行服務注冊, 服務會被覆寫, 這個時候就要設定不同的
InstantId和prefer-ip
就好了
2.2 愛
這還用想,當然是有學習到了啊,平時都是用的Eureka,突然換成consul,雖然原理是一樣的,但是沒想到還有不是很相容的問題呀,學習到了一波。
當然,最終終于解決完問題,把服務拆好了,可以舒舒服服的修改代碼了。
3. 總結
平時還得多用一些不一樣的東西,然後接觸不一樣的問題,就可以不斷擴充自己的知識圈,總結問題,學習方案。
你的每一個點贊,我都當做喜歡