阿里巴巴微服务架构的四大金刚利器

【K8S】微服务不香了?单体化改造悄然兴起!! 前文提到的 Proxy API 的实现原理很简单,各 client proxy 只需要默认调用 NewXxx 函数初始化即可(比如对应前文的 NewFeedsRerankClientProxy),得益于 tRPC 的懒初始化机制,这些 Proxy 创建了之后,只要不去调用它,那么即便配置里不包含相关的 client 配置,就不会报错。对调用方而言,这就只是一个函数而已。需要注意的是,如果之前不同的微服务采用了同样的配置名,却实现了不同的功能,那么在代码改造的时候需要修改一下,要不然在此处会发生冲突。 阅读详情

点击上方“开发者技术前线”,选择“星标”

13:21 在看|留言|真爱

来自:阿里巴巴中间件 Photo @Christopher Campbell 

文 | 孔凡勇

概述


互联网应用发展到今天,从单体应用架构到 SOA 以及今天的微服务,随着微服务化的不断升级进化,服务和服务之间的稳定性变得越来越重要,分布式系统之所以复杂,主要原因是分布式系统需要考虑到网络的延时和不可靠,微服务很重要的一个特质就是需要保证服务幂等,保证幂等性很重要的前提需要分布式锁控制并发,同时缓存、降级和限流是保护微服务系统运行稳定性的三大利器。

随着业务不断的发展,按业务域的划分子系统越来越多,每个业务系统都需要缓存、限流、分布式锁、幂等工具组件, distributed-tools 组件(暂未开源)正式包含了上述分布式系统所需要的基础功能组件。

distributed-tools 组件基于 tair、redis 分别提供了 2 个 springboot starter ,使用起来非常简单。

以使用缓存使用 redis 为例, application.properties 添加如下配置:

redis.extend.hostName=127.0.0.1
redis.extend.port=6379
redis.extend.password=pwdcode
redis.extend.timeout=10000

redis.idempotent.enabled=true

接下来的篇幅,重点会介绍一下缓存、限流、分布式锁、幂等的使用方式。

缓存


缓存的使用可以说无处不在,从应用请求的访问路径来看,用户 user -> 浏览器缓存 -> 反向代理缓存-> WEB服务器缓存 -> 应用程序缓存 -> 数据库缓存等,几乎每条链路都充斥着缓存的使用,缓存最直白的解释就是“用空间换时间”的算法。缓存就是把一些数据暂时存放于某些地方,可能是内存,也有可能硬盘。总之,目的就是为了避免某些耗时的操作。我们常见的耗时的操作,比如数据库的查询、一些数据的计算结果,或者是为了减轻服务器的压力。其实减轻压力也是因查询或计算,虽然短耗时,但操作很频繁,累加起来也很长,造成严重排队等情况,服务器抗不住。

distributed-tools 组件提供了一个 CacheEngine 接口,基于 Tair、Redis 分别有不同的实现,具体 CacheEngine 定义如下:

    public String get(String key);

    /**
     * 获取指定的key对应的对象,异常也会返回null
     *
     * @param key
     * @param clazz
     * @return
     */
    public <T> T get(String key, Class<T> clz);

    /**
     * 存储缓存数据,忽略过期时间
     *
     * @param key
     * @param value
     * @return
     */
    public <T extends Serializable> booleanput(String key, T value);

    /**
     * 存储缓存数据
     *
     * @param key
     * @param value
     * @param expiredTime
     * @param unit
     * @return
     */
    public <T extends Serializable> booleanput(String key, T value, int expiredTime, TimeUnit unit);

    /**
     * 基于key删除缓存数据
     *
     * @param key
     * @return
     */
    publicbooleaninvalid(String key);

get 方法针对 key 进行查询, put 存储缓存数据, invalid 删除缓存数据。

限流


在分布式系统中,尤其面对一些秒杀、瞬时高并发场景,都需要进行一些限流措施,保证系统的高可用。通常来说限流的目的是通过对并发访问/请求进行限速,或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以 拒绝服务(定向到错误页或告知资源没有了)、排队 或 等待(比如秒杀、评论、下单)、降级(返回托底数据或默认数据,如商品详情页库存默认有货)。

