1. 配置说明

1.1 启动时检查

启动时会在注册中心检查依赖的服务是否可用,不可用时会抛出异常

在消费方编写初始化容器的main方法启动(tomcat启动方式,必须访问一次action才能初始化

spring)

public class Test {
public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("classpath:spring/spring.xml");
System.in.read();
}
}
<!--默认是true:抛异常;false:不抛异常-->
<dubbo:consumer check="false" />

系统级别日志,需要配合log4j才输出,在resources下添加log4j.properties,内容如下

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %m%nlog4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=dubbo.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l    %m%nlog4j.rootLogger=error, stdout,file

1.2 超时时间

由于网络或服务端不可靠,会导致调用过程中出现不确定的阻塞状态(超时) 为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间

在服务提供者添加如下配置

<!--设置超时时间为2秒,默认为1秒-->
<dubbo:provider timeout="2000"/>

可以将服务实现HelloServiceImpl.java中加入模拟的网络延迟进行测试

@Service
public class HelloServiceImpl   implements HelloService { public String sayHello(String name) {
try {
Thread.sleep(3000);
}catch (Exception e){ e.printStackTrace();
}
return "Hello,"+name+"!!!!!";
}
}

超时设置2秒,而模拟的网络延迟有3秒,超出时限,报错!

配置原则

dubbo推荐在Provider上尽量多配置Consumer端属性:

  1. 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试 次数,等等
  2. 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可 以作消费者的缺省值

1.3 重试次数

当出现失败,自动切换并重试其它服务器,dubbo重试的缺省值是2次,我们可以自行设置 在provider提供方配置:

<!-- 消费方连接第1次不算,再来重试3次,总共重试4次 --><dubbo:provider timeout="2000" retries="3"/>
@Service
public class HelloServiceImpl   implements HelloService { public String sayHello(String name) {
System.out.println("=============被调用 1 次===============");
try {
Thread.sleep(3000);
}catch (Exception e){ e.printStackTrace();
}
return "Hello,"+name+"!!!!!";
}
}

并不是所有的方法都适合设置重试次数

幂等方法:适合(当参数一样,无论执行多少次,结果是一样的,例如:查询,修改) 非幂等方法:不适合(当参数一样,执行结果不一样,例如:删除,添加)

单独设置某个方法

提供方接口添加sayNo()方法并实现

public interface HelloService { String sayHello( String name ); String sayNo();
}
@Service
public class HelloServiceImpl   implements HelloService { public String sayHello(String name) {
System.out.println("=============hello被调用一次
===============");
try {
Thread.sleep(3000);
}catch (Exception e){ e.printStackTrace();
}
return "Hello,"+name+"!!!!!";
}public String sayNo() {
System.out.println("-------no被调用一次 ");
return "no!";
}
}

消费方接口添加sayNo()方法声明

public interface HelloService { String sayHello( String name ); String sayNo();
}

消费方controller


@Controller
public class HelloAction {//@Reference 此注解已经在xml文件中被<dubbo:reference>顶替,所以自动注入
即可
@Autowired
private HelloService helloService;@GetMapping("hello") @ResponseBody
public String sayHi(String name){ return helloService.sayHello(name);
}@GetMapping("no") @ResponseBody public String no(){return helloService.sayNo();
}
}

消费方配置方法重试次数

<dubbo:reference interface="service.HelloService" id="helloService">
<dubbo:method name="sayHello" retries="3"/>
<dubbo:method name="sayNo" retries="0"/> <!-- 不重试 -->
</dubbo:reference>

1.4 多版本

一个接口,多个(版本的)实现类,可以使用定义版本的方式引入为HelloService接口定义两个实现类,提供者修改配置

<dubbo:service interface="service.HelloService" class="service.impl.HelloServiceImpl01"  version="1.0.0"/>
<dubbo:service interface="service.HelloService" class="service.impl.HelloServiceImpl02"  version="2.0.0"/>

消费者就可以根据version的版本,选择具体的服务版本

<dubbo:reference interface="service.HelloService" id="helloService" version="2.0.0">
<dubbo:method name="sayHello" retries="3"/>
<dubbo:method name="sayNo" retries="0"/>
</dubbo:reference>

注意:消费者的控制层要改为自动注入,因为@Reference注解和 <dubbo:reference>在这里冲突

@Controller
public class HelloAction { @Autowired
private HelloService helloService;
}

当消费者的版本修改为 version="*",那么就会随机调用服务提供者的版本

-------1.0被调用一次-------

-------2.0被调用一次-------

-------1.0被调用一次-------

-------1.0被调用一次-------

-------1.0被调用一次-------

-------2.0被调用一次-------

1.5 本地存根

目前我们的分布式架构搭建起来有一个严重的问题,就是所有的操作全都是  消费者发起,由服务提供者执行

消费者动动嘴皮子却什么活都不干,这样会让提供者很累,例如简单的参数验证,消费者完全能够  胜任,把合法的参数再发送给提供者执行,效率高了,提供者也没那么累了

例如:去房产局办理房屋过户,请带好自己的证件和资料,如果什么都不带,那么办理过户手续会  很麻烦,得先调查你有什么贷款,有没有抵押,不动产证是不是你本人,复印资料等操作。一天肯  定办不完。明天还要来。如果你能提前将这些东西准备好,办理过户,1个小时足矣,这就是“房产 中介办事效率高的原因”

话不多说,先在消费者处理一些业务逻辑,再调用提供者的过程,就是“本地存根” 代码实现肯定在 消费者,创建一个HelloServiceStub类并且实现HelloService接口注意:必须使用构造方法的方式注入

public class HelloServiceStub implements HelloService {private HelloService helloService;
// 注入HelloService
public HelloServiceStub(HelloService helloService) { this.helloService = helloService;
}public String sayHello(String name) { System.out.println("本地存根数据验证。。。"); if(!StringUtils.isEmpty(name)){
return helloService.sayHello(name);
}
return "i am sorry!";
}public String sayNo() {
return helloService.sayNo();
}
}

修改消费者配置

<dubbo:reference interface="service.HelloService" id="helloService" version="1.0.0" stub="service.impl.HelloServiceStub">
<dubbo:method name="sayHello" retries="3"/>
<dubbo:method name="sayNo" retries="0"/>
</dubbo:reference>

2. 负载均衡策略

负载均衡(Load Balance), 其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作任务。

简单的说,好多台服务器,不能总是让一台服务器干活,应该“雨露均沾” dubbo一共提供4种策略,缺省为 random 随机分配调用

修改提供者配置并启动3个提供者,让消费者对其进行访问

tomcat端口8001,8002,8003

provider端口20881,20882,20883

<dubbo:provider timeout="2000" retries="3" port="20881"/>

HelloServiceImpl01类,服务器1,服务器2,服务器3

public String sayNo() {
System.out.println("----服务器1---1.0被调用一次    ");
return "no!";
}

启动consumer进行测试

消费方修改权重

<dubbo:reference loadbalance="roundrobin" interface="service.HelloService" id="helloService" version="2.0.0" stub="stub.HelloServiceStub">
<dubbo:method name="sayHello" retries="3"/>
<dubbo:method name="sayNo" retries="0"/>
</dubbo:reference>

最好使用管理端修改权重

3. 高可用

3.1 zookeeper宕机

zookeeper注册中心宕机,还可以消费dubbo暴露的服务

监控中心宕掉不影响使用,只是丢失部分采样数据

数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务注册中心对等集群,任意一台宕掉后,将自动切换到另一台

注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯

服务提供者无状态,任意一台宕掉后,不影响使用

服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复 测试:

正常发出请求

关闭zookeeper:./zkServer.sh stop

消费者仍然可以正常消费

4. 服务降级

壁虎遇到危险会自动脱落尾巴,目的是损失不重要的东西,保住重要的

服务降级,就是根据实际的情况和流量,对一些服务有策略的停止或换种简单的方式处理,从而释  放服务器的资源来保证核心业务的正常运行

4.1 为什么要服务降级

而为什么要使用服务降级,这是防止分布式服务发生雪崩效应

什么是雪崩?就是蝴蝶效应,当一个请求发生超时,一直等待着服务响应,那么在高并发情况下,  很多请求都是因为这样一直等着响应,直到服务资源耗尽产生宕机,而宕机之后会导致分布式其他  服务调用该宕机的服务也会出现资源耗尽宕机,这样下去将导致整个分布式服务都瘫痪,这就是雪  崩。

4.2 服务降级实现方式

管理控制台配置服务降级:屏蔽容错

屏蔽:mock=force:return+null 表示消费方对该服务的方法调用都 直接返回 null ,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。

容错:mock=fail:return+null 表示消费方对该服务的方法调用在 失败后,再返回 null ,不抛异常。用来容忍不重要服务不稳定时对调用方的影响

整合MyBatis实现用户注册

具体案例见github

节选自拉钩教育JAVA系列课程

Dubbo综合实战演练相关推荐

  1. iptables防火墙(二)

    防伪码:要输就输给追求,要嫁就嫁给幸福 第十一章 iptables防火墙(二) 前言:本章我们来学习使用iptables做网关服务器,并使用NAT功能共享上网以及发布服务器,和我们之前学过的nat原理 ...

