美文网首页项目实战- rabbitmq 可靠性投递
rabbitmq 可靠性投递(二)之封装全局唯一 ID

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

作者: HmilyMing | 来源:发表于2019-01-17 13:01 被阅读151次
    在上上一篇文章中介绍的生成全局 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 分支
    

    相关文章

      网友评论

        本文标题:rabbitmq 可靠性投递(二)之封装全局唯一 ID

        本文链接:https://www.haomeiwen.com/subject/xvqidqtx.html