1. 程式人生 > >Spring Cloud中的服務間通訊(RestTemplate和Feign)

Spring Cloud中的服務間通訊(RestTemplate和Feign)

大家如果覺得我寫的好,可以關注這個專案,之後我的學習過程中都會把學習筆記放入這個專案中。
https://github.com/IndustriousSnail/learning-notes

Spring Cloud中的服務間通訊(RestTemplate和Feign)

目錄

一、服務間通訊簡介

一個系統可以由不同的微服務構成,比如一個電商系統可以由訂單服務、商品服務、使用者服務等共同組成。 這些服務相互獨立,但又相互依賴。由於它們相互依賴,所以需要通過通訊的方式來進行相互呼叫。

服務間通訊方式主要由兩種:
  1. HTTP(SpringCloud)
  2. RPC(Dubbo)

Spring Cloud中服務間兩種restful呼叫方式:

  1. RestTemplate
  2. Feign

二、RestTemplate的使用

假設我們現在在8080埠啟動一個test服務。 我們使用“http://localhost:8080/test”可以訪問得到一段字串。 現在我們需要使用RestTemplate呼叫該服務

RestTemplate使用總結了以下三種方式。
第一種方式:
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://localhost:8080/test", String.class);

這種方式的弊端很明顯,url是寫死的。沒有用到註冊與發現。如果對方使用叢集,ip地址動態變化,則這邊就相應需要修改。

第二種方式:

@Autowired
private LoadBalancerClient loadBalancerClient;

public String test(){
    RestTemplate restTemplate = new RestTemplate();
    ServiceInstance serviceInstance = loadBalancerClient.choose("TEST"); //從Eureka伺服器中找到該服務的地址等資訊。
    String response = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/test", String.class);
    return response;
}

第二種方式將url的獲取轉變為從Eureka伺服器中提取。前提條件是將“TEST”註冊到Eureka中。
LoadBalancerClient是Spring Cloud提供的方法。

第三種方式:

第三種方式首先要定義一個類,目的是將RestTemplate配置到Bean中

//將RestTemplate配置到Bean中,方便呼叫和生命週期管理。
@Component
public class RestTemplateConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

@Autowired
private RestTemplate restTemplate;

public String test(){
    //第三種方式,使用Bean配置的形式
    String response = restTemplate.getForObject("http://TEST/msg", String.class);
    return response;
}

第三種方式將RestTemplate的生命週期交由Spring管理。
在url中不用填寫地址和埠,而是使用服務的名稱代替。


三、客戶端負載均衡器Ribbon

3.1 Ribbon簡介

Ribbon實現軟負載均衡,核心有三點:
  1. 服務發現:發現依賴服務的列表,就是根據服務的名字,把該服務的例項資訊都找出來。
  2. 服務選擇規則:依據規則策略,從多個服務中,選擇一個有效的服務。
  3. 服務監聽: 檢測失效的服務

實際對應流程:

  1. 使用ServerList(服務發現),將服務下的所有例項都拿到。
  2. 使用ServerListFilter(服務監聽),將不能使用的例項給過濾掉
  3. 使用IRule(服務選擇規則),從可用的例項中,選擇一個例項。

3.2 更改規則選擇器

Ribbon的所有規則選擇器必須整合IRule介面,預設採用的選擇器為RoundRule,該選擇器會輪訓選擇呼叫。 如果想要修改選擇器,在application.yml中配置即可。

配置方式如下:
# 配置負載均衡器的選擇規則,IRule介面。 TEST為要請求服務的名字。
TEST:
  ribbon:
    # 前面的key是固定寫法,後面的RandomRule是要使用的規則選擇類。該類必須實現IRule介面。
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

上述配置例子是將匹配規則換成了隨機的形式。這樣對於後臺可用的例項,會隨機選擇一個進行呼叫。

四 使用Feign進行服務間通訊

1. 增加依賴
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

2.在Application啟動類上增加註解@EnableFeignClients

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

3.新建一個介面,使用該介面進行訪問。

@FeignClient(name="TEST")  //name為要訪問的服務的名字
public interface TestClient {

    @GetMapping("/test")  //要訪問的url
    String test();  //呼叫這個方法,即可獲取到相應服務的內容。返回值為對方返回的型別。方法名可以自定義。
}

4.呼叫上述介面進行訪問

@Autowired
private TestClient testClient;

public String test(){
    String response = testClient.test();
    return response;
}

使用上述方法,就可以進行服務之間的相互呼叫了。
同樣需要各個服務都註冊在Eureka中

Feign的特點:
1.宣告式REST客戶端(偽RPC)
2.採用了基於介面的註解。