
最近使用公司微服務框架開發后臺,要調用由??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問題解答??
如果我的文章對大家產生了幫忙,可以在文章底部點個贊或者收藏;
如果有好的討論,可以留言;如果想繼續查看我以后的文章,可以左上角點擊關注可以掃描以下二維碼,關注我的公眾號:楓夜之求索閣,查看我最新的分享!