Springboot-微服務-微服務元件之服務管理-eureka-消費端呼叫服務
阿新 • • 發佈:2021-07-17
Springboot-微服務-微服務元件之服務管理-eureka-消費端呼叫服務
微服務現在大部分的呼叫方式都是rest風格的呼叫方式也就常見的http,當然也還有另一種方式就是RPC
認識RPC
RPC,即 Remote Procedure Call(遠端過程呼叫),是一個計算機通訊協議。 該協議允許運行於一臺計算機的程式呼叫另一臺計算機的子程式,而程式設計師無需額外地為這個互動作用程式設計。說得通俗一點就是:A計算機提供一個服務,B計算機可以像呼叫本地服務那樣呼叫A計算機的服務。
通過上面的概念,我們可以知道,實現RPC主要是做到兩點:
- 實現遠端呼叫其他計算機的服務
- 要實現遠端呼叫,肯定是通過網路傳輸資料。A程式提供服務,B程式通過網路將請求引數傳遞給A,A本地執行後得到結果,再將結果返回給B程式。這裡需要關注的有兩點:
- 1)採用何種網路通訊協議?
- 現在比較流行的RPC框架,都會採用TCP作為底層傳輸協議
- 2)資料傳輸的格式怎樣?
- 兩個程式進行通訊,必須約定好資料傳輸格式。就好比兩個人聊天,要用同一種語言,否則無法溝通。所以,我們必須定義好請求和響應的格式。另外,資料在網路中傳輸需要進行序列化,所以還需要約定統一的序列化的方式。
- 1)採用何種網路通訊協議?
- 要實現遠端呼叫,肯定是通過網路傳輸資料。A程式提供服務,B程式通過網路將請求引數傳遞給A,A本地執行後得到結果,再將結果返回給B程式。這裡需要關注的有兩點:
- 像呼叫本地服務一樣呼叫遠端服務
- 如果僅僅是遠端呼叫,還不算是RPC,因為RPC強調的是過程呼叫,呼叫的過程對使用者而言是應該是透明的,使用者不應該關心呼叫的細節,可以像呼叫本地服務一樣呼叫遠端服務。所以RPC一定要對呼叫的過程進行封裝
RPC呼叫流程圖:
想要了解詳細的RPC實現,給大家推薦一篇文章:自己動手實現RPC
認識Http
Http協議:超文字傳輸協議,是一種應用層協議。規定了網路傳輸的請求格式、響應格式、資源定位和操作的方式等。但是底層採用什麼網路傳輸協議,並沒有規定,不過現在都是採用TCP協議作為底層傳輸協議。說到這裡,大家可能覺得,Http與RPC的遠端呼叫非常像,都是按照某種規定好的資料格式進行網路通訊,有請求,有響應。沒錯,在這點來看,兩者非常相似,但是還是有一些細微差別。
- RPC並沒有規定資料傳輸格式,這個格式可以任意指定,不同的RPC協議,資料格式不一定相同。
- Http中還定義了資源定位的路徑,RPC中並不需要
- 最重要的一點:RPC需要滿足像呼叫本地服務一樣呼叫遠端服務,也就是對呼叫過程在API層面進行封裝。Http協議沒有這樣的要求,因此請求、響應等細節需要我們自己去實現。
- 優點:RPC方式更加透明,對使用者更方便。Http方式更靈活,沒有規定API和語言,跨語言、跨平臺
- 缺點:RPC方式需要在API層面進行封裝,限制了開發的語言環境。
主要關鍵點
- 引入eureka客戶端的依賴
- 在springboot啟動器上新增,開啟eureka註解
呼叫方式
第一種呼叫方式
1.1 配置引入相關依賴
只要是你想呼叫服務,或者提供服務你就必須引入eureka的客戶端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
1.2 在springboot啟動器上新增,開啟eureka註解
package com.caicai;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient//開啟eureka服務端的呼叫
@SpringBootApplication
public class ConsumerServiceApplication {
//Spring boot 呼叫的介面大部分都是rest風格的介面,這裡我們使用,Spring 自帶的resTemplate 去呼叫,它包含了:http,post 等等
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ConsumerServiceApplication.class);
}
}
1.3 在消費端 注入DiscoveryClient,restTemplate
//動態呼叫方式
@GetMapping("{id}")
public User queryById(@PathVariable("id") Long id)
{
//根據服務ID 獲取例項
List<ServiceInstance> instances = discoveryClient.getInstances("user-service");
//從例項種獲取相關資訊
ServiceInstance instance = instances.get(0);
String url = "http://"+instance.getHost()+":"+instance.getPort()+"/user/"+id;//這裡獲取的IP和地址,是獲取的是userservice裡面的ip地址,如果我在
// userservice 中的application.yml 配置了
//instance:
// prefer-ip-address: true # 使用Ip地址
//ip-address: 127.0.0.1 即便你在eureka上看到了地址是主機名也好,還是其它IP,這裡獲取的URL地址必定是你的配置的IP地址值。
User user = restTemplate.getForObject(url,User.class);
return user;
}
開開心心,上班!
快快樂樂,遊玩!
及時行樂!