文档章节

【13】JMicro微服务-ID生成与Redis

o
 osc_gu9d45li
发布于 2019/04/11 16:29
字数 1419
阅读 9
收藏 0

精选30+云产品,助力企业轻松上云!>>>

如非授权,禁止用于商业用途,转载请注明出处
作者:mynewworldyyl

往下看前,建议完成前面1到12小节

 

1. 微服务中ID地位

如果说前面小节的功能点是微服务的大脑,那么全局唯一ID则是微服务的神经系统,没有ID这个神经系统,再强的大脑也白搭,只有有了这个神经系统,才能有效协调整个微服务系统的正常工作,才不会出现神经错乱。就好像两个或多个人的身份证号码相同,则依赖于这个身份证号唯一性的系统就无法正常工作(无法为具有相同身份证号的这些人服务)。

JMicro中,消息是微服务之间通讯最基本单元,系统将之命名为org.jmicro.api.net.Message,每个消息由唯一ID所标识,不管系统中有多少个服务,服务之间以多高的QPS做交互,也许上万亿的QPS,也不管系统运行多久,也许是1亿年,假设这1亿年中总共有万万亿个消息,那么这万万亿个消息的ID都不能重复,否则这个微服务系统都是不可靠的。例如,两个转账消息,一个转1分钱,一个传1亿,如果两个消息ID相同,那么有50%的可能本应收到1亿的账号却收到了1分钱,而那个本应收到1分钱账号却收到了1亿,如果是比特币转账,那后果就凉了。

 

2. JMicro中ID使用场景

最典型的是服务调用链路跟踪(【6】JMicro微服务-服务日志监控  ),从调用发起方开始,生成一个全局唯一链路ID,并且将这个链路ID从调用者传给被调用者,直到最终被调用者返回时,也将链路ID返回,直到返回给调用发起方。JMIcro通过将相同的链路ID消息归属为一个微服务调用过程,这个相同ID的链路上发生的所有事件及相关统计数据,都可以通过这个ID作为维度做跟踪分析。比如从调用发起方发送请求到收到响应,消耗很长时间,那么通过链路ID查看每个消息请求和响应时间,即可找到问题的结点,这里的“结点”即是JMicro服务。

还有就是JMicro的RPC调用过程中,为了提高性能,消息都是异步的,但是作为RPC客户端调用者,却是同步的方式使用,比如前面的ISimpleRpc调用hello服务方法,返回一个字符串,是同步返回的。这个底层异步消息提供上层同步使用,就是通过请求ID实现的。每个RPC请求,会生成一个全局唯一ID,并将这个ID传给服务方,服务方处理完成后,也返回给调用方,调用方底层通过这个ID识别这个结果应该返回给那个RPC方法(唤醒调用者线程)。

 

3. 应用全局唯一ID

应用如果需要使用到全局唯一ID,也可以和JMicro底层一样,使用相同接口,如下代码是JMicro获取当前链路ID代码。

 1 public static Long lid(){
 2         JMicroContext c = get();
 3         Long id = c.getLong(LINKER_ID, null);
 4         if(id != null) {
 5             return id;
 6         }
 7         
 8         ComponentIdServer idGenerator = JMicro.getObjectFactory().get(ComponentIdServer.class);
 9         
10         if(idGenerator != null) {
11             id = idGenerator.getLongId(Linker.class);
12             c.setLong(LINKER_ID, id);
13         }
14         return id;
15     }

2到6行检查当前上下文是否有链路ID,如果有则直接返回,否则第8行取得ComponentIdServer 实例,并通过ComponentIdServer实例的相关方法获取Linker.class的

ID,下图为ComponentIdServer实例获取ID相关方法:

3种类型6个方法,分别为int类型ID,获取1个id和多个ID两个方法,同理Long和String。

 

取得ComponentIdServer 实例的另一种方式如下,通过@Inject注解获取:

@Inject
private ComponentIdServer idGenerator;

 

4. 基于Redis全局唯一ID生成方案

如下代码为基于Redis的lua脚本,获取特定KEY的cnt个ID,使用了Redis调用Lua脚本的原子性。

public JMicroRedisBaseIdGenerator() {
        StringBuilder sb = new StringBuilder();
        sb.append("local k = KEYS[1];\n");
        sb.append("local cnt = ARGV[1];\n");
        sb.append("local val = tonumber(redis.call('incrby', k, cnt));\n");
        sb.append("return val;\n");
        luaScript = sb.toString();
    }

 

获取Int类型的ID

public Integer[] getIntIds(String idKey, int num) {
        Jedis r = pool.getResource();
        try {
            int endId = Integer.parseInt(r.eval(luaScript, 1, idKey,num+"").toString());
            Integer[] ids = new Integer[num];
            int oriId = endId - num;
            for(int i = 0; i < num; i++) {
                ids[i] = oriId+i;
            }
            return ids;
        }finally {
            r.close();
        }
    }

 

