项目实战- rabbitmq 可靠性投递

rabbitmq 可靠性投递(二)之封装全局唯一 ID

2019-01-17  本文已影响151人  HmilyMing
在上上一篇文章中介绍的生成全局 ID 服务,链接:https://juejin.im/post/5c3dff5ee51d4550f31709eb
然后在上篇文章也介绍了我们的可靠性投递方案和项目搭建:https://juejin.im/post/5c3f43dae51d45731470a18c
接着在我们项目中,还需要封装处理一下,当出现 RPC 远程调用失败时,能有一个本地的生成策略做兜底方案。

我们首先在 rabbitmq-common 项目里 定义好本地的 ISnowFlakeService

第一步是定义好本地的 ISnowFlakeService

public interface ISnowFlakeService {

    long getSnowFlakeID();

    long[] getSnowFlakeIDs(int size);
}

接着就是其实现类 SnowFlakeServiceImpl

注意,这里 Service 就是我们 spring 里面的注解了,不再使用 dubbo 的 service 注解
@Service
public class SnowFlakeServiceImpl implements ISnowFlakeService {
    
    private final static Logger log = LoggerFactory.getLogger(SnowFlakeServiceImpl.class);
    
    @Reference(version = "${snowFlakeServiceApi.version}",
            application = "${dubbo.application.id}",
            interfaceName = "com.hmily.dubbo.common.service.ISnowFlakeServiceApi",
            check = false,
            timeout = 1000,
            retries = 0
    )
    private ISnowFlakeServiceApi snowFlakeServiceApi;

    @Override
    public long getSnowFlakeID() {
        try {
            return snowFlakeServiceApi.getSnowFlakeID();
        } catch (Exception e) {
            log.error(" RPC snowFlakeServiceApi getSnowFlakeID: ", e);
            return SnowFlake.getId();
        }
    }

    @Override
    public long[] getSnowFlakeIDs(int size) {
        if (size < 1) {
            throw new ParameterException(500, " size is illegal");
        }
        try {
            return snowFlakeServiceApi.getSnowFlakeIDs(size);
        } catch (Exception e) {
            log.error(" RPC snowFlakeServiceApi getSnowFlakeIDs: ", e);
            
            long[] ids = new long[size];
            for (int i = 0; i < size; i++) {
                long id = SnowFlake.getId();
                ids[i] = id;
                log.info("id: {}", id);
            }
            return ids;
        }
    }
}
我这里只是简单的写了一个本地生成唯一 id 的策略作为兜底,但是思路就是如此,你可以写得更完善。

这样子封装好,在我们项目里面就能很方便的控制和使用了。
我们接着写个接口测试一下,调用下面的接口,看看是否成功获取 id。

@RestController
public class TestController {
    
    private static final Logger log = LoggerFactory.getLogger(TestController.class);
    @Autowired
    private ISnowFlakeService snowFlakeService;

    @GetMapping("/test/longid/rpc")
    public String testIdByRPC() {
        Long id = snowFlakeService.getSnowFlakeID();
        log.info("id: {}", id);
        return id.toString();

    }
 }

如此,本章在调用方 封装使用全局唯一 ID 就演示完了。

完整代码:
https://github.com/hmilyos/common.git 
https://github.com/hmilyos/snowFlakeDemo.git
https://github.com/hmilyos/rabbitmq-common.git       available 分支
上一篇 下一篇

猜你喜欢

热点阅读