最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?Chassis3的多種序列化方式支持技術(shù)解密

 更新時(shí)間:2024年01月17日 09:06:34   作者:liubao68  
這篇文章主要為大家介紹了Java?Chassis?3多種序列化方式支持技術(shù)解密,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

打開(kāi)一個(gè)簡(jiǎn)單的 REST 接口

@RestSchema(schemaId = "ProviderController")
@RequestMapping(path = "/")
public class ProviderController {
  @PostMapping("/benchmark")
  public DataModel sayHello(@RequestHeader("wait") int wait, @RequestBody DataModel dataModel) {
    if (wait > 0) {
      Thread.sleep(wait);
    }
    return dataModel;
  }
}

契約

openapi: 3.0.1
info:
  title: swagger definition for org.apache.servicecomb.samples.ProviderController
  version: 1.0.0
servers:
- url: /
paths:
  /benchmark:
    post:
      operationId: sayHello
      parameters:
      - name: wait
        in: header
        required: true
        schema:
          type: integer
          format: int32
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DataModel'
          application/protobuf:
            schema:
              $ref: '#/components/schemas/DataModel'
          text/plain:
            schema:
              $ref: '#/components/schemas/DataModel'
        required: true
        x-name: dataModel
      responses:
        "200":
          description: response of 200
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DataModel'
            application/protobuf:
              schema:
                $ref: '#/components/schemas/DataModel'
            text/plain:
              schema:
                $ref: '#/components/schemas/DataModel'
components:
  schemas:
    ChildDataModel:
      type: object
      properties:
        numInt:
          type: integer
          format: int32
        numLong:
          type: integer
          format: int64
        numDouble:
          type: number
          format: double
        numFloat:
          type: number
          format: float
        data:
          type: string
      x-java-class: org.apache.servicecomb.samples.ChildDataModel
    DataModel:
      type: object
      properties:
        data:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/ChildDataModel'
      x-java-class: org.apache.servicecomb.samples.DataModel

可以看到 Java Chassis使用了Open API 3.0.1的協(xié)議規(guī)范,Request Body 和 responses 增加了 application/protobuf 、 text/plain 的支持。 這種使用形式,奠定了Java Chassis 3多序列化支持方式的基礎(chǔ),細(xì)心的讀者應(yīng)該很快能夠發(fā)現(xiàn)這種方式與其他支持多序列化框架之間的差異。

Spring Boot

支持多序列化方式,需要實(shí)現(xiàn) HttpMessageConverter 接口,并在 Controller 聲明支持的 Content-Type。 如果使用 Spring Fox 或者 Spring Doc 等 Open API工具生成契約,契約內(nèi)容只會(huì)包含 Controller 聲明的序列化類型。 Spring Boot存在隱式的契約情況,這意味著契約并不能完全代表 Controller 服務(wù)的能力。 如果需要對(duì)接口增加或者減少序列化支持,都需要修改代碼。

Dubbo

Dubbo 需要在 Provider 使用 dubbo:protocol 聲明序列化方式, 在Consumer使用 dubbo:reference 聲明序列化方式。 由于 Dubbo 是基于IDL的契約系統(tǒng), 在使用 RPC 的場(chǎng)景下,可以通過(guò)配置動(dòng)態(tài)調(diào)整序列化方式。 REST 支持在 Dubbo 是完全獨(dú)立的單元, 序列化方式也獨(dú)立于 RPC 接口, RPC 和 REST 不能互操作。

Open API基于 REST 的語(yǔ)義,來(lái)支持 IDL 的語(yǔ)義。 Java Chassis能夠更加直觀的支持通過(guò)第三方工具以HTTP協(xié)議族訪問(wèn)微服務(wù), 只需要按照契約的描述構(gòu)造HTTP的報(bào)文。 在編碼側(cè), Java Chassis的客戶端可以使用 REST 語(yǔ)義的接口,如 RestOperations,也可以使用 RPC 語(yǔ)義的接口訪問(wèn)服務(wù)端。

定義服務(wù)端接口

public interface ProviderService {
  DataModel sayHello(int wait, DataModel dataModel);
}

通過(guò)RPC訪問(wèn)

@RestSchema(schemaId = "ConsumerController")
@RequestMapping(path = "/")
public class ConsumerController {
  @RpcReference(schemaId = "ProviderController", microserviceName = "provider")
  private ProviderService providerService;

  @PostMapping("/benchmark")
  public DataModel sayHello(@RequestHeader("wait") int wait, @RequestBody DataModel dataModel) {
    return providerService.sayHello(wait, dataModel);
  }
}

Java Chassis以O(shè)penAPI為基礎(chǔ)的Edge Service部件,能夠?qū)崿F(xiàn)請(qǐng)求在通信協(xié)議、序列化方式上的自動(dòng)轉(zhuǎn)換。比如將HTTP協(xié)議轉(zhuǎn)Highway協(xié)議、application/json轉(zhuǎn)application/protobuf等。

基于 Java Chassis Benchmark ,做一個(gè)簡(jiǎn)單性能測(cè)試。該測(cè)試對(duì)比了兩種場(chǎng)景:

場(chǎng)景一的默認(rèn)配置:

servicecomb:
  rest:
    parameter:
      default-request-encoding: "application/json"
      default-response-encoding: "application/json"

場(chǎng)景二的默認(rèn)配置:

servicecomb:
  rest:
    parameter:
      default-request-encoding: "application/protobuf"
      default-response-encoding: "application/protobuf"

測(cè)試結(jié)果參考下表。該數(shù)據(jù)主要用于說(shuō)明序列化差異,因此省去了測(cè)試環(huán)境的描述。下表的平均時(shí)延統(tǒng)計(jì)了測(cè)試客戶端計(jì)算的請(qǐng)求-響應(yīng)時(shí)間的平均值。

版本數(shù)據(jù)單位等待時(shí)間線程數(shù)執(zhí)行次數(shù)執(zhí)行時(shí)間平均時(shí)延
protobuffer1010100066426
protobuffer100010100094189
protobuffer100001010002520524
protobuffer1101010001543215
protobuffer100101010001596515
protobuffer1000101010002592625
protobuffer1100101000105727105
protobuffer100100101000106376106
protobuffer1000100101000114452114
jason1010100067366
jason10001010001506314
jason100001010006975768
jason1101010001663216
jason100101010002003319
jason1000101010006610465
jason1100101000104868104
jason100100101000107439107
jason1000100101000132786131

從這組數(shù)據(jù)可以看出:

  • 在數(shù)據(jù)量比較小的場(chǎng)景下,使用 json 和 proto-buffer 性能差異很小。 在數(shù)據(jù)量比較大的情況下,proto-buffer 的性能明顯好于 json。
  • 在業(yè)務(wù)時(shí)延比較大(>100ms)的時(shí)候, 序列化的時(shí)延可以忽略。

不同的序列化方式除了性能差異,在可維護(hù)方面也會(huì)存在很大的差異。比如 proto-buffer 在兼容性方面的表現(xiàn)會(huì)比 json 差,當(dāng)修改接口定義的時(shí)候, 比如增加屬性、刪除屬性、修改屬性等,proto-buffer 更容易導(dǎo)致兼容性問(wèn)題,做好兼容性防范對(duì)多數(shù)用戶而言,都是比較困難的事情。

支持多協(xié)議、多序列化方式的另外一個(gè)考慮,是對(duì)接遺留系統(tǒng)。對(duì)接遺留系統(tǒng)會(huì)背負(fù)大量歷史債務(wù),使得新系統(tǒng)本身設(shè)計(jì)偏離預(yù)期的方向。在 Java Chassis 多序列化方式的選擇上, 只提供了目前廣泛使用的 json 和 proto-buffer 支持, 而沒(méi)有選擇支持其他序列化方案。 以架構(gòu)的韌性去處理遺留系統(tǒng)問(wèn)題,是 Java Chassis堅(jiān)持的一個(gè)重要設(shè)計(jì)理念,對(duì)接遺留系統(tǒng)或者保持與遺留系統(tǒng)的兼容,不是它的主要設(shè)計(jì)目標(biāo)。

在序列化方式選擇上,簡(jiǎn)單的總結(jié)如下:

  • 使用 REST 協(xié)議是絕大多數(shù)場(chǎng)景的最優(yōu)選擇,能夠最好的兼顧性能、可靠性、韌性等方面的要求。
  • 對(duì)于數(shù)據(jù)量比較大,業(yè)務(wù)時(shí)延很低(<100ms),并且業(yè)務(wù)比較穩(wěn)定,業(yè)務(wù)接口不需要頻繁變動(dòng)的場(chǎng)景,可以采用 proto-buffer來(lái)優(yōu)化性能,按需調(diào)整。

客戶故事:某個(gè)客戶的關(guān)鍵核心系統(tǒng)對(duì)于時(shí)延要求很高,因此需要采用私有協(xié)議和序列化方式來(lái)提升性能。但是對(duì)于一些非核心系統(tǒng),需要使用REST接口,方便日常開(kāi)發(fā)、調(diào)試。Java Chassis的解耦設(shè)計(jì)使得客戶無(wú)需對(duì)代碼進(jìn)行任何改造,就可以滿足兩方面的要求。

以上就是Java Chassis 3多種序列化方式支持技術(shù)解密的詳細(xì)內(nèi)容,更多關(guān)于Java Chassis3序列化方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring Security角色繼承實(shí)現(xiàn)過(guò)程解析

    Spring Security角色繼承實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Spring Security角色繼承實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Maven 項(xiàng)目生成jar運(yùn)行時(shí)提示“沒(méi)有主清單屬性”

    Maven 項(xiàng)目生成jar運(yùn)行時(shí)提示“沒(méi)有主清單屬性”

    這篇文章主要介紹了Maven 項(xiàng)目生成jar運(yùn)行時(shí)提示“沒(méi)有主清單屬性”,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Spring?Security?登錄時(shí)添加圖形驗(yàn)證碼實(shí)現(xiàn)實(shí)例

    Spring?Security?登錄時(shí)添加圖形驗(yàn)證碼實(shí)現(xiàn)實(shí)例

    這篇文章主要為大家介紹了Spring?Security?登錄時(shí)添加圖形驗(yàn)證碼實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • IDEA導(dǎo)出暫存區(qū)(Shelf)的代碼的完整過(guò)程

    IDEA導(dǎo)出暫存區(qū)(Shelf)的代碼的完整過(guò)程

    IDEA 有一個(gè)很好用的功能,Shelve Changes...,可以將代碼暫時(shí)存起來(lái),方便切換分支,或暫存代碼,先處理其他事情,本文就給大家介紹如何將暫存區(qū)的代碼,導(dǎo)出來(lái),導(dǎo)入到另一個(gè)項(xiàng)目或者另一臺(tái)電腦上,需要的朋友可以參考下
    2025-10-10
  • Java中forEach使用lambda表達(dá)式,數(shù)組和集合的區(qū)別說(shuō)明

    Java中forEach使用lambda表達(dá)式,數(shù)組和集合的區(qū)別說(shuō)明

    這篇文章主要介紹了Java中forEach使用lambda表達(dá)式,數(shù)組和集合的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java static 與 final關(guān)鍵字實(shí)例詳解

    Java static 與 final關(guān)鍵字實(shí)例詳解

    本文詳細(xì)介紹了Java中的static和final關(guān)鍵字,包括它們的本質(zhì)、內(nèi)存分配、線程安全問(wèn)題以及在類加載過(guò)程中的內(nèi)存變化,通過(guò)舉例和解釋,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Spring Boot 2和Redis例子實(shí)現(xiàn)過(guò)程解析

    Spring Boot 2和Redis例子實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Spring Boot2發(fā)布與調(diào)用REST服務(wù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Springboot允許logger.debug輸出日志方式

    Springboot允許logger.debug輸出日志方式

    這篇文章主要介紹了Springboot允許logger.debug輸出日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring Boot2.0整合ES5實(shí)現(xiàn)文章內(nèi)容搜索實(shí)戰(zhàn)

    Spring Boot2.0整合ES5實(shí)現(xiàn)文章內(nèi)容搜索實(shí)戰(zhàn)

    這篇文章主要介紹了Spring Boot2.0整合ES5實(shí)現(xiàn)文章內(nèi)容搜索實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Jenkins的安裝與簡(jiǎn)單配置過(guò)程

    Jenkins的安裝與簡(jiǎn)單配置過(guò)程

    本文簡(jiǎn)述Jenkins在CentOS7.3上安裝流程,包括Java環(huán)境配置、RPM包安裝、修改JENKINS_HOME路徑及權(quán)限、啟動(dòng)服務(wù)、插件安裝與系統(tǒng)管理設(shè)置,重點(diǎn)說(shuō)明郵件通知、SCM工具和Docker插件的配置方法,并附參考鏈接
    2025-08-08

最新評(píng)論

马尔康县| 巩义市| 衡水市| 宁波市| 木里| 赤壁市| 呼图壁县| 会泽县| 松阳县| 哈巴河县| 休宁县| 东莞市| 安国市| 株洲县| 马山县| 山丹县| 大安市| 南阳市| 融水| 长阳| 怀柔区| 明光市| 永泰县| 郸城县| 当阳市| 内乡县| 怀宁县| 会昌县| 镇江市| 汪清县| 同心县| 桂平市| 凤阳县| 长宁区| 诸城市| 望城县| 徐闻县| 平南县| 湘潭市| 屯留县| 凤庆县|