亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

spring cloud服務(wù)之間的調(diào)用之ribbon詳解

 更新時間:2021年08月03日 08:44:29   作者:云中志  
關(guān)于spring-cloud的服務(wù)調(diào)用,我們首先需要了解它的兩個核心組件Ribbon和Feign。接下來通過本文給大家詳細介紹spring-cloud服務(wù)之間的調(diào)用之ribbon,感興趣的朋友一起看看吧

前言

昨天,我們通過一個實例演示了,spring-cloud服務(wù)注冊組件——Eureka的基本配置和簡單用法,但是服務(wù)注冊就是為了方便后期的發(fā)現(xiàn)和調(diào)用,所以今天我們趁熱打鐵,分享下spring-cloud服務(wù)之間的調(diào)用。

服務(wù)間的調(diào)用

關(guān)于spring-cloud的服務(wù)調(diào)用,我們首先需要了解它的兩個核心組件RibbonFeign。

我們都知道,spring boot的接口都是基于REST實現(xiàn)的,但是在實際線上運行的時候,考慮到用戶規(guī)模、服務(wù)可用性等方面的因素,我們一般很少是單節(jié)點運行的,通常都是以集群模式部署的,但是在集群部署中,又有一個核心的問題必須解決——負載均衡。關(guān)于負載均衡,各位小伙伴應(yīng)該不陌生,最常用的組件之一nginx其中一個很核心的用途就是做負載均衡,但是nginx在實際做負載均衡的時候,確實不夠方便,需要手動配置服務(wù)地址,如果服務(wù)地址發(fā)生變化,相關(guān)配置也需要修改,所以不夠靈活。

當然spring cloud作為一款微服務(wù)綜合框架,它自然也提供了自己的一套負載均衡解決方案,所以接下來我們就來看下spring cloud的負載均衡組件——Ribbon。

Ribbon

Ribbon中文的意思是絲帶、帶狀物,正如它的含義,它就是連接調(diào)用方和服務(wù)之間的紐帶。

依賴

我們先通過一個簡單實例,來演示下,然后在示例的過程中來解釋,首先是它的核心依賴:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

配置

這個組件你需要添加到服務(wù)調(diào)用方的依賴中。同時,還需要增加它的配置:

@Configuration
public class RibbonConfig {

    // 多節(jié)點負載
    @LoadBalanced
    @Bean(name = "restTemplate")
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@LoadBalanced注解的作用是啟用多節(jié)點負載,這樣后期我們在調(diào)用的時候,RestTemplate客戶端其實就是通過負載均衡的方式在調(diào)用服務(wù)提供者。

服務(wù)調(diào)用方

然后,在服務(wù)調(diào)用方,我們通過RestTemplate去調(diào)用我們的服務(wù)提供者:

@Autowired
private RestTemplate restTemplate;

@GetMapping("/ribbon")
public Object queryUserByProductId() {
    List<JSONObject> jsonObjectList = Lists.newArrayList();
    for (int i = 0; i < 10; i++) {
        JSONObject forObject = restTemplate.getForObject("http://user-center/user/" + (i + 1), JSONObject.class);
        jsonObjectList.add(forObject);
    }
    return jsonObjectList;
}

這里我們通過前面配置的restTemplate來調(diào)用我們的用戶服務(wù),接口的地址就是我們eureka注冊中心顯示的地址:

這里的地址不區(qū)分大小寫,都可以正常訪問。調(diào)用十次,主要是為了測試負載均衡的效果。

服務(wù)提供者

首先我們看下服務(wù)提供者配置:

server.port=8776
eureka.client.service-url.defaultZone=http://localhost:8999/eureka, http://localhost:9000/eureka

第一個配置是指定服務(wù)的端口,如果在本地啟動的話,需要每啟動一次改一個端口,否則會提示端口沖突,如果你用的是IDEA的話,要先運行多應(yīng)用啟動:

第二個配置就是設(shè)定我們的注冊中心,我們有兩個注冊中心,所以指定了兩個地址。

服務(wù)提供者就是一個簡單的controller,在controller內(nèi)部,我們通過DiscoveryClient打印出被調(diào)用者的信息,方便我們查看。

@RestController
public class UserController {
    private Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/user/{id}")
    public JSONObject getUserById(@PathVariable(name = "id") Long id) {
        List<ServiceInstance> instances = discoveryClient.getInstances("user-center");
        logger.info("instances = {}",  instances);
        JSONObject user = new JSONObject();
        user.put("id", id);
        user.put("name", "syske");
        return user;
    }
}

這里需要注意的是,我們導(dǎo)入的DiscoveryClientorg.springframework.cloud.client.discovery包下的,如果不是同這個類,啟動的時候會報錯:

Consider defining a bean of type 'com.netflix.discovery.DiscoveryClient' in your configuration.

測試

我們分別啟動服務(wù)調(diào)用發(fā)和被調(diào)用方,這里我啟動了5user-center,同時eureka服務(wù)也啟動了兩個,這個兩個注冊中心互相注冊監(jiān)控,在實際應(yīng)用中也可以確保服務(wù)穩(wěn)定性。5user-center2個注冊在8999的注冊中心上,有3個注冊在9000的注冊中心上:

然后,我們訪問productribbon接口:

http://localhost:8881/ribbon

瀏覽器返回結(jié)果如下:

同時,在user-center端口為87718775的控制臺,會看到如下信息:

為什么只有87718775收到了請求,因為87718775都注冊到了8999的注冊中心,而且我們的product-service也注冊在該服務(wù)中心,所以就只調(diào)用了87718775這兩個服務(wù):

根據(jù)運行結(jié)果,我們還發(fā)現(xiàn)在10次請求中,87718775各處理五次,這里面還有一個潛藏的知識點:Ribbon默認的負載策略是輪詢策略,這樣可以確保同一個注冊中心下的所有服務(wù)節(jié)點接收到同樣的請求頻次。

如果你把user-center5個服務(wù))、product-serive都注冊在同一個注冊中心,那么你會發(fā)現(xiàn)每個服務(wù)都會被調(diào)用2次。