常见的一些限流算法包括固定窗口、滑动窗口、漏桶、令牌桶,distributed-tools 组件目前基于计数器只实现了固定窗口算法,具体使用方式如下:

 /**
     * 指定过期时间自增计数器,默认每次+1,非滑动窗口
     *
     * @param key 计数器自增key
     * @param expireTime 过期时间
     * @param unit  时间单位
     * @return
     */
    publiclongincrCount(String key, int expireTime, TimeUnit unit);

    /**
     * 指定过期时间自增计数器,单位时间内超过最大值rateThreshold返回true,否则返回false
     *
     * @param key 限流key
     * @param rateThreshold 限流阈值
     * @param expireTime 固定窗口时间
     * @param unit 时间单位
     * @return
     */
    publicbooleanrateLimit(final String key, finalint rateThreshold, int expireTime, TimeUnit unit);

基于 CacheEngine 的 rateLimit 方法可以实现限流, expireTime 只能设定固定窗口时间,非滑动窗口时间。

另外 distributed-tools 组件提供了模板 RateLimitTemplate 可以简化限流的易用性,可以直接调用 RateLimitTemplate 的 execute 方法处理限流问题。

 /**
     * @param limitKey 限流KEY
     * @param resultSupplier 回调方法
     * @param rateThreshold 限流阈值
     * @param limitTime 限制时间段
     * @param blockDuration 阻塞时间段
     * @param unit 时间单位
     * @param errCodeEnum 指定限流错误码
     * @return
     */
    public <T> T execute(String limitKey, Supplier<T> resultSupplier, long rateThreshold, long limitTime,
                         long blockDuration, TimeUnit unit, ErrCodeEnum errCodeEnum){
        boolean blocked = tryAcquire(limitKey, rateThreshold, limitTime, blockDuration, unit);
        if (errCodeEnum != null) {
            AssertUtils.assertTrue(blocked, errCodeEnum);
        } else {
            AssertUtils.assertTrue(blocked, ExceptionEnumType.ACQUIRE_LOCK_FAIL);
        }

        return resultSupplier.get();
    }

另外 distributed-tools 组件还提供了注解 @RateLimit 的使用方式,具体注解 RateLimit 定义如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface RateLimit {

    /**
     * 限流KEY
     */
    String limitKey();

    /**
     * 允许访问的次数,默认值MAX_VALUE
     */
    longlimitCount()default Long.MAX_VALUE;

    /**
     * 时间段
     */
    longtimeRange();

    /**
     * 阻塞时间段
     */
    longblockDuration();

    /**
     * 时间单位,默认为秒
     */
    TimeUnit timeUnit()default TimeUnit.SECONDS;
}

基于注解的方式限流使用代码如下:

@RateLimit(limitKey = "#key", limitCount = 5, timeRange = 2, blockDuration = 3, timeUnit = TimeUnit.MINUTES)
public String testLimit2(String key){
    ..........
    return key;
}

任何方法添加上述注解具备了一定的限流能力(具体方法需要在 spring aop 指定拦截范围内),如上代码表示以参数 key 作为限流 key ,每 2 分钟请求次数不超过 5 次,超过限制后阻塞 3 分钟。

分布式锁


在 Java 单一进程中通过 synchronized 关键字和 ReentrantLock 可重入锁可以实现在多线程环境中控制对资源的并发访问,通常本地的加锁往往不能满足我们的需要,我们更多的面对场景是分布式系统跨进程的锁,简称为分布式锁。分布式锁实现手段通常是将锁标记存在内存中,只是该内存不是某个进程分配的内存而是公共内存如 Redis、Tair ,至于利用数据库、文件等做锁与单机的实现是一样的,只要保证标记能互斥就行。分布式锁相对单机进程的锁之所以复杂,主要原因是分布式系统需要考虑到网络的延时和不可靠。

 distributed-tools 组件提供的分布式锁要具备如下特性:

  • 互斥性:同本地锁一样具有互斥性,但是分布式锁需要保证在不同节点进程的不同线程的互斥。

  • 可重入性:同一个节点上的同一个线程如果获取了锁之后那么也可以再次获取这个锁。

  • 锁超时:和本地锁一样支持锁超时,防止死锁,通过异步心跳 demon 线程刷新过期时间,防止特殊场景(如 FGC 死锁超时)下死锁。

  • 高性能、高可用:加锁和解锁需要高性能,同时也需要保证高可用防止分布式锁失效,可以增加降级。

  • 支持阻塞和非阻塞:同 ReentrantLock 一样支持 lock 和 trylock 以及 tryLock ( long timeOut )。

  • 公平锁和非公平锁(不支持):公平锁是按照请求加锁的顺序获得锁,非公平锁就相反是无序的,目前 distributed-tools 组件提供的分布式锁不支持该特性。

distributed-tools 组件提供的分布式锁,使用起来非常简单,提供了一个分布式锁模板:DistributedLockTemplate ,可以直接调用模板提供的静态方法(如下):

 /**
     * 分布式锁处理模板执行器
     *
     * @param lockKey 分布式锁key
     * @param resultSupplier 分布式锁处理回调
     * @param waitTime 锁等待时间
     * @param unit 时间单位
     * @param errCodeEnum 指定特殊错误码返回
     * @return
     */
    public static <T> T execute(String lockKey, Supplier<T> resultSupplier, long waitTime, TimeUnit unit,
                                ErrCodeEnum errCodeEnum){
        AssertUtils.assertTrue(StringUtils.isNotBlank(lockKey), ExceptionEnumType.PARAMETER_ILLEGALL);
        boolean locked = false;
        Lock lock = DistributedReentrantLock.newLock(lockKey);
        try {
            locked = waitTime > 0 ? lock.tryLock(waitTime, unit) : lock.tryLock();
        } catch (InterruptedException e) {
            throw new RuntimeException(String.format("lock error,lockResource:%s", lockKey), e);
        }
        if (errCodeEnum != null) {
            AssertUtils.assertTrue(locked, errCodeEnum);
        } else {
            AssertUtils.assertTrue(locked, ExceptionEnumType.ACQUIRE_LOCK_FAIL);
        }
        try {
            return resultSupplier.get();
        } finally {
            lock.unlock();
        }
    }

幂等


 在分布式系统设计中幂等性设计中十分重要的,尤其在复杂的微服务中一套系统中包含了多个子系统服务,而一个子系统服务往往会去调用另一个服务,而服务调用服务无非就是使用 RPC 通信或者 restful ,分布式系统中的网络延时或中断是避免不了的,通常会导致服务的调用层触发重试。具有这一性质的接口在设计时总是秉持这样的一种理念:调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。

幂等通常会有两个维度:
1. 空间维度上的幂等,即幂等对象的范围,是个人还是机构,是某一次交易还是某种类型的交易。
2. 时间维度上的幂等,即幂等的保证时间,是几个小时、几天还是永久性的。

在实际系统中有很多操作,不管操作多少次,都应该产生一样的效果或返回相同的结果。以下这些应用场景也是通常比较常见的应用场景:
1. 前端重复提交请求,且请求数据相同时,后台需要返回对应这个请求的相同结果。
2. 发起一次支付请求,支付中心应该只扣用户账户一次钱,当遇到网络中断或系统异常时,也应该只扣一次钱。
3. 发送消息,同样内容的短信发给用户只发一次。
4. 创建业务订单,一次业务请求只能创建一个,重试请求创建多个就会出大问题。
5. 基于 msgId 的消息幂等处理。

在正式使用 distributed-tools 组件提供的幂等之前,我们先看下 distributed-tools 幂等组件的设计。

幂等 key 提取能力:获取唯一幂等 key

幂等 key 的提取支持 2 中注解:IdempotentTxId、IdempotentTxIdGetter,任意方法添加以上 2 注解,即可提取到相关幂等 key ,前提条件是需要将 Idempotent 注解添加相关需要幂等的方法上。

如果单纯使用幂等模板进行业务处理,需要自己设置相关幂等key,且要保证其唯一性。

分布式锁服务能力:提供全局加锁、解锁的能力

distributed-tools 幂等组件需要使用自身提供的分布式锁功能,保证其并发唯一性, distributed-tools 提供的分布式锁能够提供其可靠、稳定的加锁、解锁能力。

高性能的写入、查询能力:针对幂等结果查询与存储

distributed-tools 幂等组件提供了基于 tair 、 redis 的存储实现,同时支持自定义一级、二级存储通过 spring 依赖注入到 IdempotentService ,建议 distributed-tools 幂等存储结果一级存储 tair mdb ,二级存储ldb或者 tablestore ,一级存储保证其高性能,二级存储保证其可靠性。

二级存储并行查询会返回查询最快的幂等结果。

二级存储并行异步写入,进一步提高性能。

高可用的幂等写入、查询能力:幂等存储出现异常,不影响业务正常流程,增加容错

distributed-tools 幂等组件支持二级存储,为了保证其高可用,毕竟二级存储出现故障的概率太低,不会导致业务上不可用,如果二级存储同时出现故障,业务上做了一定的容错,针对不确定性的异常采取重试策略,会执行具体幂等方法。

一级存储与二级存储的写入与查询处理进行隔离,任何一级存储的异常不会影响整体业务执行。

在了解了 distributed-tools 组件幂等之后,接下来我们来看下如何去使用幂等组件,首先了解下 common-api 提供的幂等注解,具体幂等注解使用方式如下:

幂等拦截器获取幂等 ID 的优先级:

  1. 首先判断 Idempotent 的 spelKey 的属性是否为空,如果不为空会根据 spelKey 定义的 spring 表达式生成幂等 ID 。

  2. 其次判断参数是否包含 IdempotentTxId 注解,如果有 IdempotentTxId ,会直接获取参数值生成幂等 ID 。

  3. 再次通过反射获取参数对象属性是否包含 IdempotentTxId 注解,如果对象属性包含 IdempotentTxId 注解会获取该参数对象属性生成幂等 ID 。

  4. 最后以上三种情况仍未获取到幂等 ID ,会进一步通过反射获取参数对象的 Method 是否定义 IdempotentTxIdGetter 注解,如果包含该注解则通过反射生成幂等 ID 。

代码使用示例:

    @Idempotent(spelKey = "#request.requestId", firstLevelExpireDate = 7,secondLevelExpireDate = 30)
    publicvoidexecute(BizFlowRequest request){
       ..................
    }

如上述代码表示从 request 获取 requestId 作为幂等 key ,一级存储有效期 7 天,二级存储有效期 30 天。

distributed-tools 除了可以使用幂等注解外,幂等组件还提供了一个通用幂等模板 IdempotentTemplate ,使用幂等模板的前提必须设置 tair.idempotent.enabled=true或者redis.idempotent.enabled=true ,默认为 false ,同时需要指定幂等结果一级存储,幂等结果存储为可选项配置。

具体使用幂等模板 IdempotentTemplate 的方法如下:

/**
     * 幂等模板处理器
     *
     * @param request 幂等Request信息
     * @param executeSupplier 幂等处理回调function
     * @param resultPreprocessConsumer 幂等结果回调function 可以对结果做些预处理
     * @param ifResultNeedIdempotence 除了根据异常还需要根据结果判定是否需要幂等性的场景可以提供此参数
     * @return
     */
    public R execute(IdempotentRequest<P> request, Supplier<R> executeSupplier,
                     Consumer<IdempotentResult<P, R>> resultPreprocessConsumer, Predicate<R> ifResultNeedIdempotence){

      ........
    }

request:
幂等参数 IdempotentRequest 组装,可以设置幂等参数和幂等唯一 ID 。

executeSupplier:
具体幂等的方法逻辑,比如针对支付、下单接口,可以通过 JDK8 函数式接口 Supplier Callback 进行处理。

resultBiConsumer:
幂等返回结果的处理,该参数可以为空,如果为空采取默认的处理,根据幂等结果,如果成功、不可重试的异常错误码,直接返回结果,如果失败可重试异常错误码,会进行重试处理。

如果该参数值不为空,可以针对返回幂等结果进行特殊逻辑处理设置 ResultStatus(ResultStatus 包含三种状态包括成功、失败可重试、失败不可重试)。

作者信息:

孔凡勇,花名云狄,阿里云-开放平台高级技术家,对高并发、高性能、高可用、可伸缩的分布式系统架构设计有丰富经验,Cloud Native坚定拥护者,坚守开发一线打磨匠艺的架构师。

福利时间:

在这里,我为大家准备了一份2020年最新最全的《Java面试题及答案V3.0》,这套电子书涵盖了诸多后端技术栈的面试题和答案,相信可以帮助大家在最短的时间内复习Java后端的大多数面试题,从而拿到自己心仪的offer。

截了张图,大家可以仔细查看左边的菜单栏,覆盖的知识面真的很广,而且质量都很不错。

资料获取方法

  1. 扫描下方二维码

  2. 在下面的二维后台回复关键词:Java核心整理

END

后台回复“电子书” “资料” 领取一份干货,数百技术电子书等你

开发者技术前线 ,汇集技术前线快讯和关注行业趋势,大厂干货,是开发者经历和成长的优秀指南。

好文点个在看吧!

【SpringCloud分布式框架搭建】一文读懂,docker容器部署springCloud微服务莫名停止的原因 前提说明: 为公司新的架构的技术选型为,springCloud 架构搭建微服务,在ECS以docker形式,部署每个微服务。并为每个docker容器,设置内存限制。在服务部署上线后,发现经常有微服务,莫名的停止。日志上却没有任何error错误。很让人捉急。 具体配置如下: 1、docker 容器的创建: docker run -dit \ -m 640M --memory-swap -1... 阅读详情

相关推荐

微服务正在悄然消亡:这是一件美好的事

最近在做的事情正好需要系统地研究微服务与单体架构的取舍与演进。读到这篇文章《Microservices Are Quietly Dying — And It’s Beautiful》,许多观点直击痛点、非常启发,于是我顺手把它翻译出来,分享给大家,也希望能给同样在复杂性与效率之间权衡的团队一些参考。

程序猿DD 1185

微服务架构的四大金刚利器

Photo @Christopher Campbell文|孔凡勇概述互联网应用发展到今天,从单体应用架构到 SOA 以及今天的微服务,随着微服务化的不断升级进化,服...

阿里巴巴中间件 762

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 681

微服务真的过时了吗?Twitter员工因为微服务被马斯克解雇了

微服务 过时

cliuyang的专栏 3213

DDR核心机制解析:从Burst到Prefetch的性能跃迁

本文深入解析了DDR内存性能跃迁的核心机制,重点阐述了Burst(突发传输)与Prefetch(预取)技术的协同工作原理。Burst机制通过连续传输数据减少访问延迟,而Prefetch则通过内部预取数据提升吞吐量,两者结合完美匹配现代CPU缓存行需求,是DDR3等内存实现高效带宽的关键。

weixin_29232121的博客 135

如何编写 Skill 实现自动化用例生成

Skill 本质上是一组结构化的指令和工具定义,它告诉 AI 模型在特定场景下应该遵循什么流程、调用哪些工具、输出什么格式的内容。元信息:名称、描述、版本等。指令(Instructions):定义 AI 的行为准则和任务流程。工具(Tools):AI 可以调用的外部能力,如文件读写、代码执行、API 请求等。上下文(Context):预设的输入输出格式或示例。编写一个用于自动生成测试用例的 Skill,核心在于定义清晰的指令流程和输出规范。

Cesare的博客 2705

一千个微服务之死

大家好,我是不才陈某~没问题制造问题有一则颇为滑稽的场景,讲述了一位工程师向项目经理解释一个过于复杂的微服务系统是如何工作的,以便获取用户的生日,但最终仍然解释不清楚。这一场景准确地描述了当前IT文化的荒谬之处。然而在现实中,如果你跟面试官讲了这个笑话,你猜他会怎么看你,大概率你不会通过面试的。为什么会变成这样呢?我们的目标本来应该是让系统正常的运行起来,满足业务的需要,但是现在却变成了要解决根本...

码猿技术专栏 326

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 237

中间件小师妹 de 年度工作总结

2019年7月10日加入团队,开始经营这个技术公众号,从以前的技术小小白到现在的技术小白,每天都在精进,要感谢帮助和指导过我的技术小哥哥们,不仅有公司内的师兄们,还有加了小师妹微信号的程...

阿里巴巴中间件 1217

避坑指南:ZYNQ PS端读写BRAM时容易忽略的5个配置细节(基于Vivado 2022.1)

本文基于Vivado 2022.1,总结了ZYNQ PS端读写单口BRAM时5个易被忽略的关键配置细节。内容涵盖关闭Safety Circuit以优化时序、精确匹配AXI控制器与BRAM的地址深度、注意PS端函数位宽与地址对齐、正确连接时钟复位域,并提供了实用的调试技巧与诊断代码,帮助工程师规避常见陷阱,确保数据交互稳定可靠。

net55的博客 374

github创建账号第一步始终出错

github创建账号总结:第一次注册GitHub,填好用户名邮箱密码后进入下一步就卡在哪里,上面还提示Unable to verify your captcha response等,进入网址的解决办法以及下载其他的浏览器也无法解决,用手机浏览器抱着试一试的心态竟然成功了,分享给大家。手机下载谷歌浏览器,进入GitHub正常注册,能向下继续,邮箱验证完以后再用电脑登陆就ok啦

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 4376

菜鸟的系统架构师如何应对交易系统激增的系统流量

点击“开发者技术前线”,选择“星标????”让一部分开发者看到未来物流系统的难题菜鸟的物流系统脱胎于天猫、共享交易,系统之间存在着"打断腿连着皮"的紧密的联系,多年来双方...

开发者技术前线-DevolperFront 311

英伟达 Jetson AGX Thor 官方入门教程(二)CUDA、Docker、JetPack 设置

本文详细介绍了NVIDIA Jetson AGX Thor开发套件的安装与配置流程。主要内容包括:1) BSP安装的三种方法(Jetson ISO、SDK Manager和Linux刷写脚本)及其适用场景;2) Docker环境的完整配置步骤及测试方法;3) CUDA工具包的两种安装方式(容器化和原生安装)及其性能对比;4) JetPack SDK的安装选项。文章提供了详细的命令行操作指南和故障排除建议,帮助开发者快速搭建AI开发环境,充分发挥Jetson平台的硬件性能优势。

机器人控制与仿真应用 1737

京东推出轻量级分布式 RPC 框架 — EasyRPC

点击“开发者技术前线”,选择“星标????”在看|星标|留言, 真爱作者:张松然 来自:京东技术"RPC,即 Remote Procedure Call(远程过程调用),调用远...

开发者技术前线-DevolperFront 558

【自适应调制】自适应调制解调通信链路误码率matlab仿真与分析

BPSK中的B是“Binary”的意思,也就是有两个变化状态,比如说相位上的“+90°(代表1)、-90°(代表0)”,一个状态代表的就是一个比特。QPSK的“Q”是“Quadrature”的意思,有四个变化状态,如相位上的“+45°(代表00)、-45°(代表11)、+135°(代表10)、-135°(代表01)”,那么一个状态就代表两个比特的信息,如图2所示。同理8PSK的一个状态代表三个比特。但是功率资源并不是无限的,基站总的发射功率是一定的,为了充分利用所有的功率,采用的就是AMC技术。

FPGA/MATLAB学习教程/源码/项目合作开发 1833

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【微服务架构】微服务已死——迷你服务万岁

您真的在为您的应用程序使用微服务吗?再想一想。免责声明警告:这将是那些纯粹主义者的文章之一,这些文章解释了你如何没有做你认为你正在做的事情,仅仅是因为你并不真正了解你认为你正在做的事情的完整定义。如果您对此表示满意,那么我们可以继续。您是否曾经定义或实现过基于微服务的架构?你可能错了。对不起,今天我扮演的是“定义警察”的角色。你最有可能处理的不是微服务,而是:迷你服务。让...

全网:架构师研究会 459

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

2026 后端架构大逆转:微服务已死,为什么“分布式单体”重回大厂巅峰?

2026年后端架构迎来"文艺复兴":随着AI工具和硬件算力的提升,过度拆分的微服务弊端显现,业界转向"分布式单体"新范式。该架构结合Wasm模块化隔离与Rust内存安全,在单体部署中实现逻辑解耦,显著降低网络延迟和运维成本。开发者需转型为"整合专家",掌握编译原理、性能调优和分布式内存计算。这场变革并非简单回归,而是AI时代对系统效率的重新权衡,标志着从拆分狂热到性能至上的理性回归。(149字)

2301_80329177的博客 443

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

微服务架构的死亡:10 个迹象表明你需要重构

运维成本的增加可能体现在多个方面,比如需要更多的运维人员来管理日益增多的服务实例,服务器、网络等基础设施的投入不断加大,以及解决服务故障所耗费的时间和人力成本大幅上升。通过重构,企业可以优化服务间的关系,提升系统性能,降低运维成本,增强系统的稳定性、安全性和可扩展性,使微服务架构更好地为业务发展服务。如果微服务架构在面对业务增长时,无法通过简单地增加服务实例来提升系统的处理能力,或者扩展过程中出现各种问题,比如负载不均衡、服务间通信异常等,那么该架构已经不能满足业务需求,需要重构。

