§ 本文目标

通过本章节,将掌握RPC接口的开发及使用

§ RPC简单介绍

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发分布式程序就像开发本地程序一样简单

§ 练习场景

本次练习需要创建三个模块:

  • 客户管理微服务模块(custmng):服务提供方提供客户额度管理查询功能
  • 信誉度管理微服务模块(creditmng):服务消费方,消费额度管理功能的查询功能
  • 客户管理Client模块(custmng-client):客户管理提供给其他微服务模块使用的接口模块

前提:

  • 本章节使用的微服务模块custmng(复用创建的微服务工程)
  • 为提供方微服务custmng的额度表准备测试数据,用于消费方查询使用
insert into limit_info (LIMIT_ID, LIMIT_CODE, LIMIT_AMT, LIMIT_DESC, LIMIT_USER_ID)
values ('00000', '101010', '2222222', 'airabl', 'air')
1
2

为custmng微服务的LimitInfoResource.java新增方法query

	@RestController
	@RequestMapping("/api/limitinfo")
	public class LimitInfoResource extends CommonResource<LimitInfo, String>{
	    @Autowired
	    private LimitInfoService limitInfoService;
	
		@Override
		protected CommonService getCommonService() {
			// TODO 自动生成的方法存根
			return limitInfoService;
		}
	 
	    @GetMapping(value="/query")
	    public LimitInfo query(@RequestParam(value="limitId") String limitId) {
	    	return limitInfoService.selectByPrimaryKey(limitId);
	    }
	}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

§ 操作步骤

为custmng微服务创建SDK模块

§ 服务提供方providerrpc微服务

§ custmng-client模块创建

通常,某个微服务需要提供接口给其他微服务模块时,需要开发并封装Client模块,其他微服务通过pom引入的方式,进行接口消费,且必须在统一注册中心集群环境下

基于已经创建微服务工程->右键“模块”->选择Client

rpc_3111

rpc_3112

创建后工程结构

§ 接口创建

在custmng-client工程下,应用开发->业务开发->业务逻辑->右键,新建类

DTO创建

package cn.com.yusys.yusp.service;
mport java.io.Serializable;
**
 * 额度实体表.
 * 
 * @since 2.1.1
 */
public class LimitInfoDTO  implements Serializable{
          private static final long serialVersionUID = 1L;
          /**
           * 额度ID
           */
          private String limitId;
          
          /**
           * 额度代码
 */
          private String limitCode;
          
/**
           * 额度金额
           */
          private String limitAmt;
          
          /**
           * 描述
           */
          private String limitDesc;
          
          /**
           * 客户ID
           */
          private String limitUserId;
          
          
          /**
           * @param limitId
           */
          public void setLimitId(String limitId) {
                    this.limitId = limitId == null ? null : limitId.trim();
          }
          
    /**
     * @return LimitId
     */   
          public String getLimitId() {
                    return this.limitId;
          }
          
          /**
           * @param limitCode
           */
          public void setLimitCode(String limitCode) {
                    this.limitCode = limitCode == null ? null : limitCode.trim();
          }
          
    /**
     * @return LimitCode
     */   
          public String getLimitCode() {
                    return this.limitCode;
}
          
          /**
           * @param limitAmt
           */
          public void setLimitAmt(String limitAmt) {
                    this.limitAmt = limitAmt == null ? null : limitAmt.trim();
          }
          
    /**
     * @return LimitAmt
     */   
          public String getLimitAmt() {
                    return this.limitAmt;
          }
          
          /**
           * @param limitDesc
           */
          public void setLimitDesc(String limitDesc) {
                    this.limitDesc = limitDesc == null ? null : limitDesc.trim();
          }
          
    /**
     * @return LimitDesc
     */   
          public String getLimitDesc() {
                    return this.limitDesc;
          }
          
          /**
           * @param limitUserId
           */
          public void setLimitUserId(String limitUserId) {
                    this.limitUserId = limitUserId == null ? null : limitUserId.trim();
          }
          
    /**
     * @return LimitUserId
     */   
          public String getLimitUserId() {
                    return this.limitUserId;
          }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

§ 创建RPC接口服务

/**
 * 额度管理API接口.
 * 
 * @since 2.1.1
 */
@Component
public class LimitInfoHandler {
          @Reference
		  private LimitInfoService limitInfoService; 
          /**
           * 额度信息查询接口.
           * 
           * @param limitId
           *            额度ID
           * @return
           */
          public LimitInfoDTO query(String limitId){
                    return limitInfoService.selectByPrimaryKey(limitId);
		  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

§ 接口发布

完成接口自测后,即可将client包按照版本规范,发布到maven仓库,同时通过wiki或文档等方式,提供API、参数的说明文档

在工程目录执行

mvn deploy -e -DskipTests

发布前提

  • 本机已安装apache maven
  • setting 配置maven私服账号信息

image-20220421091352718

  • 工程pom增加发布的具体仓库信息

image-20220421091509901

§ 消费者消费

§ 创建creditmng微服务模块

该微服务工程开发为消费端,调用custmng提供第SDK接口;创建流程和custmng创建流程一直,此处不再重复讲解

rpc_3211

除了调整数据库、Redis配置,此微服务使用6002端口

rpc_3212

§ 为/creditmng/pom.xml增加SDK包依赖

<dependency>
                               <groupId>cn.com.yusys.yusp</groupId>
                               <artifactId>custmng-client</artifactId>
                               <version>2.1.1-SNAPSHOT</version>
</dependency>                               
1
2
3
4
5

§ 增加接口消费

@RestController
@RequestMapping("/api/consumer")
public class ConsumberResource {
          @Autowired
          LimitInfoHandler  limitInfoHandler;
          
          @GetMapping(value="/query")
          public String query(@RequestParam(value="limitId") String limitId) {
                    LimitInfoDTO limitInfoDTO = limitInfoHandler.query(limitId);
                    return Optional.ofNullable(limitInfoDTO)
                                         .map(LimitInfoDTO::getLimitDesc)
                                         .orElseGet(()->"");
          }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

§ 测试

§ 调用custmng接口,查看服务提供方接口查询

http://172.16.20.208:6001/api/limitinfo/query?limitId=00000

rpc_3311

rpc_3312

§ 调用creditmng接口,查询消费方接口消费

http://localhost:6002/api/consumer/query?limitId=00000

rpc_3321

点击try it out,swagger测试结果:

rpc_3322

最后更新于: 4/28/2022, 5:10:13 PM