2 つのマイクロサービスと 1 つのゲートウェイがあります。1 つのマイクロサービスは JHipster とスプリング ブート (Service1) で開発され、もう 1 つのマイクロサービスはスプリング統合フレームワーク (IntegrationService) を持っています。次に、IntegrationService から service1 API を呼び出す必要があります。両方のマイクロサービスで通信に HTTPS を使用しています。しかし、API を呼び出すと、次のエラー ログが表示されました。
2021-05-05 11:05:45.503 INFO 22105 --- [XNIO-1 task-4] cmasIntegrationService : IntegrationService org.springframework.messaging.MessageHandlingException の例外: URI [https://<server_ip> の HTTP 要求の実行に失敗しました/gateway/services/service1/api/viewrecords?id=100100100100157] [bean 'outboundGateway'; 定義: 'クラス パス リソース [com/esi/app/service/IntegrationService.class]'; ソースから: 'org.springframework.core.type.classreading.SimpleMethodMetadata@3fa2213']; ネストされた例外は org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://<server_ip>/gateway/services/service1/api/viewrecords" です:PKIX パスの構築に失敗しました: sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりません。ネストされた例外は javax.net.ssl.SSLHandshakeException: PKIX パスの構築に失敗しました: sun.security.provider.certpath.SunCertPathBuilderException: 要求されたターゲットへの有効な証明書パスが見つかりません, failedMessage=GenericMessage [payload={custId=100100100100157}, headers= {http_requestMethod=GET, errorChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@703c6baf, Connection=Keep-Alive, Host=<server_ip>: port , accept= /, authorization=Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImF1dGgiOiJST0xFX0FETUlOLFJPTEVfVVNFUiIsImV4cCI6MTYyMDI3ODk4NH0.-4ByR7OQY-G_dZh7XUHYOSo3FRS2Ug6JxVOkq6XOmhUV05LnQj10puEGotcJk1EUlYDvt4n2dAJFSuR3evnvHA, replyChannel=org.springframework.messaging.core.GenericMessagingTemplate$TemporaryReplyChannel@703c6baf, http_requestUrl=http://<server_ip>:/api/getrecordsfromservice1?transactionId=1111111111&id=100100100100157, id=1eec8d00-4040-c9b2-cdb1-4f2d8743d007, Content-Length=0, http_userPrincipal=org.springframework.security.authentication.UsernamePasswordAuthenticationToken@143b9e60: プリンシパル: org.springframework.security.core.userdetails.User@586034f: ユーザー名: 管理者; 守られたパスワード]; 有効: true; AccountNonExpired: 真; credentialsNonExpired: true; AccountNonLocked: 真; 付与された権限: ROLE_ADMIN、ROLE_USER; 資格情報: [保護]; 認証済み: true; 詳細: null; 付与された権限: ROLE_ADMIN、ROLE_USER、accept-encoding=gzip、deflate、br、user-agent=PostmanRuntime/7.28.0、timestamp=1620192945487}]
IntegrationService を呼び出すために使用した API エンドポイントは、
https://<server_ip>/gateway/services/integration/api/getrecordsfromservice1?transactionId=1111111111&id=100100100100157
integrationは、IntegrationService のゲートウェイに登録されているサービス名です。同様に、service1は Service1 用です。
私が理解できないことは次のとおりです。
- 「http_requestUrl」は、ヒットしているエンドポイントではなく、ログ内のものにどのように変更されましたか?
- 両方のマイクロサービスで HTTPS を使用しているにもかかわらず、「SunCertPathBuilderException」が発生したのはなぜですか?
- 「ホスト」メッセージ ヘッダーを取得するために、Spring フレームワークは、URL をチェックするのではなく、構成ファイル application.yml で IP とポートを探しますか?
誰でも助けてもらえますか?@アルテム
私の受信ゲートウェイと送信ゲートウェイを以下に示します。
@ServiceActivator(inputChannel = "channelOutbound")
@Bean
public HttpRequestExecutingMessageHandler outboundGateway() {
final HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler(
viewrecordsEndpoint + "{id}");
handler.setExpectedResponseType(String.class);
handler.setHttpMethod(HttpMethod.GET);
handler.setOutputChannelName("channelOutboundResponse");
final ExpressionParser parser = new SpelExpressionParser();
final Expression exp = parser.parseExpression("payload[id]");
final Map<String, Expression> uriExp = new HashMap<>();
uriExp.put(Constants.ID, exp);
handler.setUriVariableExpressions(uriExp);
return handler;
}
@Bean
public HttpRequestHandlingMessagingGateway inboundGateway() {
final HttpRequestHandlingMessagingGateway gateway = new HttpRequestHandlingMessagingGateway();
gateway.setRequestMapping(requestMapping());
gateway.setRequestChannelName("channelInbound");
gateway.setReplyChannelName("channelInboundReply");
gateway.setErrorChannelName("channelInboundError");
return gateway;
}
private RequestMapping getGoldLoansForUcicInboundRequestMapping() {
final RequestMapping mapping = new requestMapping();
mapping.setPathPatterns("/api/getrecordsfromservice1");
mapping.setMethods(HttpMethod.GET);
return mapping;
}