RPC 通用组件使用手册
RPC 通用组件使用手册
一、组件介绍
本组件的目标是将dubbo融入到spring cloud生态,使微服务之间的调用同时具备dubbo和restful的调用能力。做到对业务代码无侵入,无感知。
可通过参数配置自由切换dubbo方式通信或者restful方式通信。
服务端在项目启动时,扫描@FeignClient注解的类,通过对这些类进行增强,使其具有dubbo服务的能力,并将服务注册至nacos,向外提供dubbo服务。
消费端同样通过扩展feign,来提供dubbo的调用方式。
二、组件使用
1. 服务API定义
- 1.1 定义一套服务接口API(建议像dubbo方式一样,单独建一个子工程,方便调用方引用)。
- 1.2 API工程中引入openfeign包依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
- 1.3 定义接口,示例如下:
@FeignClient("security-center")
public interface SiRpcTestService {
@RequestMapping("/getUserKey")
Result<SysUserKeyRo> getUserKey(@RequestParam("userId") String userId);
}
- 1.4 API工程打包,方便提供给调用方
2. 服务实现
- 2.1 创建微服务工程,并引入依赖包(如果是老工程改造,请把dubbo、feign、nacos相关的jar包依赖去掉,否则可能引起jar包冲突)。
<dependency>
<groupId>com.pcitc.si</groupId>
<artifactId>common-rpc-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 2.2 实现API定义的相关接口
注意:实现类上需要加上@RestController注解
@RestController
public class SiRpcTestServiceImpl implements SiRpcTestService {
@Override
public Result<SysUserKeyRo> getUserKey(String userId) {
log.info("查询用户Key信息,用户编号:{}",userId);
SysUserKeyRo sysUserKeyRo= new SysUserKeyRo();
sysUserKeyRo.setUserCode("1111");
sysUserKeyRo.setKeyCertdn("xxxx");
return Result.success(sysUserKeyRo);
}
}
- 2.3 参数配置
rpc通信方式参数配置:
si:
rpc:
type: dubbo
basePackages: com.pcitc.si.security
注:si.rpc.type值为dubbo时,提供dubbo服务;值为feign时,提供restful服务。
si.rpc.type:为通信方式,值为dubbo时,则提供dubbo,值为feign时,则提供restful服务(必须) si.rpc.basePackages:为微服务接口所在包路径(必须)
nacos参数配置:
spring:
cloud:
nacos:
discovery:
server-addr: xxx.xxx.xxx.xxx:8848
namespace: dev
group: xxx
dubbo参数配置:
注:如果si.rpc.type值为feign时,可不配置
dubbo:
scan:
base-packages: xxx.xxx.xxx
protocols:
dubbo:
name: dubbo
port: -1
registry:
address: nacos://${spring.cloud.nacos.discovery.server-addr}
parameters:
namespace: ${spring.cloud.nacos.discovery.namespace}
group: ${spring.cloud.nacos.discovery.group}
consumer:
timeout: 5000
check: false
retries: 0
3. 消费端使用
- 创建消费端工程,引用common-rpc-starter依赖包(如果是老工程改造,请把dubbo、feign、nacos相关的jar包依赖去掉,否则可能引起jar包冲突)
<dependency>
<groupId>com.pcitc.si</groupId>
<artifactId>common-rpc-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 引用API接口定义jar包,示例:
<dependency>
<groupId>xxx.xxx.xxx</groupId>
<artifactId>xxx-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
- 参数配置
si:
rpc:
type: dubbo
basePackages: xxx.xxx.xxx
si.rpc.type:为通信方式,值为dubbo时,则为dubbo调用,值为feign时,则为feignClient调用(必须) si.rpc.basePackages:为微服务接口所在包路径(必须)
nacos 和 dubbo的相关参数配置,请参考服务端
- 服务调用
通过spring的 @Resource 或者 @Autowired 注解,将接口对象引入,然后直接以API方式调用,示例如下:
//通过@Resource 或者 @Autowired 注解引入rpc接口
@Resource
private SiRpcTestService siRpcTestService;
@GetMapping("/rpc_test")
public Result<String> rpcTest(){
//通过rpc接口直接调用rpc服务
Result<SysUserKeyRo> result = siRpcTestService.getUserKey("sss");
log.info("result:{}",result);
return Result.success("成功");
}
三、自定义注解方式使用
前面组件是通过增强feign的功能,使得spring cloud微服务工程,具备了dubbo服务功能,所以在编码风格上偏向于feignclient方式, 同样此组件也支持自定义的注解,使微服务工程同时具备dubbo和restful服务的提供和调用能力,使编码风格更加统一和简洁。
3.1 服务API定义
- 1 定义一套服务接口API(建议像dubbo方式一样,单独建一个子工程,方便调用方引用)。
- 2 API工程中引入common-rpc-starter包依赖
<dependency>
<groupId>com.pcitc.si</groupId>
<artifactId>common-rpc-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 3 定义接口,示例如下:
@SiRpc("security-center")
public interface SiRpcTestService {
@RequestMapping("/getUserKey")
Result<SysUserKeyRo> getUserKey(@RequestParam("userId") String userId);
}
- 4 API工程打包,方便提供给调用方
3.2 服务实现
- 1 创建微服务工程,并引入API接口定义包(如果是老工程改造,请把dubbo、feign、nacos相关的jar包依赖去掉,否则可能引起jar包冲突)。
<dependency>
<groupId>com.pcitc.si</groupId>
<artifactId>security-center-api</artifactId>
</dependency>
- 2 实现API定义的相关接口
注意:实现类上需要加上@RestController注解
@RestController
public class SiRpcTestServiceImpl implements SiRpcTestService {
@Override
public Result<SysUserKeyRo> getUserKey(String userId) {
log.info("查询用户Key信息,用户编号:{}",userId);
SysUserKeyRo sysUserKeyRo= new SysUserKeyRo();
sysUserKeyRo.setUserCode("1111");
sysUserKeyRo.setKeyCertdn("xxxx");
return Result.success(sysUserKeyRo);
}
}
- 3 参数配置
rpc通信方式参数配置:
si:
rpc:
type: dubbo
basePackages: com.pcitc.si.security
注:si.rpc.type值为dubbo时,提供dubbo服务;值为feign时,提供restful服务。
si.rpc.type:为通信方式,值为dubbo时,则提供dubbo,值为feign时,则提供restful服务(必须) si.rpc.basePackages:为微服务接口所在包路径(必须)
nacos参数配置:
spring:
cloud:
nacos:
discovery:
server-addr: xxx.xxx.xxx.xxx:8848
namespace: dev
group: xxx
dubbo参数配置:
注:如果si.rpc.type值为feign时,可不配置
dubbo:
scan:
base-packages: xxx.xxx.xxx
protocols:
dubbo:
name: dubbo
port: -1
registry:
address: nacos://${spring.cloud.nacos.discovery.server-addr}
parameters:
namespace: ${spring.cloud.nacos.discovery.namespace}
group: ${spring.cloud.nacos.discovery.group}
consumer:
timeout: 5000
check: false
retries: 0
3.3 消费端使用
- 创建消费端工程,引用common-rpc-starter依赖包(如果是老工程改造,请把dubbo、feign、nacos相关的jar包依赖去掉,否则可能引起jar包冲突)
<dependency>
<groupId>com.pcitc.si</groupId>
<artifactId>common-rpc-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
- 引用API接口定义jar包,示例:
<dependency>
<groupId>xxx.xxx.xxx</groupId>
<artifactId>xxx-api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
- 参数配置
si:
rpc:
type: dubbo
basePackages: xxx.xxx.xxx
si.rpc.type:为通信方式,值为dubbo时,则为dubbo调用,值为feign时,则为feignClient调用(必须) si.rpc.basePackages:为微服务接口所在包路径(必须)
nacos 和 dubbo的相关参数配置,请参考服务端
- 启动配置
主程序上配置@EnableSiRpcClient注解
@SpringBootApplication
@EnableSiRpcClient(basePackages = "com.xxx.xxx.xxx")
public class AuthServerApp {
public static void main(String[] args) {
SpringApplication.run(AuthServerApp.class, args);
System.out.println("启动成功");
}
}
- 服务调用
通过spring的 @Resource 或者 @Autowired 注解,将接口对象引入,然后直接以API方式调用,示例如下:
//通过@Resource 或者 @Autowired 注解引入rpc接口
@Resource
private SiRpcTestService siRpcTestService;
@GetMapping("/rpc_test")
public Result<String> rpcTest(){
//通过rpc接口直接调用rpc服务
Result<SysUserKeyRo> result = siRpcTestService.getUserKey("sss");
log.info("result:{}",result);
return Result.success("成功");
}