Spring Cloud根據(jù)服務(wù)名獲取服務(wù)的ip端口問題
本篇示例我就以Nacos注冊(cè)中心為例了,下面是我注冊(cè)的兩個(gè)服務(wù)。其中nacos-payment-provider
服務(wù)是集群,有兩個(gè)實(shí)例。
方式一:通過loadBalancerClient來獲取
如果使用的Nacos為注冊(cè)中心的時(shí)候會(huì)發(fā)現(xiàn)一個(gè)問題,當(dāng)引入的依賴版本比較高的時(shí)候,RestTemplate
+@LoadBalanced
通過服務(wù)名稱調(diào)用的時(shí)候會(huì)報(bào)錯(cuò),使用其他注冊(cè)中心默認(rèn)都會(huì)引用ribbon依賴,因此我們只需要在注入RestTemplate
的時(shí)候加上@LoadBalanced
就可以實(shí)現(xiàn)根據(jù)名稱負(fù)載均衡調(diào)用。
而nacos高版本依賴包沒有引用ribbon依賴。ribbon早就已經(jīng)徹底停更了,spring又自己出了一個(gè)
loadbalancer
負(fù)載均衡框架,來配合RestTemplate
使用。但是他并沒有自動(dòng)引用loadbalancer依賴所以我們需要自己引用才可以使用。
@Configuration public class ApplicationContextBean { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
使用如下獲取ip端口的前提:引用了loadbalancer來作為負(fù)載均衡
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
loadBalancerClient.choose()這個(gè)方法就是負(fù)載均衡的核心方法。假如服務(wù)名稱為nacos-payment-provider有兩個(gè)實(shí)例,一個(gè)9001一個(gè)9002,通過如下方法調(diào)用會(huì)發(fā)現(xiàn)每次都是在輪詢。
@Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/getServiceInstance") public ServiceInstance getServiceInstance() { ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-payment-provider"); System.out.println(serviceInstance.getHost()); // ip System.out.println(serviceInstance.getPort()); // 端口 System.out.println(serviceInstance.getInstanceId()); // 實(shí)例id System.out.println(serviceInstance.getServiceId()); // 服務(wù)id System.out.println(serviceInstance.getMetadata()); // 與服務(wù)實(shí)例關(guān)聯(lián)的元數(shù)據(jù) System.out.println(serviceInstance.getScheme()); // 返回服務(wù)實(shí)例的方案 System.out.println(serviceInstance.getUri().toString()); // 返回服務(wù)的uri地址 return serviceInstance; }
loadbalancer源碼:
方式二:通過discoveryClient來獲取
這種方式其他注冊(cè)中心也可以使用!
@Resource private DiscoveryClient discoveryClient; @GetMapping("/getServiceInstanceList") public List<ServiceInstance> getServiceInstanceList() { // 根據(jù)服務(wù)名稱查找所有的實(shí)例 return discoveryClient.getInstances("nacos-payment-provider"); }
DiscoveryClient這個(gè)其實(shí)是個(gè)接口存放于cloud-commons包當(dāng)中。
既然是接口為什么他能獲取到呢?我們可以看他的實(shí)現(xiàn)類,是有如下實(shí)現(xiàn)類的,也就是在nacos的服務(wù)發(fā)現(xiàn)依賴當(dāng)中會(huì)存在他的實(shí)現(xiàn)類,并注入到容器當(dāng)中了。其他注冊(cè)中心也是同樣如此??梢哉f這個(gè)接口是共用的,其他的注冊(cè)中心都可以來實(shí)現(xiàn)。
方式三:通過NacosServiceManager來獲取
這個(gè)是nacos獨(dú)有的!
@Autowired private NacosServiceManager nacosServiceManager; @Autowired private NacosDiscoveryProperties nacosDiscoveryProperties; @GetMapping("/nacos") public List<Instance> getGatewayAddress() { String res = null; try { NamingService namingService = nacosServiceManager.getNamingService(nacosDiscoveryProperties.getNacosProperties()); List<Instance> allInstances = namingService.getAllInstances("nacos-payment-provider"); return allInstances; } catch (NacosException e) { e.printStackTrace(); return null; } }
到此這篇關(guān)于Spring Cloud根據(jù)服務(wù)名獲取服務(wù)的ip端口的文章就介紹到這了,更多相關(guān)Spring Cloud ip端口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot整合freemarker實(shí)現(xiàn)代碼生成器
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何整合freemarker實(shí)現(xiàn)一個(gè)簡(jiǎn)單的代碼生成器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03關(guān)于Java的Condition接口最佳理解方式
這篇文章主要介紹了關(guān)于Java的Condition接口最佳理解方式,Condition就是實(shí)現(xiàn)了管程里面的條件變量,Java?語言內(nèi)置的管程里只有一個(gè)條件變量,而Lock&Condition實(shí)現(xiàn)的管程支持多個(gè)條件變量,需要的朋友可以參考下2023-05-05在Ubuntu系統(tǒng)下安裝JDK和Tomcat的教程
這篇文章主要介紹了在Ubuntu系統(tǒng)下安裝JDK和Tomcat的教程,這樣便是在Linux系統(tǒng)下搭建完整的Java和JSP開發(fā)環(huán)境,需要的朋友可以參考下2015-08-08Java實(shí)現(xiàn)對(duì)象復(fù)制的方法實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)對(duì)象復(fù)制的方法實(shí)例,深復(fù)制:復(fù)制出來的對(duì)象中的變量(包括基本類型和字符串)和原來的對(duì)象的值都相同,引用對(duì)象也會(huì)指向復(fù)制出來的對(duì)象,需要的朋友可以參考下2023-08-08Java web Hibernate如何與數(shù)據(jù)庫鏈接
這篇文章主要介紹了Java web Hibernate如何與數(shù)據(jù)庫鏈接,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06VsCode搭建Spring Boot項(xiàng)目并進(jìn)行創(chuàng)建、運(yùn)行、調(diào)試
這篇文章主要介紹了VsCode搭建Spring Boot項(xiàng)目并進(jìn)行創(chuàng)建、運(yùn)行、調(diào)試 ,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05SpringIOC DI循環(huán)依賴實(shí)例詳解
這篇文章主要介紹了SpringIOC——DI循環(huán)依賴,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03