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

550 阅读1分钟
在上上一篇文章中介绍的生成全局 ID 服务,链接:https://juejin.cn/post/6844903761836523534
然后在上篇文章也介绍了我们的可靠性投递方案和项目搭建:https://juejin.cn/post/6844903762461458446
接着在我们项目中,还需要封装处理一下,当出现 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 分支