干货 | 聊聊携程升级Dubbo的踩坑历程

微服务:dubbo 从2.6 升级到2.7 dubbo 从2.6 升级到2.7 参考:https://www.cnblogs.com/cdfive2018/p/11245036.html dubbo官网:http://dubbo.apache.org/zh-cn/docs/user/versions/version-270.html 修改 dubbo 依赖,完成dubbo 升级 <properties> &l... 阅读详情

作者简介

顾海洋,携程框架架构研发部技术专家,负责携程分布式服务化领域的工作。目前主要负责 Dubbo 在携程的二次开发和推广工作。

一、什么是 CDubbo


携程从 2017 年 11 月左右开始调研,真正落地是在 2018 年 4 月发布的 CDubbo 0.1.1 版本。在携程内部,我们管他叫 CDubbo,言下之意就是携程版的 Dubbo。考虑到以后升级的问题,CDubbo SDK 是对 Dubbo SDK 的扩展和包装,保留了 Dubbo 所有的扩展和配置能力。

目前,生产环境已经从第一个 0.1.1 版本,到目前的 0.13.3 版本,历经十几个版本的迭代,服务端有 156 个应用,客户端 170 个应用,生产实例数 2000 个左右。

二、升级 2.7.3 的几个理由

2.5.10 版本在携程只用了一年半左右,业务的应用也不算很多,这么快就大版本升级,主要是遇到了下面的几个问题。

1)2.5.10 的异步也是有阻塞的

2.5.10 版本只支持客户端异步,而且是基于 JDK 1.6 的 Future,并不是真正意义上的异步,本质上还是阻塞的,只不过是从 DubboClientHandler 线程切换到了业务线程。

2)支持服务端异步

对于微服务来说,一般又会调用外部服务,在网络 IO 比较多的场景下异步服务的优势会很明显,可以充分利用 CPU 资源,提高系统吞吐量,降低响应时间。部分机票、酒店等业务同学明确表示需要服务端异步。

3)现阶段不兼容问题带来的副作用较小

不兼容问题大概率是服务端和客户端的版本不一致,比如服务端 2.7.0,客户端 2.5.10。考虑到携程目前 CDubbo 服务的比例还不太高,早一点升级对业务的影响会比较小。

4)为之后的升级做铺垫

携程业务场景很广泛,部分业务已经明确表示需要 2.7.0 的服务端异步,也有业务在尝试 3.0 的 Reactive 了。如果先升级到 2.7.0,以后再升级 3.0 会比较容易些,如果直接从 2.5.10 升级到 3.0 版本,可能升级不过去,或者无法透明升级。

5)支持三中心

2.5.10 只有注册中心,注册数据和配置数据对注册中心的压力比较大。2.7.0 对模型重构,拆分成注册中心、元数据中心、配置中心,职责划分更合理。为了接入公司的测试平台,需要用到服务的元数据信息,2.7.0 正好提供了这个能力。

三、第一阶段升级及踩坑历程


注:为了表达方便,后续提到的 Apache 代表 org.apache 的 package,Alibaba 代表 com.alibaba 的 package。

第一阶段升级 2.7.0 是在 2019 年 3 月份左右,大概花了三周的时间,我们先来看下所遇到的几个问题吧。

3.1 变更 package 导致的不兼容

2.7.0 把 package 从 com.alibaba 改成了 org.apache,虽然对低版本做了兼容,但是还是会发现部分 class 找不到了,例如:Alibaba 的 DubboComponentScan 就已经被删掉了。取而代之的是 Apache 的 DubboComponentScan,不过这个问题在编译时就会报错了。

3.2 Apache 的 Constants 常量类被拆分

升级到 2.7.0 版本之后,Alibaba package 的 Constants 还是没变,但是如果要用新功能升级到 Apache package,你会发现 Constants 被拆分成 RegistryConstants, CommonConstants, RemotingConstants 等多个常量类。新的常量类只是分散到不同的 class 中,只要换个引用就可以解决了。

3.3 Apache 的 Router 接口新增了部分方法

如果扩展是基于 Alibaba 的 Router 接口,Dubbo 已经做了默认实现,应该不会存在兼容性问题。这次,我们直接换成了 Apache 的 Router 接口,因为新加了 isRuntime、isForce、getPriority 方法编译时就报错了。

3.4 Apache 的 ProxyFactory 接口新增了 getProxy 方法

我们这次升级是把 Alibaba 的 ProxyFactory 换到了 Apache 的 package 下,2.7.0 版本中对该接口新增了 getProxy 方法,编译时会报错。如果不需要扩展这部分功能,可以通过 delegate 机制保留默认实现就可以了。

3.5 限制 ApplicationConfig 必须全局唯一

