- 不同配置覆盖关系
- 属性配置优先级
- 重试与容错处理机制
- 多版本控制
- 本地存根调用
- 负载均衡机制
- 服务降级运用
- 并发与连接控制
- 并发数控制
- 连接数控制
1. 覆盖规则:
配置规则:
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
例如: 服务端超时例子
①服务端增加配置类:
package com.itheima.dubbo.spring.provider.config; import org.apache.dubbo.config.ProviderConfig; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class DubboConfig { @Bean public ProviderConfig registryConfig(){ ProviderConfig config = new ProviderConfig(); //全局超时时间 1s config.setTimeout(1000); //config.setWeight(100); //权重设置,不建议 //config.setLoadbalance("random"); //全局并发数量 //config.setExecutes(100); return config; } }
修改服务端接口实现:设定模拟睡眠时间
public String getOrder(Long orderId) { try { // 休眠1.5秒 Thread.sleep(1500L); } catch (InterruptedException e) { e.printStackTrace(); } return "Get Order Detail, Id: " + orderId + ", serverPort: " + serverPort; }
②验证:
服务端全局超时设为2秒(不触发超时), 消费端方法级别设定超时时间为1秒(触发超时)。
修改调用代码:
@DubboReference(version = "${dubbo.spring.provider.version}", methods = { //设置方法级别的超时时间 @Method(name = "getOrder",timeout = 1000) }) private OrderService orderService;
调用结果, 触发超时,表明消费端配置优先。
属性配置优先级
优先级从高到低:
- JVM -D 参数;
- XML配置(xml,application.properties);
- dubbo.properties默认配置,仅仅作用于以上两者没有配置时。
- 容错机制:
- Failfast Cluster
快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写 *** 作,比如新增记录。 - Failsafe Cluster
失败安全,出现异常时,直接忽略。通常用于写入审计日志等 *** 作。 - Failback Cluster
失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知 *** 作。 - Forking Cluster
并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读 *** 作,但需要浪费更多服务资源。可通过 forks=“2” 来设置最大并行数。 - Broadcast Cluster
广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
- 调整客户端重试次数:
@DubboReference(version = "${dubbo.spring.provider.version}",retries = 3) private OrderService orderService;多版本控制
也就是时候应用会有不同的版本,我们指定用户只能访问哪个版本。
优先级:
-D参数>application.properties>dubbo.properties
本地存根可以理解为一个校验;比如我现在要调用远端服务,但是明明参数格式就有错误,如果还让你成功的去调用远程的服务,那不是浪费资源了,所以在调用远程服务前先调用一次本地服务。
-
实现流程
把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。 -
客户端存根实现:
客户端增加service接口:
package com.itheima.dubbo.spring.stub; import com.itheima.dubbo.spring.api.OrderService; public class OrderServiceStub implements OrderService { //代理对象->Proxy->Remote($Proxy) private final OrderService orderService; public OrderServiceStub(OrderService orderService) { this.orderService = orderService; } @Override public String getOrder(Long orderId) { if(orderId!=null){ //远程调用 return orderService.getOrder(orderId); } return "本地校验不合法...."; } }
- 修改客户端调用配置(让配置的本地存根生效)
@DubboReference(version = "${dubbo.spring.provider.version}", stub = "com.itheima.dubbo.spring.stub.OrderServiceStub") //stub的值就是存根类的全类名 private OrderService orderService;
-
默认负载策略
Dubbo默认采用的是随机负载策略。 -
Dubbo 支持的负载均衡策略
- Random LoadBalance
随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。
2.RoundRobin LoadBalance
轮询,按公约后的权重设置轮询比率。 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。
- LeastActive LoadBalance
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。
- ConsistentHash LoadBalance
一致性 Hash,相同参数的请求总是发到同一提供者。 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
-
服务动态禁用
启动单个服务节点,进入Dubbo Admin, 创建动态配置规则:
将disabled属性设为true, 服务禁用, 可以错误提示:
将disabled属性改为false,恢复正常访问 -
服务降级
在dubboAdmin进行配置即可
实际运用, 会碰到高并发与峰值场景, Dubbo是可以做到并发与连接数控制。
并发数控制服务端控制
① 服务级别:在提供服务的接口实现类上配置
代表服务器端并发执行(或占用线程池线程数)不能超过 10 个。
②方法级别
限制具体的方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个。
客户端控制:
①调用的服务控制:在远程调用的Controller中配置:
代表每客户端并发执行(或占用连接的请求数)不能超过 10 个。
②调用的服务方法控制
服务端连接控制: 在提供服务的接口实现类处配置
新增一个配置类
@Configuration public class DubboConfig { @Bean public ProviderConfig registryConfig(){ ProviderConfig config = new ProviderConfig(); //全局超时时间 1s config.setTimeout(1000); //config.setWeight(100); //权重设置,不建议 //config.setLoadbalance("random"); //全局并发数量 //config.setExecutes(100); //全局连接数量 config.setAccepts(10); return config; } }
表示限制服务器端接受的连接不能超过 10 个。
客户端连接控制:
新增一个配置类:
@Configuration public class DubboConfig { @Bean public ConsumerConfig config(){ ConsumerConfig config = new ConsumerConfig(); config.setTimeout(4000); //负载均衡 //config.setLoadbalance("roundrobin"); //轮询 //config.setLoadbalance("random"); //随机 //config.setLoadbalance("consistenthash"); //Hash //config.setLoadbalance("leastactive"); //平均处理效率最高的节点优先 config.setConnections(2);//最大连接数 return config; } }
限制客户端服务使用连接不能超过 10 个
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)