跳至主要內容

RPC 通用组件使用手册

大约 5 分钟

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("成功");
    }