在上上一篇文章中介绍的生成全局 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 分支