SpringCloud如何解決服務之間的通信問題

1、如何解決服務之間的通信問題?

[1]HTTP REST方式 使用http協議進行數據傳遞 json格式數據
[2]RPC方式 遠程過程調用 二進制數據

OSI七層結構來講,即物理層、數據鏈路層、網絡層、運輸層、會話層、表示層、應用層http屬於應用層協議,而RPC屬於傳輸層,所以RPC方式的傳輸效率比http高SpringCloud使用的是HTTP協議傳遞數據

2、如何在java代碼中發起http方式請求?

spring框架提供HttpClient對象 使用RestTemplate發起一個http請求。

3、實現服務間通信的小案例

 3.1 使用兩個測試服務 用戶服務users和訂單服務orders

3.2 用戶服務和訂單服務都是兩個獨立的SpringBoot應用

在這裡插入圖片描述

3.3 兩個服務都引入consul client依賴和健康檢查依賴

		 <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--consul client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>

3.4 配置兩個服務的application.properties

用戶服務:(默認的服務名稱就是Spring.application.name,所以可以不用指定)

server.port=8888
spring.application.name=USERS

#consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

在這裡插入圖片描述

訂單服務:

server.port=9999
spring.application.name=ORDERS

#consul server
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

在這裡插入圖片描述

3.5 在兩個服務的入口類中加入服務註冊client註解

用戶服務

在這裡插入圖片描述

訂單服務

在這裡插入圖片描述

3.6 控制器開發(這裡進行服務提供者和服務消費者開發) 3.6.1 服務提供者(訂單服務)

OrderController.java

package com.baizhi.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class OrderController {

    @GetMapping("order")
    public String demo(){
       log.info("order demo...");
        return "order demo OK!!!";
    }
}

3.6.2 服務消費者(用戶服務)

UserController.java

package com.baizhi.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@Slf4j
public class UserController {

    @GetMapping("user")
    public String invokeDemo(){
         log.info("user demo...");
        //1、調用訂單服務 服務地址:http://localhost:9999/order  必須是get方式 接收返回值String
        RestTemplate restTemplate = new RestTemplate();
        String orderResult = restTemplate.getForObject("http://localhost:9999/order", String.class);

        log.info("調用訂單服務成功:{}",orderResult);

        return "調用order服務成功,結果為:"+orderResult;
    }
}

3.7 測試服務調用

在服務啟動之後查看consul服務註冊中心,可以看到用戶服務和訂單服務都註冊成功瞭。關於consul服務註冊與發現請看這篇文章:https://www.jb51.net/article/141790.htm

在這裡插入圖片描述

訪問http://localhost:9999/order測試訂單服務:

在這裡插入圖片描述

訪問用戶服務(用戶服務中會調用訂單服務)

在這裡插入圖片描述
訂單服務日志:(這裡的第二次輸出是因為被用戶服務調用)
在這裡插入圖片描述

用戶服務日志:
在這裡插入圖片描述

4、現有RestTemplate方式通信存在的問題?

  • 調用服務的路徑主機和服務端口直接寫死在url中無法實現服務集群時請求負載均衡
  • 調用服務的請求路徑寫死在代碼中,日後提供服務路徑發生變化時不利於後續維護工作。

5、解決RestTemplate負載均衡問題

  • 自定義負載均衡解決策略,但是這樣無法實現服務健康檢查切負載均衡策略過於單一
  • 使用SpringCloud提供的組件 推薦使用Ribbon來解決負載均衡的調用問題

到此這篇關於SpringCloud如何解決服務之間的通信問題的文章就介紹到這瞭,更多相關SpringCloud 服務間通信內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: