最資訊丨問題解決系列:io.grpc.netty.shaded.io.netty.handler.ssl.NotSslRecordException_ not an SSL_TLS record

2022-12-13 14:00:52 來源:51CTO博客

問題場景

最近使用公司微服務框架開發后臺,要調用由??python???寫的服務端接口。這里我們是使用了??grpc???來做不同語言之間的接口調用。已知??python??服務端是開啟著的,而在測試過程,發現后臺報錯,報錯提示如下:


(資料圖片僅供參考)

Caused by: io.grpc.StatusRuntimeException: UNAVAILABLE: io exceptionChannel Pipeline: [SslHandler#0, ProtocolNegotiators$ClientTlsHandler#0, WriteBufferingAndExceptionHandler#0, DefaultChannelPipeline$TailContext#0]  at io.grpc.stub.ClientCalls.toStatusRuntimeException(ClientCalls.java:244)  at io.grpc.stub.ClientCalls.getUnchecked(ClientCalls.java:225)  at io.grpc.stub.ClientCalls.blockingUnaryCall(ClientCalls.java:142)  at AlarmCategory.AlarmCategoryGrpc$AlarmCategoryBlockingStub.getAlarmCategory(AlarmCategoryGrpc.java:169)    ... 97 common frames omittedCaused by: io.grpc.netty.shaded.io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 000018040000000000000400400000000500400000000600002000fe0300000001000004080000000000003f00010000080600000000000000000000000000  at io.grpc.netty.shaded.io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1214)  at io.grpc.netty.shaded.io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1282)  at io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:498)  at io.grpc.netty.shaded.io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:437)    ... 1 common frames omitted

問題環境

軟件

版本

JDK

8

grpc

1.29.0

spring-boot

2.1.8.RELEASE

grpc-client-spring-boot-starter

2.7.0.RELEASE

問題原因

通過查看相關的文檔,才知道,同事的??python???服務端的??grpc???使用了??PLAINTEXT ???模式,而我的客戶端默認是使用了??TLS??模式。兩邊模式不同,導致我的請求過去,服務端解析不了,然后就會報這個問題。

解決方案

這里有兩種方案:

一、簡單快捷

因為我是使用了??grpc-client-spring-boot-starter???來簡化使用??grpc??,所以直接在配置文件加入以下的配置,如下:

grpc.client._server_name_.negotiationType=PLAINTEXT

這里的??_server_name??是由開發者自定義的。按照這種方法,重啟之后,果然可以正常通信了!

二、安全但有點繁瑣

在服務端使用??TLS???模式。假如服務端開發是使用了??grpc-client-spring-boot-starter???,則在生成對應的??crt???和??key??文件之后,可以加入以下配置(記得把路徑修改成自己的文件路徑),然后重啟即可。

grpc.server.security.enabled=truegrpc.server.security.certificateChain=file:certificates/server.crtgrpc.server.security.privateKey=file:certificates/server.key

結果

我這里使用了第一種方式,簡單快捷地解決了問題。因為服務端是由其他語言進行編寫,如果要溝通進行修改,耗費的時間和精力比較多。目前是屬于測試階段,可以先讓應用跑起來。等需要完善的時候,再進行完善。

總結

不同語言之間的通信,可以使用業界已經比較成熟的組件來進行開發,這樣減少重復造輪子的時間精力,也可以快速地迭代進行開發,縮短開發周期。

參考鏈接

??grpc-spring-boot-starter問題解答??

隨緣求贊

如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;

如果有好的討論,可以留言;如果想繼續查看我以后的文章,可以左上角點擊關注可以掃描以下二維碼,關注我的公眾號:楓夜之求索閣,查看我最新的分享!

標簽: 問題解決 開發周期 這個問題

上一篇:焦點速訊:【Dubbo3入門到精通】「序章介紹說明」Dubbo3新特性概覽的介紹說明
下一篇:今日播報!【Shell文本三劍客--awk】