マイクロサービスgrpcからクライアント、サービス側

32143 ワード

protoファイルは次のとおりです.
message ProdHoldingInfoRequest {
    oneof check_paging {
        int32 paging = 1001; //    
    }
    oneof check_pageno {
        int32 pageno = 1002; //  
    }
    oneof check_pagelength {
        int32 pagelength = 1003; //  
    }
    oneof check_total {
        int32 total = 1004; //   
    }
    string sort = 1005; //    
    oneof check_czr {
        int32 czr = 1; //   
    }
    oneof check_cpid {
        int32 cpid = 2; //ID
    }
}
message ProdHoldingInfoResponse {
    int32 code = 1; //   
    string note = 2; //    
    int32 hasrecordset = 1006; //       
    int32 total = 1007; //    
    repeated ProdHoldingInfoRecord records = 3; //     
}
message ProdHoldingInfoRecord {   //          
    string cpdm = 1;    
    string khmc = 2;    
    string khh = 3;     
    string khid = 4;    
    string cpfe = 5;    
    string djfe = 6;    
    string zxsz = 7;   
    string zxjz = 8;    
}

service ProdViewService {
rpc ProdHoldingInfo (ProdHoldingInfoRequest) returns (ProdHoldingInfoResponse) {};
}

protoまとめ:
1.protoはProdViewServiceGrpcファイルを生成し、生成するコード2を含む.oneof check_xxx{...}の役割は、oneof checkのように、サービスにパラメータを入力して空にすることはできません.cpid{int 32 cpid=2;//サービス側から伝わるcpidは空ではなく値がない}3.Message ProdHoldingInfoResponseのrepeated ProdHoldingInfoRecord records=3は、返される結果セットであり、1つの配列として理解され、message ProdHoldingInfoRecordで定義されている具体的な返される結果セットのパラメータが表示されます.Responseでは配列を返す必要がある場合があります.repeated string name=4と書くと、nameというstringタイプの配列が返されます.
クライアントは次のとおりです.
 public ProdHoldingInfoResponse prodHoldingInfo(ProdHoldingInfoModel prodHoldingInfoModel, int czr) { //ProdHoldingInfoModel          
        ProdHoldingInfoRequest.Builder prodHoldingInfoBuild = ProdHoldingInfoRequest.newBuilder();     //  Builder
        if (null != prodHoldingInfoModel.getPaging()) {                                           //  paging   
            prodHoldingInfoBuild.setPaging(prodHoldingInfoModel.getPaging());   // Builder   paging
        }
        if (null != prodHoldingInfoModel.getPageNo()) {
            prodHoldingInfoBuild.setPageno(prodHoldingInfoModel.getPageNo());
        }
        if (null != prodHoldingInfoModel.getPageLength()) {
            prodHoldingInfoBuild.setPagelength(prodHoldingInfoModel.getPageLength());
        }
        if (null != prodHoldingInfoModel.getTotalRows()) {
            prodHoldingInfoBuild.setTotal(prodHoldingInfoModel.getTotalRows());
        }
        if (null != prodHoldingInfoModel.getSort()) {
            prodHoldingInfoBuild.setSort(prodHoldingInfoModel.getSort());
        }
        prodHoldingInfoBuild.setCzr(czr);
        if (null != prodHoldingInfoModel.getCpid()) {
            prodHoldingInfoBuild.setCpid(prodHoldingInfoModel.getCpid());
        }
        ProdHoldingInfoRequest req = prodHoldingInfoBuild.build();  //  Request, Builder  Request 
        ProdHoldingInfoResponse resp = stub.prodHoldingInfo(req);//  Response,       ,Request    。                  ,       ,   Builder     :ProdHoldingInfoResponse resp = stub.prodHoldingInfo(prodHoldingInfoBuild.build());
        return resp; 
    }

クライアントの概要
一般的にインタフェースはフロントエンドから伝達されたパラメータを受け取ってmodleに入れ、インタフェースはクライアント関数を呼び出してmodleを伝達し、クライアント関数はmodleのパラメータを受け入れて初歩的な処理判断処理を行い、BuilderにprotoのRequestのいくつかのパラメータを設定し、BuilderはRequestに加え、RequestはResponseに加えてサービス側関数を呼び出す.
サービス側は次のとおりです.
public void prodHoldingInfo(ProdHoldingInfoRequest request, StreamObserver<ProdHoldingInfoResponse> responseObserver) {  //            
        Map<String, Object> ins = new HashMap<>(2);
        if (ProdHoldingInfoRequest.CheckPagingCase.PAGING == request.getCheckPagingCase()) {       //      paging    
            ins.put("I_PAGING", request.getPaging());                                                                                  //   put ins 
        }
        if (ProdHoldingInfoRequest.CheckPagenoCase.PAGENO == request.getCheckPagenoCase()) {
            ins.put("I_PAGENO", request.getPageno());
        }
        if (ProdHoldingInfoRequest.CheckPagelengthCase.PAGELENGTH == request.getCheckPagelengthCase()) {
            ins.put("I_PAGELENGTH", request.getPagelength());
        }
        if (ProdHoldingInfoRequest.CheckTotalCase.TOTAL == request.getCheckTotalCase()) {
            ins.put("I_TOTALROWS", request.getTotal());
        }
        ins.put("I_SORT", request.getSort());
        if (ProdHoldingInfoRequest.CheckCzrCase.CZR == request.getCheckCzrCase()) {
            ins.put("I_CZR", request.getCzr());
        }
        if (ProdHoldingInfoRequest.CheckCpidCase.CPID == request.getCheckCpidCase()) {
            ins.put("I_CPID", request.getCpid());
        }
        List<QueryProdHoldingInfoModel> resultList = prodViewDao.queryProdHoldingInfoBase(ins);      //         ins  Dao  queryProdHoldingInfoBase,        resultList

        ProdHoldingInfoResponse.Builder response = ProdHoldingInfoResponse.newBuilder();//      Builder
        try {
            response.setCode((Integer) ins.get("O_CODE"));                                                         //         
            response.setNote((String) ins.get("O_NOTE"));
            response.setHasrecordset((Integer) ins.get("O_HASRECORDSET"));
            response.setTotal((Integer) ins.get("I_TOTALROWS"));

            for (QueryProdHoldingInfoModel queryProdHoldingInfo : resultList) {               //  resultList     
                ProdHoldingInfoRecord record = ProdHoldingInfoRecord.newBuilder()        //            
                        .setCpdm(getString(queryProdHoldingInfo.getCpdm()))
                        .setKhmc(getString(queryProdHoldingInfo.getKhmc()))
                        .setKhh(getString(queryProdHoldingInfo.getKhh()))
                        .setKhid(getString(queryProdHoldingInfo.getKhid()))
                        .setCpfe(getString(queryProdHoldingInfo.getCpfe()))
                        .setDjfe(getString(queryProdHoldingInfo.getDjfe()))
                        .setZxsz(getString(queryProdHoldingInfo.getZxsz()))
                        .setZxjz(getString(queryProdHoldingInfo.getZxjz()))
                        .build();
                response.addRecords(record);                      //      Builder 
            }
        } catch (Exception e) {

            log.error(e.getMessage());
            responseObserver.onError(new StatusException(Status.INTERNAL));
            return;
        }
        ProdHoldingInfoResponse resp = response.build();   // Builder   Response 
        responseObserver.onNext(resp);                              //  Response
        responseObserver.onCompleted();
    }  

サービス側まとめ
クライアントRequestはパラメータをサービス側の関数処理に伝達し、関数はDao層インタフェースを呼び出してデータベースにデータを取りに行き、取ったデータはRecordに入れ、RecordはBuilderに入れ、BuilderはResponseに入れ、最後にクライアントに戻る