總結(jié)

總體來說,Ribbon對用戶來說感知確實不夠強,而且經(jīng)過我的測試,我發(fā)現(xiàn)就算拿掉ribbon的依賴,依然可以正常負載均衡,這是因為eureka-client的依賴,已經(jīng)添加過ribbon的依賴了:

好了,今天的Ribbon分享就先到這里吧,我們明天分享基于Feign的聲明式調(diào)用。

到此這篇關(guān)于spring-cloud服務(wù)之間的調(diào)用之ribbon的文章就介紹到這了,更多相關(guān)spring cloud服務(wù)調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis-Plus中公共字段的統(tǒng)一處理的實現(xiàn)

    MyBatis-Plus中公共字段的統(tǒng)一處理的實現(xiàn)

    在開發(fā)中經(jīng)常遇到多個實體類有共同的屬性字段,這些字段屬于公共字段,本文主要介紹了MyBatis-Plus中公共字段的統(tǒng)一處理的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • java中的GC收集器詳情

    java中的GC收集器詳情

    這篇文章主要介紹了java中的GC收集器,GC(Garbage collection )指的是程序內(nèi)存管理分手動和自動,手動內(nèi)存管理,需要我們編程的時候顯式分配和釋放空間,但如果忘記釋放,會造成嚴重的內(nèi)存泄漏問題,下面文章內(nèi)容我們就來實例說明情況,需要的朋友可以參考一下
    2021-10-10
  • Java超詳細教你寫一個學籍管理系統(tǒng)案例

    Java超詳細教你寫一個學籍管理系統(tǒng)案例

    這篇文章主要介紹了怎么用Java來寫一個學籍管理系統(tǒng),學籍管理主要涉及到學生信息的增刪查改,本篇將詳細的實現(xiàn),感興趣的朋友跟隨文章往下看看吧
    2022-03-03
  • Java?對象在?JVM?中的內(nèi)存布局超詳細解說

    Java?對象在?JVM?中的內(nèi)存布局超詳細解說

    這篇文章主要介紹了Java?對象在?JVM?中的內(nèi)存布局超詳細解說,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • JDK8時間相關(guān)類超詳細總結(jié)(含多個實例)

    JDK8時間相關(guān)類超詳細總結(jié)(含多個實例)

    jdk1.8的一些新特性簡化了代碼的寫法,減少了部分開發(fā)量,下面這篇文章主要給大家介紹了關(guān)于JDK8時間相關(guān)類超詳細總結(jié),文中包含了多個實例代碼,需要的朋友可以參考下
    2023-01-01
  • Java正則表達式判斷是否包含數(shù)字、字母、特殊字符及中文的多種方法

    Java正則表達式判斷是否包含數(shù)字、字母、特殊字符及中文的多種方法

    這篇文章主要給大家介紹了關(guān)于Java正則表達式判斷是否包含數(shù)字、字母、特殊字符及中文的多種方法,Java正則表達式在字符串處理和模式匹配中扮演著重要角色,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • springboot 使用ThreadLocal的實例代碼

    springboot 使用ThreadLocal的實例代碼

    這篇文章主要介紹了springboot 使用ThreadLocal的實例代碼,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • springmvc mybatis集成配置示例

    springmvc mybatis集成配置示例

    本文主要介紹springmvc+mybatis集成配置,這里提供了實例代碼,和簡單說明,有需要的小伙伴可以參考下
    2016-09-09
  • 匯總Java中List 去重的 6 種方法

    匯總Java中List 去重的 6 種方法

    這篇文章主要介紹了匯總Java中List 去重的 6 種方法,文章圍繞主題展開List去重的方法,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • java設(shè)計模式之策略模式在促銷活動場景中的使用案例

    java設(shè)計模式之策略模式在促銷活動場景中的使用案例

    這篇文章主要為大家介紹了java設(shè)計模式之策略模式在促銷活動場景中案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論