天天看點

OpenFeign和Consul愛恨交織的兩天

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. 總結

平時還得多用一些不一樣的東西,然後接觸不一樣的問題,就可以不斷擴充自己的知識圈,總結問題,學習方案。

你的每一個點贊,我都當做喜歡