2.5.10 版本对于 ApplicationConfig 没有限制,服务端起多个服务时可以配置独立的 ApplicationConfig。但是从 2.7.0 开始 ApplicationConfig 就会要求全局唯一,如果一个应用定义了多个不同的 ApplicationConfig 就会报错。

Apache 的 ConfigManager 的 setApplication 会检查是否 duplicate。

640?wx_fmt=png

3.6 JDK 1.8

2.7.0 为了支持真正的异步,用到了 JDK 1.8 的 CompletableFuture,也用到了 1.8 的 Supplier、Consumer 等操作符。如果业务的应用还是基于 JDK 1.7 打包的,升级后就会导致发布失败。由于我们这次是公司层面的整体升级,就需要所有业务应用都升级到 1.8 才可以发布。

3.7 默认升级到 Netty4

为了接入公司的 CAT 监控系统,需要把 Codec 的监控埋点数据通过 ThreadLocal 传递下去。

但是,2.7.0 把 Netty 的版本从默认的 Netty3 升级到了 Netty4,这两个版本的线程模型是不一样的,Netty3 的 decode 是在 New IO worker 线程,Netty4 是 NettyServerWorker 线程,导致原有逻辑的监控埋点数据传不过来。为了暂时解决这个问题,我们把默认的 Netty 版本降回了 Netty3。

注:CAT 是点评开源的实时应用监控平台,目前在携程也有落地,在 Github (https://github.com/dianping/cat)上也已经超过 1 万颗星。

3.8 异步请求一直 hang 住

扩展 2.5.10 版本的时候,为了支持对客户端异步的埋点,我们对 RpcContext 的 Future 重新包装了,用户拿到的 Future 已经是被我们包装过的 FutureAdapter 了。

640?wx_fmt=png

在 2.7.0 版本中, AsyncRpcResult 在 recreate 的时候也会给 RpcContext 设置 Future。导致用户拿到的 Future 跟实际的不是同一个,客户端一直拿不到响应,请求被 hang 住。

640?wx_fmt=png

2.7.0 对这部分的重构很好,支持了异步 Filter 链,通过 ListenableFilter 回调机制比现在的代码结构更清晰,可以把同步和异步埋点的逻辑进行统一整合。

640?wx_fmt=png

3.9 服务端无法指定客户端的调用方式

Issue:https://github.com/apache/dubbo/issues/3650

如果服务端设置了默认 ASYNC,升级到 2.7.0 版本后客户端会拿不到响应。例如:服务端配置了 async=true,客户端默认配置。

<dubbo:service interface="..." async="true">	
<dubbo:reference interface="...">

2.5.10 版本的客户端,通过 client.sayHello() 会返回 null,RpcContext 的 Future 可以拿到响应。

基于 2.7.0 版本测试下来, client.sayHello 拿到了响应,但是 RpcContext 的 Future 却是 null。

经过研究发现,2.7.0 版本在 ClusterUtils 的 mergeUrl 过程中把服务端传递过来的 ASYNC_KEY 给删掉了,所以客户端仍然以同步方式去调用。

这个是新老版本兼容性的 Bug,已经在 2.7.2 修复了,验证下来没问题了。

3.10 @Service 注解无法设置 parameters 参数

Issue:https://github.com/apache/dubbo/issues/3778

用户通过 Annotation 方式启动服务,在 @Service 注解的 parameters 属性,服务端启动的时候拿不到用户配置的参数。

@Service(parameters = {"someKey","someValue"})	
public class DemoServiceImpl implements DemoService {	
}

并且报了下面这样的错误。

Caused by: 	
org.springframework.beans.ConversionNotSupportedException: 	
Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Map' for property 'parameters'; 	
nested exception is java.lang.IllegalStateException: 	
Cannot convert value of type 'java.lang.String[]' to required type 'java.util.Map' for property 'parameters': 	
no matching editors or conversion strategy found

2.7.0 版本对这部分机制进行了重构,BeanDefinitionBuilder 把这段 parameters 的参数转换代码给漏掉了。加上这段逻辑之后,我们测试下来已经 OK 了,这个问题已经在 2.7.2 解决掉了。

private AbstractBeanDefinition buildServiceBeanDefinition() {	
    BeanDefinitionBuilder builder =rootBeanDefinition(ServiceBean.class);	
    ...	
    // Convert parameters into map	
   builder.addPropertyValue("parameters",convertParameters(serviceAnnotationAttributes.getStringArray("parameters")));	
}

3.11 当客户端发现服务时出现异常,即使服务端启动后也不会恢复

Issue:https://github.com/apache/dubbo/issues/4068

API 方式比 XML 和 Annotation 更灵活,可以在不重启进程的情况下多次初始化客户端。

服务端没有启动的情况下,通过 API 的方式启动了客户端,这个时候客户端会报 No Provider 的错误。然后启动服务端,客户端通过 API 的方式再次初始化,仍然会报 No Provider 的错误。

ReferenceConfigCache cache = ReferenceConfigCache.getCache();	
DemoService demoService = (DemoService) cache.get(reference);

通过翻阅 ReferenceConfig 的代码,服务发现的时候可能会抛异常导致直接跳出 init 过程,但是 initialized 标志位已经被置为 true 了,导致下次不会再重新初始化。

640?wx_fmt=png

修复方案:只有在 init 方法的最后,客户端代理创建完成才会设置 initialized 为 true。

640?wx_fmt=png

这个问题已经在 2.7.2 版本修复,验证下来已经 OK 了。

3.12客户端服务发现失败,重试会有 OOM 的风险

Issue:https://github.com/apache/dubbo/issues/4107

如果服务端没有启动的情况下启动了客户端,客户端会报 No Provider 的错误,如果一直不停的重试可能会有 OOM 的风险。

Dubbo 在创建代理的时候会缓存 urls,每次启动失败都会把 url 加到 urls,但是由于 dubbo 的 URL 是有时间戳的,就导致 urls 队列不停的增长,甚至引起 Heap OOM 的风险。

640?wx_fmt=png

解决方案:每次创建代理之前,都把 urls 给予清空,这个问题已经在 2.7.2 中解决了。

总结:第一轮升级过程中大概历时 3 周左右,发现的几个 Issue 导致我们的 Test Case 无法继续下去,升级过程暂停了两三个月。

四、第二阶段升级及踩坑历程


直到六月中旬,阿里团队把上述几个问题在 2.7.2 修复了,我们重新开始了第二轮的升级过程。

4.1 性能测试,吞吐量下降了 40%

服务端:8C24G 的物理机,响应报文大小为 10Bytes,queue 设置为 -1 无界队列。

客户端:10 台 4C8G 的 Docker,请求报文大小也是 10Bytes。

基于原生的 2.5.10 版本,我们的压测环境下可以达到 8 万 QPS 左右。由于 CDubbo 扩展了熔断、配置、监控等功能,吞吐量下降到 5.5 万 QPS 左右。

升级到 2.7.2 版本后,最高只压测到 3 万多,吞吐量下降了差不多 40% 左右。

这个问题是因为 JDK 1.8 的 Bug 导致的,JDK 1.8 的 CompletableFuture 在 get 时会等到 256 次 countDown 执行完毕,影响了性能。

Issue:https://github.com/apache/dubbo/issues/4279

总结:第二阶段遇到的性能下降的问题肯定要解决后才可以上线,问题反馈给阿里团队后,他们需要讨论新的 Hotfix 发布机制。


五、第三阶段升级及踩坑历程


这次改变了合作模式,跟阿里团队基于 2.7.3-SNAPSHOT 版本一起讨论,一起修复,一起验证。下面的几个问题都是基于 SNAPSHOT 验证过程中发现的问题,并且在正式版中修复掉了。

5.1 对于同步的请求,方法级超时不生效

如果服务级设置的 timeout 为 1000ms,sayHello 方法设置的 timeout 为 800ms。理论上来说,sayHello 方法的请求应该在 800ms 就会超时了,但是实际上我们发现直到 1000ms 才会超时。

<dubbo:reference id="demoService" interface="com.ctrip.Demo" timeout="1000">	
  <dubbo:method name="sayHello">	
    <dubbo:parameter key="timeout" value="800"/>	
  </dubbo:method>	
</dubbo:reference>

同步的请求是在 AsyncToSyncInvoker 中执行了同步等待,修复前的代码如下,取的是整个服务的超时时间,也就是 1000ms。

asyncResult.get(getUrl().getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS);

解决方案:同步请求,除了 AsyncToSyncInvoker 在 get 时被设置了超时时间,DubboInvoker 的 CompletableFuture 也被设置了超时时间。其实,只要一个地方能够超时就足够了,所以 AsyncToSyncInvoker 被设置到 Integer.MAX_VALUE 永不超时,所有的超时机制都通过 CompletableFuture 实现。

5.2 异步超时的情况下,不会回调 listener 的 onError 方法,导致埋点丢失

Issue:https://github.com/apache/dubbo/issues/4152

https://github.com/apache/dubbo/issues/4306

在修复前的版本中,ProtocolFilterWrapper 的 Filter 链中,只处理了正常的 onResponse 响应,并没有处理 onError 情况,就导致异常发生时不会回调 ListenableFilter 的 onError 方法。

修复后,会对正常响应和异常响应进行回调。

try {	
    if (t == null) {	
        listener.onResponse(r, filterInvoker, invocation);	
    } else {	
        listener.onError(t, filterInvoker, invocation);	
    }	
} catch (Throwable filterError) {	
    t = filterError;	
}

5.3 @Reference 注解的方式,客户端不会初始化

Issue:https://github.com/apache/dubbo/issues/4330

基于 2.7.2 版本,如果用的 Annotation 的方式,先要把 DubboComponentScan 换成 Apache 的,不然编译时就会因为找不到 class 而报错 。

如果客户端的 @Reference 用的还是 Alibaba 的 package,所拿到的 proxy 代理是 null,导致 service.sayHello 调用时抛 NPE 的 exception。

640?wx_fmt=png

这个问题,主要是由于 Apache 的 DubboComponentScan 没有兼容 Alibaba 的 @Reference 注解,目前 2.7.3 正式版实现了对 Alibaba 的 @Reference 和 @Service 的兼容。

5.4 服务端 executes 限流失效

Issue:https://github.com/apache/dubbo/issues/4277

我们的测试场景把服务的 executes 设置为 1,然后客户端多线程发起请求到服务端。第一次发起的多线程请求,只有一个请求能通过,符合预期。第二次再发起多线程请求,所有请求都通过了,并没有被限流。

<bean id="demoService" class="com.xxx."/>	
<dubbo:service interface="com.xxx" ref="demoService" executes="1">	
</dubbo:service>

这是因为服务端抛异常的时候,除了正常请求结束后释放掉的计数器,异常处理时又减了一次,之后的限流一直处于失效的状态,所有请求都可以通过了。

这个问题已经在 2.7.3 解决了,解决方案就是在 onError 的时候不要重复减。

640?wx_fmt=png


5.5 现有服务框架生成的 ListenableFutre 异步服务接口,Dubbo 无法支持

携程现有几千个 SOA 服务,服务端异步用的是 Guava 的 ListenableFuture,但是 2.7.0 支持的服务端异步用的是 CompletableFuture,这就导致现有服务接口迁移过来,无法支持 Dubbo 协议的服务端异步了。

针对这个问题,我们想到了几个方案。

方案 1:让 Dubbo 既支持 CompletableFuture 又支持 ListenableFuture

首先,需要 Dubbo 支持 ListenableFuture,这个改动成本比较高。其次,对用户多一个选择也会提高他们的学习成本,以及犯错的概率。

方案 2:只支持 CompletableFuture

如果用户从 SOA 服务迁移到 CDubbo 框架,就需要把服务接口的 Future 类型改为 CompletableFuture。

最终跟业务沟通下来,选择了方案 2,业务迁移到 CDubbo 的时候手工修改服务接口的 Future 类型。

5.6 服务端新版本,客户端老版本,报 Netty3 找不到的异常

这个问题的根因是前面监控打点失败,我们把 Netty 默认版本降回了 Netty3。服务端 2.7.3 版本,客户端 2.5.10 版本的情况下会报 Netty3 找不到的异常。

在 2.5.10 版本中, Netty3 在 resource 配置文件中的名字叫 netty,具体如下图:

640?wx_fmt=png

但是,2.7.3 版本把 Netty3 在 resource 配置文件中的名字改成了 netty3,而不是 netty 了。

640?wx_fmt=png

服务端注册的时候会包括 Netty 版本,通过注册中心推送到了客户端,客户端的 2.5.10 版本不存在 netty3 的资源文件,通过 SPI 加载的时候因为找不到 netty3 而报错了。

解决方案:Netty 的版本不应该被推送到客户端,我们修改了动态配置的推送规则,不允许 Netty 参数推送到客户端,问题就解决了。


六、兼容性测试


第三轮测试把所有的 Test Case 都通过了,接着我们手工验证了新老版本的兼容性测试。以下场景都是基于服务端升级 2.7.3,客户端仍然是 2.5.10 场景下的测试验证。


6.1 注册发现机制

服务端可以正常注册到注册中心,客户端也可以发现到新版本的服务端。


6.2 同步请求是否正常

如果服务端返回的是 Response 对象,客户端以同步的方式可以正常调用。


6.3 异步请求是否正常

如果服务端返回的是 Response 对象,客户端以异步的方式可以正常调用。

 
6.4 监控打点

除了不支持 CompletableFuture,其他都正常。


6.5 服务端升级到新版本,客户端老版本,在超时场景下的异常测试

因为服务端抛的是 org.apache.dubbo.rpc.RpcException,这个 package 在 2.5.10 版本中是不存在的,就会报 java.lang.ClassNotFoundException 的错误。

这个错误似乎也没法避免,这也是我们优先升级 Dubbo 2.7.3 的原因,我们要忍受这种阵痛,等全部升级完就不存在这个问题了。


七、性能压测


兼容性测试也通过了,我们紧接着开始了第二轮压力测试:(基于 2.7.3-SNAPSHOT)

从服务端的压测数据来看,在低于 4 万 QPS 的时候性能没啥区别,在 5 万左右的时候响应时间有所下降,主要是由于 YGC 导致的。

2.5.10 服务端

640?wx_fmt=png

2.7.3 服务端

640?wx_fmt=png

从客户端的性能来看,吞吐量基本没啥变化,响应时间在 5000QPS 的时候下降稍微有点明显,主要也是 GC 导致的。

2.5.10 客户端

640?wx_fmt=png

2.7.3 客户端

640?wx_fmt=png


八、集成测试


到现在为止,CDubbo 单个组件已经完成了所有 Test Case,兼容性测试也全部通过了,压力测试的结果勉强可以接受。公司有一些中间件也会依赖 Dubbo,除了这些组件要升级 Dubbo 到 2.7.3,我们还遇到其他一些问题。


8.1 ApplicationConfig 的冲突再次出现

前面只是解决了 CDubbo 单个组件的 ApplicationConfig 冲突问题,在一个组件中保证只会有一个 ApplicationConfig。但是,不同组件在暴露本地服务的时候也需要设置 ApplicationConfig,用户可能会只引用一个组件,也可能两个同时引用,无法保证不同组件只初始化一个 ApplicationConfig。

看了 ApplicationConfig 的 equals 方法,可以知道冲突是因为 name 不一致,我们只要保证 name 一致就行了。

640?wx_fmt=png


8.2 开源和订制版的冲突

在携程,大部分业务用的是我们提供的开源版的 Dubbo,还有部分业务使用的是基于 Dubbo 代码直接修改过的订制版本。

因为,我们这次是公司级的升级,用了订制版 Dubbo 的应用,如果引入公司其他中间件,这些中间件又依赖了开源版的 Dubbo,就会导致业务的应用类冲突。

对于这个问题,没有统一的解决方案,需要跟业务同事进行讨论来解决。


8.3 服务端启动时端口连不上

Issue:https://github.com/apache/dubbo/issues/4775

在集成测试时,服务端用的默认协议,客户端通过 20880 端口发起的连接,结果客户端报连接失败。后来看了下服务端的 20880 端口的确没有打开,本地打开的端口号是 20xxx。

经过调试代码发现拿到的默认协议是 QSchedule 组件设置的 ProtocolConfig。看下 ConfigManager 的代码,addProtocol 的时候会把第一个协议作为默认协议缓存下来了,之后再 getDefaultProtocol 的时候拿到的并不是默认的协议了。

public void addProtocol(ProtocolConfig protocolConfig) {	
    …	
    if (protocols.containsKey(key)&& !protocolConfig.equals(protocols.get(key))) {	
        logger.warn("…");	
    } else {	
        protocols.put(key, protocolConfig);	
    }	
}

这个问题可以把 ProtocolConfig 默认值设置为 false,就不会被 put 到 protocols 作为默认协议了。但是,对于不知道背景的同学可能还是会掉坑里,不过这个问题会在 2.7.4 版本中修复。


九、感兴趣的几个话题


写到这里,我们已经通过了 Test Case、回归测试、压力测试和集成测试,发布了 SNAPSHOT 版本给到业务同事去试用,预计九月初会发布正式版本。

除了我们踩到的坑,下面可能也是你感兴趣的话题。

9.1 注册中心

注册中心,我们在去年落地 2.5.10 的时候就扩展了携程自己的注册中心。

服务端注册实例信息到注册中心,每隔 5s 发送一次心跳来续约,如果注册中心 30s 没有收到心跳,会将其从注册中心反注册,并通知到客户端。

客户端向注册中心发起订阅,当注册信息发生变化时会通过长连接推送到客户端。

这套机制是基于 2.5.10 扩展的,在升级 2.7.3 的过程中没有任何变更,可以完全兼容 2.7.3,服务端和客户端都可以正常的注册和发现。


9.2 从一个中心拆分成三中心

1)注册中心:前面已经提到,升级 2.7.3 没有变更,可以完全兼容。

2)配置中心:CDubbo 的 0.2.0 版本,为了接入携程自己的配置中心,就已经通过 override 协议实现了动态配置方案,这套机制目前没有发现问题,所以这次没有对接 2.7.3 提供的动态配置推送能力。方案可以参考:

http://dubbo.apache.org/zh-cn/docs/user/demos/config-rule-deprecated.html

3)元数据中心:TCP 协议的测试不像 HTTP 协议那么方便,服务提供者必须得自己写个 Client 才能测试验证,大多数业务同事都反馈过这个痛点。

在 2019 年 1 月份的时候,CDubbo 对接了携程的测试平台,支持 Dubbo 协议的测试。当时为了透明升级 2.7.0 版本,就已经提前把元数据中心的代码拷贝到内部的版本了,这次升级 2.7.3 版本很平滑,没有发现有啥问题。


9.3 为什么敢于升级大版本

业界对大版本升级的普遍做法就是,等其他大厂试试看,或者等发布几个 hotfix 之后再考虑。携程在这次升级过程中有一套自己的保障,事实也证明我们的单元测试和集成测试在 2.7.3 升级过程中发挥了重要作用。

1)单元和集成测试覆盖率 93%:刚开始落地 CDubbo 的时候就非常重视测试覆盖率。目前为止,我们的测试覆盖率仍然达到了 93%。