2503_92848840的博客 389

2026 架构师预言:微服务将死?Monolithic-First(单体优先)架构为何再次成为硅谷主流?

回到 2018 年,如果你的系统不是部署在 K8s 上的 50 个微服务,你都不好意思跟人打招呼。基础设施成本爆炸:原本一台 4核8G 能跑的应用,拆成微服务后需要 10 台机器,因为每个 JVM/Go Runtime 都要吃资源。调试地狱:一个请求报错,你需要跨越 5 个服务、查 10 个日志文件,分布式追踪(Tracing)变得比业务代码还复杂。网络延迟:原本纳秒级(ns)的内存函数调用,变成了毫秒级(ms)的 RPC 网络调用,性能损耗高达千倍。于是,

BUG猿的博客 930

springcloud学习

一、什么是springcloud,有什么作用   Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。 Spring Cloud是一个全家桶式的技术栈,包含了很多组件。先从其最核心的几个组件入手,...

聚沙成塔 634

2020,微服务之死?

最近几年,微服务大行其道。在业务模型不完善,超大规模流量的冲击的情况下,许多企业纷纷抛弃了传统的单体架构,拥抱微服务。这种模式具备独立开发、独立部署、可扩展性、可重用性的...

开涛的博客 1323

P7面试题

1、微服务注册中心的注册表如何更好的防止读写并发冲突? 2、Nacos如何支撑阿里巴巴内部上百万服务实例的访问? 3、Nacos高并发异步注册架构知道如何设计的吗? 4、Eureka注册表多级缓存架构有了解过吗? 5、Sentinel底层滑动时间窗限流算法怎么实现的? 6、Sentinel底层是如何计算线上系统实时QPS的? 7、Seata分布式事务协调管理器是如何实现的? 8、Seata分布式事务一致性锁机制如何设计的? 9、Seata分布式事务回滚机制如何实现的? 10、Nacos集群CP架构底层类Ra

zhaoyang10的专栏 1584

阿里为何值4400亿美金?看看Tech Leader每天干啥就知道了!

点击“技术领导力”关注∆每天早上8:30推送 从市值上看,阿里已经雄踞BATM之首,是毫无争议的老大,除了市值之外,同样被大家津津乐道的是,阿里员工的高额工资、大把股票。所以,一直很好奇,在阿里做一名Tech Leader,是一种什么样的体验? 2019AS大会上,听了阿里高级技术专家--孔凡勇(云狄)的分享:《细说Tech Leader在开发团队的核心职责》,终于解答了我的...

技术领导力 6841

慎重选择微服务架构:一个真实案例的深度反思

本文通过一个真实的"伪微服务"案例,揭示了盲目追崇微服务架构的风险。技术选型没有银弹,适合自己的才是最好的。

千木一枝的博客 693

java redis延迟队列_Redis实现延迟队列

延迟队列,顾名思义它是一种带有延迟功能的消息队列。那么,是在什么场景下我才需要这样的队列呢?1. 背景我们先看看以下业务场景:当订单一直处于未支付状态时,如何及时的关闭订单如何定期检查处于退款状态的订单是否已经退款成功在订单长时间没有收到下游系统的状态通知的时候,如何实现阶梯式的同步订单状态的策略在系统通知上游系统支付成功终态时,上游系统返回通知失败,如何进行异步通知实行分频率发送:15s 3m ...

weixin_31880383的博客 1561

阿里开发规范_字字珠玑,高级技术专家带你了解阿里的开发流程规范

此前,阿里高级技术专家孔凡勇(云狄)老师撰写了在 Alibaba 成为优秀的技术主管,需要在“开发规范、开发流程、技术规划与管理”方面有自己的深入思考文章。受广大读者的需求,我们邀请云狄老师解读了部分读者提出的问题,帮助大家深入了解阿里的开发流程和规范化实践过程。以下是 Q&A 形式的文字整理。更多细节关注 7 月 12 日深圳 ArchSummit 全球架构师峰会上云狄老师的演...

weixin_39801613的博客 1241
上一篇: 你写得API接口代码真是一坨"屎",难道不能对返回格式统一处理一下吗?
下一篇: 扎心了!程序员
DevolperFront
博客等级 码龄8年 465粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值