  2. 你所忽略的Linux系统安全及应用(最全面)

    防伪码:千磨万击还坚劲,任尔东西南北风  第八章 系统安全及应用 前言:虽然说linux系统安全,高效,稳定,但如果平时不注意安全优化,也不会安全.本章将介绍账户安全,系统引导和登录的安全,以及弱口令 ...

  3. 《安富莱嵌入式周报》第312期:开源磁场照相机,仿生神经元PCB,开源无线耳机,手机系统PalmOS移植到各种单片机,开放系统组装协议OSAP

    周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Pow ...

  4. 世恒易语言百集教程在线观看.非常好的易语言入门教程哦

    世恒易语言百集教程.非常好的易语言教程.唯一在线可以看的地址是biliblili.一般都要下载的啊.并且是exe格式.不方便观看.这套可以在线看. 世恒易语言百集教程在线观看 点击在线观看 https ...

  5. 如何增强无人机图传距离_知识贴丨浅谈多旋翼无人机在消防应急系统中的应用...

    2019年2月26日,由应急管理部上海消防研究所举办的无人机系统消防应用综合实战演练在上海市消防总队奉贤培训基地举行,现场汇聚了来自全国各地消防总队专家.消防装备领域技术专家.消防研究所科研人员和无人 ...

  6. SSM综合项目实战(TTSC) -- day02 Dubbo注册中心,通用Mapper,分页插件

    一.Dubbo的连接方式 1.连接方式介绍 使用Dubbo进行远程调用实现服务交互,它支持多种协议,如Hessian.HTTP.RMI.Memcached.Redis等等.由于Dubbo将这些协议的实 ...

  7. Dubbo 18 问

    dubbo是什么 dubbo是一个分布式框架,远程服务调用的分布式框架,其核心部分包含: 集群容错:提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集 ...

  8. Spring Cloud Alibaba 综合应用:Seata 分布式事务实战教程

    在前面的章节,我们分别讲解了 Spring Cloud Alibaba 中主要的组成部分,其中包括:注册中心与配置管理组件 Nacos.Ribbon 客户端负载均衡.OpenFeign 与 Dubbo ...

  9. 孰优孰劣?Dubbo VS Spring Cloud性能测试大对决!

    最近我们试图从Dubbo迁移到Spring Cloud.为此对二者分别进行了性能测试.为了得出数据量不同的情况下的二者的性能表现,我们分别准备了一个25个属性pojo对象和一个50个属性的pojo对象 ...

最新文章

  1. 误操作数据库的一个方法
  2. pytorch安装问题:路径不对导致no moduled name 'torch'
  3. 第一篇文章,,测试效果,
  4. 2018年第九届省赛C/C++A组第5题——打印图形
  5. TCP通信的客户端代码实现
  6. java读写注册表的两种方式,Preferences与jRegistry
  7. java blockqueue_[Java基础] Java多线程-工具篇-BlockingQueue
  8. 计算机与控制工程学院烟台大学,烟台大学计算机与控制工程学院欢迎大家
  9. linux系统资源管理系统,linux基础4系统资源管理
  10. linux自动ping脚本,linux 自动ping ip的shell脚本
  11. 【原创】Linux学习笔记
  12. 计算机指纹驱动程序,联想笔记本指纹识别驱动安装教程【详解】
  13. wince植入胎压监测_【精】创酷一个月实际用车感受+轻松解决仪表盘失灵问题+胎压监测...
  14. 计算机上有哪些操作系统?
  15. 佛系前端面试题记录--第二周
  16. Mac:was built for newer OSX version (10.15) than being linked (10.14)
  17. Excel中的$是什么意思
  18. 去中心化存储项目终极指南 | Filecoin, Storj 和 PPIO 项目异同(上)
  19. spark outer join push down filter rule(spark 外连接中的下推规则)
  20. 利用android的通知Notification来实现msn的登录状态

热门文章

  1. Zynga中国区总经理田行智:揭秘移动社交游戏
  2. Mac系统Excel 只读文件“启用编辑”解决办法
  3. IM开放平台的客户端接口设计,千牛用了JAR包形式?
  4. 阿里钉钉上线数字化企业操作系统 称能实现千人3秒互换名片
  5. 顺时针打印矩阵 python
  6. 《顺序表和链表之链表》
  7. 机器人编程对计算机有什么帮助吗,小孩学机器人编程有什么用
  8. linux下跑CPU的命令 烤机
  9. linux 磁盘管理 阵列,Linux 磁盘管理~~~~RAID1
  10. 高通量筛选技术加速联合用药研究 | MedChemExpress