溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringCloud怎么解決服務(wù)之間的通信問題

發(fā)布時(shí)間:2021-08-22 19:25:55 來源:億速云 閱讀:196 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“SpringCloud怎么解決服務(wù)之間的通信問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“SpringCloud怎么解決服務(wù)之間的通信問題”吧!

目錄
  • 1、如何解決服務(wù)之間的通信問題?

  • 2、如何在java代碼中發(fā)起http方式請(qǐng)求?

  • 3、實(shí)現(xiàn)服務(wù)間通信的小案例

  • 4、現(xiàn)有RestTemplate方式通信存在的問題?

  • 5、解決RestTemplate負(fù)載均衡問題

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

[1]HTTP REST方式 使用http協(xié)議進(jìn)行數(shù)據(jù)傳遞 json格式數(shù)據(jù)
[2]RPC方式 遠(yuǎn)程過程調(diào)用 二進(jìn)制數(shù)據(jù)

OSI七層結(jié)構(gòu)來講,即物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、運(yùn)輸層、會(huì)話層、表示層、應(yīng)用層http屬于應(yīng)用層協(xié)議,而RPC屬于傳輸層,所以RPC方式的傳輸效率比http高。SpringCloud使用的是HTTP協(xié)議傳遞數(shù)據(jù)

2、如何在java代碼中發(fā)起http方式請(qǐng)求?

spring框架提供HttpClient對(duì)象 使用RestTemplate發(fā)起一個(gè)http請(qǐng)求。

3、實(shí)現(xiàn)服務(wù)間通信的小案例

 3.1 使用兩個(gè)測(cè)試服務(wù) 用戶服務(wù)users和訂單服務(wù)orders

3.2 用戶服務(wù)和訂單服務(wù)都是兩個(gè)獨(dú)立的SpringBoot應(yīng)用

SpringCloud怎么解決服務(wù)之間的通信問題

3.3 兩個(gè)服務(wù)都引入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 配置兩個(gè)服務(wù)的application.properties

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

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

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

SpringCloud怎么解決服務(wù)之間的通信問題

訂單服務(wù):

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

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

SpringCloud怎么解決服務(wù)之間的通信問題

3.5 在兩個(gè)服務(wù)的入口類中加入服務(wù)注冊(cè)client注解

用戶服務(wù)

SpringCloud怎么解決服務(wù)之間的通信問題

訂單服務(wù)

SpringCloud怎么解決服務(wù)之間的通信問題

3.6 控制器開發(fā)(這里進(jìn)行服務(wù)提供者和服務(wù)消費(fèi)者開發(fā)) 3.6.1 服務(wù)提供者(訂單服務(wù))

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 服務(wù)消費(fèi)者(用戶服務(wù))

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、調(diào)用訂單服務(wù) 服務(wù)地址:http://localhost:9999/order  必須是get方式 接收返回值String
        RestTemplate restTemplate = new RestTemplate();
        String orderResult = restTemplate.getForObject("http://localhost:9999/order", String.class);

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

        return "調(diào)用order服務(wù)成功,結(jié)果為:"+orderResult;
    }
}

3.7 測(cè)試服務(wù)調(diào)用

在服務(wù)啟動(dòng)之后查看consul服務(wù)注冊(cè)中心,可以看到用戶服務(wù)和訂單服務(wù)都注冊(cè)成功了。關(guān)于consul服務(wù)注冊(cè)與發(fā)現(xiàn)請(qǐng)看這篇文章:http://kemok4.com/article/141790.htm

SpringCloud怎么解決服務(wù)之間的通信問題

訪問http://localhost:9999/order測(cè)試訂單服務(wù):

SpringCloud怎么解決服務(wù)之間的通信問題

訪問用戶服務(wù)(用戶服務(wù)中會(huì)調(diào)用訂單服務(wù))

SpringCloud怎么解決服務(wù)之間的通信問題
訂單服務(wù)日志:(這里的第二次輸出是因?yàn)楸挥脩舴?wù)調(diào)用)
SpringCloud怎么解決服務(wù)之間的通信問題

用戶服務(wù)日志:
SpringCloud怎么解決服務(wù)之間的通信問題

4、現(xiàn)有RestTemplate方式通信存在的問題?

  • 調(diào)用服務(wù)的路徑主機(jī)和服務(wù)端口直接寫死在url中無法實(shí)現(xiàn)服務(wù)集群時(shí)請(qǐng)求負(fù)載均衡

  • 調(diào)用服務(wù)的請(qǐng)求路徑寫死在代碼中,日后提供服務(wù)路徑發(fā)生變化時(shí)不利于后續(xù)維護(hù)工作。

5、解決RestTemplate負(fù)載均衡問題

  • 自定義負(fù)載均衡解決策略,但是這樣無法實(shí)現(xiàn)服務(wù)健康檢查切負(fù)載均衡策略過于單一

  • 使用SpringCloud提供的組件 推薦使用Ribbon來解決負(fù)載均衡的調(diào)用問題

到此,相信大家對(duì)“SpringCloud怎么解決服務(wù)之間的通信問題”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI