SpringCloud學習記錄——3.服務間調用組件

1.前言

經過上一篇博客的Eureka學習後,接下來我們正式開始服務間調用組件的學習,目前常用的服務間調用組件有Ribbon和OpenFeign,這裏我們就重點來學習一下這兩個組件的使用。

2.Ribbon

Ribbon是一個基於 HTTP 和 TCP 客戶端的負載均衡器
Ribbon也算是Spring Cloud Netflix體系的常規組件,Ribbon提供了內部調用以及負載均衡的能力,此處我們先來看下內部調用。
其原理圖如下所示:
在這裏插入圖片描述

  1. 像之前一樣建立名爲ribbon-client的模塊,同樣記得在選擇依賴時選擇Spring Web、Eureka Discovery、Ribbon,如圖所示:
    在這裏插入圖片描述
  2. 修改配置文件application.yml,代碼如下:
server:
  port: 18765
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:18761/eureka/
spring:
  application:
    name: service-ribbon
  1. 修改啓動類,我們知道Ribbon之所以調用內部接口,依靠的完全是RestTemplate對象來完成,所以我們先注入RestTemplate到Spring管理。
    代碼如下:
package com.springclouddemo.ribbonclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(RibbonClientApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
  1. 接下來,創建一個HiService類,表示要遠程調用的接口服務,注意這裏的uri名字要和調用的application-name相同,即上一篇博客中eureka-client中配置過的,代碼如下:
package com.springclouddemo.ribbonclient.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * @author 莫息濤
 * @Description: Ribbon的測試服務類
 * @date 2020/2/24 11:54
 */
@Service
public class HiService {

    @Autowired
    RestTemplate restTemplate;

    public String hiService() {
        return restTemplate.getForObject("http://SERVICE-HI/hi",String.class);  //註冊的服務名稱
    }

}
  1. 創建一個HiController,調用HiService的方法,代碼如下:
package com.springclouddemo.ribbonclient.controller;

import com.springclouddemo.ribbonclient.service.HiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 莫息濤
 * @Description: Ribbon的對外測試接口
 * @date 2020/2/24 11:54
 */
@RestController
public class HiController {

    @Autowired
    HiService hiService;

    @RequestMapping(value = "/hi")
    public String hi(){
        return hiService.hiService();
    }
}
  1. 按照順序依次啓動eureka-servereureka-clientribbon-client,訪問註冊中心頁面,可以看到ribbon模塊已經啓動,如圖所示:
    在這裏插入圖片描述
  2. 訪問http://localhost:18765/hi,可以看到如下顯示結果,說明ribbon配置成功,如圖所示:
    在這裏插入圖片描述

3.OpenFeign

Feign(現在改名叫OpenFeign)是Spring Cloud的公共組件,不屬於netflix,它也是用來進行服務間調用的,那麼讀者們是不是有一個疑問?有了Ribbon爲什麼還要有Feign。
有沒有考慮過,雖然Ribbon使用RestTemplate形式進行服務間調用,但是對我們來說,我們更想接近的是如同Dubbo或者普通方法調用那個直接來調用Demo-Service提供的服務,那麼這個時候Ribbon是不可以的,所以我們只能使用Feign來完成。

  1. 像之前一樣建立名爲openfeign-client的模塊,同樣記得在選擇依賴時選擇Spring Web、Eureka Discovery、OpenFeign,如圖所示:
    在這裏插入圖片描述
  2. 修改配置文件application.yml,代碼如下:
server:
  port: 18764
eureka:
  instance:
    hostname: localhost
  client:
    service-url:
      defaultZone: http://${eureka.instance.hostname}:18761/eureka/
spring:
  application:
    name: service-openfeign
  1. 修改啓動類,添加註解@EnableFeignClients,表示這是一個Feign的客戶端,代碼如下:
package com.springclouddemo.openfeignclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OpenfeignClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(OpenfeignClientApplication.class, args);
    }

}
  1. 定義一個遠程調用接口HiInterface ,添加註解@FeignClient以調用相應服務,代碼如下:
package com.springclouddemo.openfeignclient.Interface;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * @author 莫息濤
 * @Description: Feign的測試接口
 * @date 2020/2/24 10:48
 */
@FeignClient(value = "service-hi")
public interface HiInterface {

    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String hi();
}
  1. 創建HiController ,用來外訪問從而獲取遠程接口內容,代碼如下:
package com.springclouddemo.openfeignclient.controller;

import com.springclouddemo.openfeignclient.Interface.HiInterface;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author 莫息濤
 * @Description: Feign的對外測試接口
 * @date 2020/2/24 10:50
 */
@RestController
public class HiController {

    @Autowired
    HiInterface hiInterface;

    @RequestMapping("hi")
    public String hi(){
        return hiInterface.hi();
    }
}
  1. 按照順序依次啓動eureka-servereureka-clientopenfeign-client,訪問註冊中心頁面,可以看到openfeign模塊已經啓動,如圖所示:
    在這裏插入圖片描述
  2. 訪問http://localhost:18764/hi,可以看到如下顯示結果,說明openfeign配置成功,如圖所示:
    在這裏插入圖片描述

4.服務間調用組件的負載均衡

事實上,在以上兩個模塊編寫完成後,就已經基本展示了服務間調用組件的作用。然而,爲了體現服務間調用組件的負載均衡特性,我們再添加一個與eureka-client一模一樣的模塊,取名爲eureka-client2,唯一的區別是修改其端口號爲18763。
這裏我們用OpenFeign作爲例子,使用Ribbon也同理。
按照順序依次啓動eureka-servereureka-clienteureka-client2openfeign-client,訪問註冊中心頁面,觀察註冊中心頁面,如圖所示:
在這裏插入圖片描述
可以看到這裏出現了兩個SERVICE-HI服務,而訪問的端口不同。
我們通過OpenFeign不斷來訪問這個服務,可以看到會出現兩種不同的結果,如圖所示:
在這裏插入圖片描述
在這裏插入圖片描述
這說明OpenFeign內部採用了負載均衡的原理,可以訪問相同的uri而抓發到不同的請求,默認的負載均衡爲輪詢模式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章