1. 背景
在公司對(duì)項(xiàng)目進(jìn)行拆分寒亥,用consul做注冊(cè)中心邮府。既然弄注冊(cè)中心了, 那就得遠(yuǎn)程調(diào)用溉奕,那就得整上OpenFeign進(jìn)行遠(yuǎn)程調(diào)用褂傀,你說(shuō)是不? 不能說(shuō)就搞個(gè)RestTemplate+服務(wù)名調(diào)用吧加勤?想法有了仙辟,說(shuō)動(dòng)就動(dòng),就對(duì)項(xiàng)目就行拆分鳄梅,在拆分的過(guò)程中叠国,就把我學(xué)到的拿出來(lái)和大家分享分享。(我也是第一次用consul戴尸,沒(méi)啥經(jīng)驗(yàn))
2. 愛(ài)與恨
2.1 恨
2.1.1 遠(yuǎn)程調(diào)用失敗
在信息遠(yuǎn)程接口調(diào)用時(shí)粟焊,一直拋出異常:Load balancer does not have available server for client:xxx, 調(diào)用一直無(wú)法成功孙蒙,看了很多解決辦法项棠,都沒(méi)啥用。不過(guò)看這類(lèi)型的日志我們知道挎峦,就是服務(wù)獲取失敗香追。 這真是一個(gè)頭疼的問(wèn)題(這個(gè)問(wèn)題搞了一天),TMD坦胶,疼都炸了翅阵。說(shuō)一下解決方案。
# 在application.yml中加上以下配置
spring:
cloud:
loadbalancer:
ribbon:
enabled: false
這個(gè)問(wèn)題的根本原因就是consul整個(gè)openFeign用ribbon調(diào)用獲取不到服務(wù)問(wèn)題迁央。把服務(wù)關(guān)閉就好了掷匠。
2.1.2 一個(gè)服務(wù)配置多個(gè)FeignClient
在拆分過(guò)程中,一個(gè)服務(wù)有很多service接口拿出來(lái)調(diào)用岖圈。例如:A服務(wù)中有 service1讹语,service2,B在用Feign調(diào)用A接口時(shí)蜂科,就想對(duì)每個(gè)Service都有一個(gè)代理顽决。默認(rèn)情況下短条,不允許有多個(gè)代理。 看了很多才菠,發(fā)現(xiàn)了一種最簡(jiǎn)單的寫(xiě)法茸时,如下:
/**
* <br>通過(guò)contextId就可以區(qū)分</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注冊(cè)服務(wù)覆蓋
在用consul進(jìn)行服務(wù)注冊(cè), 服務(wù)會(huì)被覆蓋赋访, 這個(gè)時(shí)候就要設(shè)置不同的InstantId和prefer-ip
就好了
2.2 愛(ài)
這還用想可都,當(dāng)然是有學(xué)習(xí)到了啊,平時(shí)都是用的Eureka蚓耽,突然換成consul渠牲,雖然原理是一樣的,但是沒(méi)想到還有不是很兼容的問(wèn)題呀步悠,學(xué)習(xí)到了一波签杈。
當(dāng)然,最終終于解決完問(wèn)題鼎兽,把服務(wù)拆好了答姥,可以舒舒服服的修改代碼了。
3. 總結(jié)
平時(shí)還得多用一些不一樣的東西谚咬,然后接觸不一樣的問(wèn)題踢涌,就可以不斷擴(kuò)展自己的知識(shí)圈,總結(jié)問(wèn)題序宦,學(xué)習(xí)方案睁壁。