在这次升级过程中,很多藏的很深的 Bug 都是通过我们的测试代码发现的,前面谈到的升级过程中遇到的 Bug 基本都是通过测试代码发现的。不但保证了质量,也提高了我们升级的效率。

2)Benchmark 压测:我们有一套稳定的压测环境,服务端是一台 8C24G 的物理机,客户端是 10 台 4C8G 的 Docker 机器。服务器都比较稳定,测试结果也能真实准确的反应出性能的问题。

每次发布新功能的时候,都要经过 Benchmark 至少 5 万 QPS 以上持续一天的稳定性压测。

【推荐阅读】

640?wx_fmt=jpeg

Unity类银河恶魔城学习记录1-10 PlayerWallJump源代码 P37 Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 阅读详情

相关推荐

用于多种无人机协作的群体智能算法:综合综述

随着无人机技术的快速高水平发展,将多架无人机作为自主控制的编队应用于复杂情况是一个新兴领域的代表之一。在实现自主控制的挑战中,碰撞避免、任务分配、路径规划和编队重构是关键功能。本文对各种经典的无人机群智能算法进行了系统的总结和分析。

erjia_的博客 1万+

Dubbo详解,用心看这一篇文章就够了【重点】

1.1 Dubbo概述 Dubbo是阿里巴巴开源的基于 Java 的高性能RPC(一种远程调用) 分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中。 简单的说,Dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有Dubbo这样的分布式服务框架的需求。 并且本质上是个远程服务调用的分布式框架(告别Web Service模式中的

ᶻᶻᶻ 枕星河的博客 11万+

SystemC实战:用C++搞芯片建模的5个典型场景(含代码示例)

本文通过五个典型实战场景,详细介绍了如何使用SystemC这一基于C++的硬件建模库进行芯片设计与系统级建模。内容涵盖从基础并发模块构建、事务级总线建模、跨时钟域验证,到与ModelSim协同仿真及多核系统性能探索,并提供了完整的代码示例,帮助软件工程师利用熟悉的C++工具链高效参与硬件架构设计与验证。

weixin_29191761的博客 314

2020-08-19

dubbo版本从2.5.3(有漏洞)升级到2.7.5 ,由于之前用的jdk1.6,spring 4.1 。这次升级需要把jdk升级到1.8,spring升级到4.3,dubbo升级到2.7.5。 升级之后一直报错,目前还没找到问题。 Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document fro.

leeroy23的博客 297

二次开发vba_CATIA VBA(VBS)二次开发:使用Search批量选择元素

在CATIA二次开发中很多在程序中进行自动交互的方法或函数都需要使用选择集作为参数,将几何元素按照要求批量添加到选择集中也是实现程序自动运行的有效方法。在前面的文章《CATIA使用VBA(VBS)二次开发时用户的交互选择》和《CATIA使用VBA(VBS)二次开发时工程图和草图位置的交互选择函数Indicate2D》中介绍了在CATIA VBA(VBS)二次开发中用户和选择集之间的交互操...

weixin_32497403的博客 1321

电镀技术:微型制造的原子级加法工艺与核心优势

电镀是一种利用电解原理在基材表面沉积金属层的表面处理技术,其本质是通过电场控制溶液中金属离子的迁移与还原,实现原子级的可控沉积。这一过程的核心在于对电流密度、温度、添加剂等参数的精密调控,从而实现对镀层结晶结构、性能的“编程”。从技术价值看,电镀作为一种“加法制造”工艺,在微观尺度上具有无与伦比的保形性和材料灵活性,能够实现复杂三维结构的均匀覆盖与功能复合。在应用场景上,它尤其契合现代微型化制造的需求,例如在集成电路的铜互连填充、高密度PCB板微孔金属化、MEMS传感器电极制备以及柔性电子器件制造中发挥着不

weixin_42524842的博客 528

dubbo2.7.9升级到dubbo3.0.7+nacos1.4.3+springboot2.6.6成功实践笔记

升级过程中遇到一堆的坑,不过都一一解决了,主要是版本冲突,启动失败 以下是正确配置: springboot依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.6</version>

5858

基于Python的电商平台商品价格监控与历史价格查询系统

随着电子商务的快速发展,消费者对商品价格透明度的需求日益增长。本文设计并实现了一个基于Python的电商平台商品价格监控与历史价格查询系统,能够自动抓取京东和淘宝商品信息,存储历史价格数据,并通过可视化界面展示价格走势。系统采用最新的异步爬虫技术、反爬虫绕过策略和现代Web框架,实现了高效稳定的数据采集与展示功能。关键词:Python爬虫、价格监控、历史价格、数据可视化、异步爬虫、电商平台实现了京东和淘宝商品信息的异步爬取,采用多种反爬虫策略提高爬取成功率;

2201_76125261的博客 682

Dubbo服务提供者如何优雅升级?

当我们使用dubbo作为服务间通信的组件时,在后期的系统维护中可能会因为业务需要,服务提供者某些接口需要升级,对应的服务消费者配合作相应的修改,测试通过后一起发版上线即可。但是在这个过程中,有很多需要注意的点,不妨来梳理一下以作记录,希望对此不清楚的开发者有所帮助。再次申明一下我们的需求吧。假设服务A提供了一个服务IHelloService,其中有一个方法sayHello,服务B、C、D…都对此有依赖,假设服务A提供的该接口已上线且被服务B、C、D正常消费,线上运行稳定。End。

ibigboy 832

OpenRubrics:自动化评估工具优化LLM对齐效果

在大型语言模型(LLM)应用中,模型输出与人类价值观的对齐是关键挑战。传统人工反馈强化学习(RLHF)依赖大量标注,成本高且一致性差。OpenRubrics作为开源工具,通过结构化准则实现自动化评估,显著提升效率。其核心原理是将主观评价转化为可量化的多维指标,支持动态权重调整,并兼容主流RLHF框架。该工具在降低标注成本的同时,通过Fleiss' Kappa系数等指标保证评估一致性,适用于多语言和医疗等专业领域,为LLM对齐提供了工程化解决方案。

weixin_28730037的博客 357

C#串口通信从入门到精通(27)——高速通信下解决数据处理慢的问题(20ms以内)

本文介绍如何在高速通信情况下解决串口接收的数据来不及处理的问题,由高级工程师多年经验总结而成,绝对是串口领域的实战经验!

qq_34059233的博客 6807

技术干货收集分享(一)

1.解Bug之路-dubbo流量上线时的非平滑问题 :https://my.oschina.net/alchemystar/blog/3098219 2.解Bug之路-记一次中间件导致的慢SQL排查过程 :https://my.oschina.net/alchemystar/blog/2994406 3.解Bug之路-记一次JVM堆外内存泄露Bug的查找 :https://my.oschina.net/alchemystar/blog/1603817 4.CPU 占用高,导致请求超时的故障排查 :ht

jueqi6666的博客 385

手把手教你学基带SOC芯片(4.4.9)--基带芯片的电源管理实例:高通 Snapdragon 系列实例(十)

Snapdragon 888 通过支持多种深度睡眠模式,如 AOAC 模式、低功耗模式和深度睡眠模式,以及智能电源管理技术,实现了对功耗的精细管理。这些模式不仅延长了设备的电池寿命,还确保了用户在各种使用场景下的良好体验。无论是保持网络连接、限制后台活动,还是完全关闭不必要的功能,Snapdragon 888 都能够灵活应对,提供高效的功耗管理方案。

MHD0815的博客 740

干货 | 计算密集型服务的负载均衡策略

作者简介罗茂林,携程国际机票后台研发总监,主要负责国际机票引擎的研发工作。致力于系统性能优化和研发效率提升。一般情况下,在计算密集型服务中,即使处理单个请求也需要使用到服务器的所有CP...

携程技术 1182

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

论dubbo版本升级的重要性【spring boot +dubbo】

dubbo集成到spring boot中,充当消费者 使用的是注解的配置方式。 1、pom.xml中添加 com.alibaba dubbo 2.5.4 provided org.springframework spring

kevin.xia 的专栏 5151

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Dubbo不同版本间的调用NullPointerException

我本地是多modules项目,现在有一个新功能使用了Dubbo2.7.7,原来的是2.6.1,使用2.6.1调用2.7.7的服务一直是空指针,百度谷歌未果,猜测是2.7之后的版本有重大改动,所以不兼容,建议使用相近版本。...

目标检测专栏持续更新中,改进YOLO系列通用,适用v5、v7、v8、所有博客均是团队原创博客,所有文章禁止转载,违者必究。 737

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Dubbo快速入门(一):分布式与微服务、Dubbo基本概念

在互联网时代,随着用户基数的急剧增长和技术的不断进步,互联网项目与传统项目相比有了显著的区别。因此,互联网项目更加注重用户体验,包括界面的美观度、功能的丰富性、加载的速度以及系统的稳定性。在互联网架构中,为了实现上述目标,通常会采用集群和分布式计算的技术方案。例如,在一个分布式系统中,为了提高系统的可用性和性能,通常会采用集群技术来部署关键组件,如Web服务器、数据库和缓存等。集群技术主要用于解决单点故障问题,提高系统的可靠性和可用性,同时也能通过负载均衡来提升系统的处理能力。

TracyCoder的博客 1785

携程的 Dubbo 之路

本篇文章整理自董艺荃在 Dubbo 社区开发者日上海站的演讲。缘起携程当初为什么要引入 Dubbo 呢?实际上从 2013 年底起,携程内主要使用的就是基于 HTTP 协...

阿里巴巴中间件 520

Dubbo基础及原理机制

Dubbo是 阿里巴巴公司开源的一个高性能RPC 分布式服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成,现已成为 Apache 基金会孵化项目

wender的专栏 4万+

注意dubbo和linux系统中JDK版本的关系

在黑马32期视频中的dubbo-admin.war和JDK8及后面的版本是不兼容的,导致的结果就是在linux系统中部署了dubbo-admin后无法访问到,只能访问到tomcat的界面.

weixin_43102313的博客 1063

springboot整合dubbo3 及其中遇到的坑

之前以及了解过了springboot cloud 微服务的一系列框架,其中dubbo在3之前一直作为一款优秀的rpc框架存在(对标spring cloud中的feign组件),为此duboo3出以后,dubbo也逐渐变成了一个微服务整合平台,目前我进行学习的是个时候遇到很多坑dubbo x springboot 官方开发文档。

qq_55272229的博客 2488

细述dubbo2升级到dubbo3过程中踩过的坑

dubbo 踩坑分享,消费者中建立了太多DubboClientHandler 线程,dubbo3.0 不能优雅停机,dubbo3.0 服务端超时抛NPE异常,dubbo one way 配置。

tangpengtao的专栏 2491

Dubbo 3.0.0 王者归来,你确定不学习下?

Dubbo 简介 如果你还不知道什么是 Dubbo,先来一波扫盲: Apache Dubbo 是一款高性能、轻量级的开源 Java 服务框架 Dubbo 的 6 大特性: 1、面向接口代理的高性能 RPC 调用; 2、服务自动注册与发现; 3、智能负载均衡策略; 4、高度可扩展能力; 5、运行期流量调度; 6、可视化的服务治理与运维; Dubbo 架构图: 再来回顾下 Dubbo 的发展史: 2011/10/27: 阿里巴巴巴宣布 Dubbo 开源。 2012/10/23: 发布最后一个版本 2.5.3.

weixin_46872189的博客 785

Dubbo应用可观测性升级指南与踩坑记录

应用从dubbo-3.1.*升级到dubbo-*:3.2.*最新稳定版本,提升JDK-17、应用的可观测性、GraalVM原生镜像编译。 1. dubbo版本发布说明 2. 应用修改点 3. 踩过的坑

简放视野的专栏 3709

dubbo升级至2.7.15遇到的问题

由于公司dubbo封装在其他jar包里面,最开始只是升级了boot,ichannel-dubbo,integration-dubbo这三个包结果Java导致一直报the import org.apache cannot be resolved,后来发现其父包ifs-dubbo和ifs-bom没有升级,无法引用进来,这两个升级之后又发现父包bootstrap没升级,全部升级完之后,修改了报错的Java文件工程终于没有报错了,但是无法启动tomcat了,目前还在解决,暂时记录下之前遇到的问题。

m0_67391683的博客 647

访问数据库缓存都不存在的数据 dubbo 超时重试 导致provider数倍压力

Dubbo超时机制导致的雪崩连接2014-11-09  categories:资料  author:iigadmin来源:http://www.taobaotest.com/blogs/2535BUG作者:许晓Bug标题:Dubbo超时机制导致的雪崩连接​Bug影响:Dubbo服务提供者出现无法获取Dubbo服务处理线程异常,后端DB爆出拿不到数据库连接池,导致前端响应时间异常飙高,系统处理能力下...

zqz_zqz的博客 788
上一篇: 沙龙回顾 | 大数据与人工智能,含部分PPT和视频
下一篇: 干货 | 千人千面营销系统在携程金融支付的实践
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值