欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Dapr在Java中的服務(wù)調(diào)用實(shí)戰(zhàn)過程詳解

 更新時(shí)間:2023年06月06日 08:57:24   作者:萬貓學(xué)社  
這篇文章主要為大家介紹了Dapr在Java中的服務(wù)調(diào)用實(shí)戰(zhàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

服務(wù)調(diào)用

通過服務(wù)調(diào)用(Service-to-service Invocation),服務(wù)可以使用 gRPC 或 HTTP 這樣的標(biāo)準(zhǔn)協(xié)議來發(fā)現(xiàn)并可靠地與其他服務(wù)通信。

Dapr采用邊車(Sidecar)、去中心化的架構(gòu)。 要使用Dapr來調(diào)用服務(wù),可以在任意Dapr實(shí)例上使用invoke這個(gè)API。 邊車編程模型鼓勵(lì)每個(gè)服務(wù)與自己的Dapr實(shí)例對(duì)話。 Dapr實(shí)例會(huì)相互發(fā)現(xiàn)并進(jìn)行通信。

創(chuàng)建項(xiàng)目

創(chuàng)建兩個(gè)SpringBoot項(xiàng)目,分別命名為:invoke-serverinvoke-client。invoke-server作為下游服務(wù),被invoke-client調(diào)用,具體調(diào)用過程如下圖:

調(diào)用過程包括:

  • invoke-client服務(wù)對(duì)invoke-server服務(wù)發(fā)起HTTP或gRPC調(diào)用的時(shí)候,訪問invoke-client服務(wù)的Dapr實(shí)例。
  • invoke-client服務(wù)的Dapr實(shí)例通過運(yùn)行在給定托管平臺(tái)上服務(wù)名解析組件(Name Resolution Component)發(fā)現(xiàn)了運(yùn)行在此Dapr環(huán)境中的invoke-server服務(wù)。
  • invoke-client服務(wù)的Dapr實(shí)例將消息轉(zhuǎn)發(fā)到服務(wù)invoke-server服務(wù)的Dapr實(shí)例。Dapr實(shí)例之間的所有調(diào)用考慮到性能都優(yōu)先使用gRPC。 僅服務(wù)與Dapr實(shí)例之間的調(diào)用可以是HTTP或gRPC。
  • invoke-server服務(wù)的Dapr實(shí)例將請(qǐng)求轉(zhuǎn)發(fā)至invoke-server服務(wù)上的特定端點(diǎn)或方法,隨后運(yùn)行其業(yè)務(wù)邏輯代碼。
  • invoke-server服務(wù)返回響應(yīng)信息給invoke-client服務(wù)時(shí),響應(yīng)信息給將轉(zhuǎn)至invoke-server服務(wù)的Dapr實(shí)例。
  • invoke-server服務(wù)的Dapr實(shí)例消息轉(zhuǎn)發(fā)至invoke-client服務(wù)的Dapr實(shí)例。
  • invoke-client服務(wù)接收到其Dapr實(shí)例的響應(yīng)信息。

編寫invoke-server的代碼

調(diào)用/send接口時(shí),返回對(duì)應(yīng)信息,主要代碼如下:

package one.more.society.invoke.server;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class InvokeServerController {
    @RequestMapping(value = "/send", method = RequestMethod.POST)
    public InvokeResponse send(@RequestBody InvokeRequest request) {
        log.info("send - request:{}", request);
        InvokeResponse response = new InvokeResponse();
        response.setCode(1);
        response.setStatus("ok");
        response.setMsgId(System.nanoTime());
        response.setMsgContent("I konw you said: " + request.getMsgContent());
        return response;
    }
}

其中,InvokeRequestInvokeResponse的源碼如下:

package one.more.society.invoke.server;
import lombok.Data;
@Data
public class InvokeRequest {
    private Long msgId;
    private String msgContent;
}
package one.more.society.invoke.server;
import lombok.Data;
@Data
public class InvokeResponse {
    private int code;
    private String status;
    private Long msgId;
    private String msgContent;
}

application.properties中配置:

server.port=30001

編寫invoke-client

invoke-client項(xiàng)目的pom.xml文件中添加如下依賴:

<dependency>
    <groupId>io.dapr</groupId>
    <artifactId>dapr-sdk-springboot</artifactId>
    <version>1.4.0</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.3</version>
</dependency>

注入一個(gè)DaprClient的bean:

@Configuration
public class DaprConfig {
    private static final DaprClientBuilder BUILDER = new DaprClientBuilder();
    @Bean
    public DaprClient buildDaprClient() {
        return BUILDER.build();
    }
}

調(diào)用invoke-server/send接口,主要代碼如下:

package one.more.society.invoke.client;
import io.dapr.client.DaprClient;
import io.dapr.client.domain.HttpExtension;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class InvokeClientController {
    @Autowired
    private DaprClient client;
    private static final String SERVICE_APP_ID = "invoke-server";
    private static final String METHOD_NAME = "send";
    @RequestMapping(value = "/say", method = RequestMethod.GET)
    public InvokeResponse say(String message) {
        log.info("send - message:{}", message);
        InvokeRequest request = new InvokeRequest();
        request.setMsgId(System.nanoTime());
        request.setMsgContent(message);
        InvokeResponse response = client.invokeMethod(
                SERVICE_APP_ID,
                METHOD_NAME,
                request,
                HttpExtension.POST,
                InvokeResponse.class).block();
        return response;
    }
}

其中,InvokeRequestInvokeResponse的源碼與invoke-server中是一樣的。

application.properties中配置:

server.port=30002

啟動(dòng)服務(wù)

在啟動(dòng)之前先用mvn命令打包:

mvn clean package

invoke-server項(xiàng)目的目錄中執(zhí)行以下命令,啟動(dòng)invoke-server服務(wù):

dapr run --app-id invoke-server --app-port 30001 --dapr-http-port 31001 -- java -jar target/invoke-server-0.0.1-SNAPSHOT.jar

invoke-client項(xiàng)目的目錄中執(zhí)行以下命令,啟動(dòng)invoke-client服務(wù):

dapr run --app-id invoke-client --app-port 30002 --dapr-http-port 31002 -- java -jar target/invoke-client-0.0.1-SNAPSHOT.jar

在Dapr Dashboard中看到:

兩個(gè)服務(wù)都已經(jīng)啟動(dòng)成功。

訪問http://localhost:30002/say?message=OneMoreSociety驗(yàn)證整個(gè)調(diào)用流程:

可以看到服務(wù)之間的調(diào)用沒有問題,并返回了預(yù)想的結(jié)果。

名稱解析組件

為了啟用服務(wù)發(fā)現(xiàn)和服務(wù)調(diào)用,Dapr使用可插拔的名稱解析組件。 Kubernetes名稱解析組件使用Kubernetes DNS服務(wù)來解析集群中運(yùn)行的其他服務(wù)的位置;自托管機(jī)器可以使用mDNS名稱解析組件。

Consul名稱解析組件可以在任何托管環(huán)境中使用,包括Kubernetes或自托管環(huán)境。下面讓我們來嘗試一下,使用Consul作為名稱解析組件。

在用戶目錄下的.dapr文件夾中,找到config.yaml文件。在該文件中,添加一個(gè)nameResolutionspec ,并將component字段設(shè)置為consul,比如:

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: daprConfig
spec:
  nameResolution:
    component: "consul"
    configuration:
      client:
        address: "127.0.0.1:8500"
      selfRegister: true

重新啟動(dòng)服務(wù),可以在日志中看到注冊(cè)到了Consul上:

time="14:28:54.4540593+08:00" level=info msg="service:invoke-client registered on consul agent" app_id=invoke-client instance=OneMoreSociety scope=dapr.contrib type=log ver=1.7.3
time="14:28:54.4550937+08:00" level=info msg="Initialized name resolution to consul" app_id=invoke-client instance=OneMoreSociety scope=dapr.runtime type=log ver=1.7.3

在Consul中也可以看到兩個(gè)服務(wù)都已經(jīng)注冊(cè)上去了,如下圖:

值得注意的是:Consul名稱解析組件目前還處于Alpha狀態(tài),最好不要在生產(chǎn)環(huán)境使用。

更詳細(xì)的配置說明見下表:

配置項(xiàng)是否必填數(shù)據(jù)類型說明示例
clientNConfig配置客戶端與 Consul 代理的連接。 如果留空,將使用默認(rèn)值,即127.0.0.1:8500192.168.0.111:8500
queryOptionsNQueryOptions配置用于解決健康服務(wù)的查詢,默認(rèn)為UseCache:trueUseCache: false,
Datacenter: "myDC"
checksNAgentServiceCheck數(shù)組當(dāng)進(jìn)行注冊(cè)服務(wù)時(shí),配置健康檢查。默認(rèn)到Dapr實(shí)例檢測(cè)健康端點(diǎn)。
tagsNstring數(shù)組在注冊(cè)服務(wù)服務(wù)時(shí)包含的額外標(biāo)簽- "dapr"
metaNstring字典在注冊(cè)服務(wù)服務(wù)時(shí)包含的額外的元數(shù)據(jù)DAPR_METRICS_PORT: "${DAPR_METRICS_PORT}"
daprPortMetaKeyNstring用于在服務(wù)解析過程中從Consul服務(wù)元數(shù)據(jù)中獲取Dapr實(shí)例端口的 key,它也將用于在注冊(cè)時(shí)在元數(shù)據(jù)中設(shè)置Dapr實(shí)例端口。 默認(rèn)為 DAPR_PORT"DAPR_TO_DAPR_PORT"
selfRegisterNboolean控制Dapr實(shí)例是否會(huì)向Consul注冊(cè)服務(wù),默認(rèn)為 falsetrue
advancedRegistrationNAgentServiceRegistration通過配置完全控制服務(wù)注冊(cè)結(jié)果。 如果配置此項(xiàng),Checks、 Tags、 Meta 和 SelfRegister的任何配置將被忽略。

Config

QueryOptions

AgentServiceCheck數(shù)組

AgentServiceRegistration

配置示例:

apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
  name: appconfig
spec:
  nameResolution:
    component: "consul"
    configuration:
      client:
        address: "127.0.0.1:8500"
      selfRegister: true
      checks:
        - name: "Dapr Health Status"
          checkID: "daprHealth:${APP_ID}"
          interval: "15s",
          http: "http://${HOST_ADDRESS}:${DAPR_HTTP_PORT}/v1.0/healthz"
        - name: "Service Health Status"
          checkID: "serviceHealth:${APP_ID}"
          interval: "15s",
          http: "http://${HOST_ADDRESS}:${APP_PORT}/health"
      tags:
        - "dapr"
        - "v1"
        - "${OTHER_ENV_VARIABLE}"
      meta:
        DAPR_METRICS_PORT: "${DAPR_METRICS_PORT}"
        DAPR_PROFILE_PORT: "${DAPR_PROFILE_PORT}"
      daprPortMetaKey: "DAPR_PORT"        
      queryOptions:
        useCache: true
        filter: "Checks.ServiceTags contains dapr"

以上就是Dapr在Java中的服務(wù)調(diào)用實(shí)戰(zhàn)過程詳解的詳細(xì)內(nèi)容,更多關(guān)于Dapr Java服務(wù)調(diào)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MyBatis Mapper代理使用方法詳解

    MyBatis Mapper代理使用方法詳解

    本文是小編日常收集整理的關(guān)于mybatis mapper代理使用方法知識(shí),通過本文還給大家提供有關(guān)開發(fā)規(guī)范方面的知識(shí)點(diǎn),本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看下吧
    2016-08-08
  • 使用java代碼實(shí)現(xiàn)保留小數(shù)點(diǎn)的位數(shù)

    使用java代碼實(shí)現(xiàn)保留小數(shù)點(diǎn)的位數(shù)

    因?yàn)閭€(gè)人應(yīng)用的需要,所以就寫個(gè)簡(jiǎn)單點(diǎn)的了。希望大家都給給建議,共同學(xué)習(xí)。需要的朋友也可以參考下
    2013-07-07
  • java Hibernate延遲加載

    java Hibernate延遲加載

    對(duì)one-to-one 關(guān)系進(jìn)行延遲加載和其他關(guān)系相比稍微有些不同。many-to-one 的延遲加載是在配置文件的class 標(biāo)簽
    2008-10-10
  • Java中守護(hù)線程介紹及使用

    Java中守護(hù)線程介紹及使用

    大家好,本篇文章主要講的是Java中守護(hù)線程介紹及使用,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Java對(duì)象流實(shí)例代碼

    Java對(duì)象流實(shí)例代碼

    這篇文章主要介紹了Java對(duì)象流實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 詳解idea中web.xml默認(rèn)版本問題解決

    詳解idea中web.xml默認(rèn)版本問題解決

    這篇文章主要介紹了詳解idea中web.xml默認(rèn)版本問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Java連接合并2個(gè)數(shù)組(Array)的5種方法例子

    Java連接合并2個(gè)數(shù)組(Array)的5種方法例子

    最近在寫代碼時(shí)遇到了需要合并兩個(gè)數(shù)組的需求,突然發(fā)現(xiàn)以前沒用過,于是研究了一下合并數(shù)組的方式,這篇文章主要給大家介紹了關(guān)于Java連接合并2個(gè)數(shù)組(Array)的5種方法,需要的朋友可以參考下
    2023-12-12
  • java基礎(chǔ)篇之Date類型最常用的時(shí)間計(jì)算(相當(dāng)全面)

    java基礎(chǔ)篇之Date類型最常用的時(shí)間計(jì)算(相當(dāng)全面)

    這篇文章主要給大家介紹了關(guān)于java基礎(chǔ)篇之Date類型最常用的時(shí)間計(jì)算的相關(guān)資料,Java中的Date類是用來表示日期和時(shí)間的類,它提供了一些常用的方法來處理日期和時(shí)間的操作,需要的朋友可以參考下
    2023-12-12
  • MyBatis ORM映射方式示例詳解

    MyBatis ORM映射方式示例詳解

    MyBatis作為一種靈活且強(qiáng)大的ORM框架,提供了多種映射方式,包括基于XML的映射、基于注解的映射以及混合映射,這篇文章主要介紹了MyBatis ORM映射方式詳解,需要的朋友可以參考下
    2024-12-12
  • Java?分位點(diǎn)(分位值)計(jì)算方式

    Java?分位點(diǎn)(分位值)計(jì)算方式

    這篇文章主要介紹了Java?分位點(diǎn)(分位值)計(jì)算方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論