5. 使用Redis

在org.jmicro.redis.RegistRedis中,有如下方法实现将Redis相关接口实例注册到IObjectFactory中

 

所以我们可以通过@Inject将以上实例对象注入到我们的代码中,如下代码所示:

    @Inject(required=true)
    private JedisPool pool;

 

 到目前为止,我们在JMIcro环境中,自动拥有了ZK及Redis环境支持,后面还会有MyBatis相关支持,用以操作数据库,如果有兴趣,可提前通过源码查看JMIcror插件式的模块扩展机制。Github链接如下:

https://github.com/mynewworldyyl/jmicro/tree/master/jmicro.ext/jmicro.mybatis

https://github.com/mynewworldyyl/jmicro/tree/master/jmicro.redis

https://github.com/mynewworldyyl/jmicro/tree/master/jmicro.zk

【1】JMicro微服务-RPC体验

【2】JMicro微服务-Hello World

【3】JMicro微服务-服务超时,重试,重试间隔

【4】JMicro微服务-服务限流

【5】JMicro微服务-熔断降级

【6】JMicro微服务-服务日志监控

【7】JMicro微服务-服务路由,负载均衡

【8】JMicro微服务-JMicro ZKUI

【9】JMicro微服务-发布订阅消息服

【10】JMicro微服务-API网关

【11】JMicro微服务-配置管理

【12】JMicro微服务-Zookeeper

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
【JMICRO】 微服务简介及异步RPC体验

一,为什么写JMicro 印象中初次接触微服务大概是2011年,那会做Eclpise插件开发,网上查看好多关于OSGI的技术文章,发现Spring新出了一个叫Spring-boot的框架,那会没太上心,只是了解了点皮...

osc_uie90flw
07/11
4
0
【12】JMicro微服务-Zookeeper

如非授权,禁止用于商业用途,转载请注明出处 作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统一配置和服务注册两个微服务核心...

osc_w9s1w4o0
2019/04/01
2
0
【11】JMicro微服务-配置管理

如非授权,禁止用于商业用途,转载请注明出处 作者:mynewworldyyl 往下看前,建议完成前面1到10小节 JMicro目前仅支持基于Zookeeper做配置管理,全部配置信息可以在ZK做增删改查,建议通过Z...

osc_keofad7g
2019/03/30
2
0
【6】JMicro微服务-服务日志监控

如非授权,禁止用于商业用途,转载请注明出处 作者:mynewworldyyl 1. 微服务相关 在前面的1到5节中,总共涉及服务提供者,服务消费者,服务监听服务,发布订阅服务,熔断器服务5种类型的猪微...

osc_gk4k1cnl
2019/03/22
2
0
【1】JMicro微服务-RPC体验

如非授权,禁止用于商业用途,转载请注明出处 作者:mynewworldyyl JMICRO运行简单服务提供者和消费者 1. 下载源代码 git checkout https://github.com/mynewworldyyl/jmicro.git 也可以直接...

osc_y8yehimr
2019/03/20
1
0

没有更多内容

加载失败,请刷新页面

加载更多

平时使用的Lszrz到底是什么协议?说说Xmodem/Ymodem/Zmodem

XMODEM, YMODEM, and ZMODEM 由于平时使用rz/sz较多,r/s好理解,一个send一个receive。但是由不太清楚z是什么意思,故有此文。 sx/rx, sb/rb (b=batch)和sz/rz分别实现了xmodem,ymodem和z...

独钓渔
39分钟前
17
0
真正的强智能时代已经到来。道翰天琼认知智能机器人平台API大脑。

最近,我常说人工智能的寒冬快要来了,提醒业界要做好思想准备,但同时我也说:冬天来了,春天就不会远了…… 2019年6月我写了篇文章《深度学习的问题究竟在哪?》,说到深度学习的一个主要问...

jackli2020
48分钟前
24
0
什么是控制型人格,控制型人格的筛查测试

一、 什么是控制性人格 拥有控制型人格的人,他们会尽力的隐藏自己的意图,但是又会使用很微妙的方式来利用周围人的弱点,进而占取便宜时,使他们能够得到自己想要的东西。这类人的控制欲非常...

蛤蟆丸子
57分钟前
14
0
【Spring】Spring AOP 代理对象生成逻辑源码分析

1. spring aop案例(POJO注入) 1.0 被代理接口 TargetInterface /** * 被代理的接口 * @author Yang ZhiWei */public interface TargetInterface { void show(); String show......

ZeroneLove
今天
36
0
聊聊dubbo-go的gracefulShutdownFilter

序 本文主要研究一下dubbo-go的gracefulShutdownFilter gracefulShutdownFilter dubbo-go-v1.4.2/filter/filter_impl/graceful_shutdown_filter.go type gracefulShutdownFilter struct {......

go4it
今天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部