Dubbo

  • 注意
    当启动服务时,该服务会占用本机一个端口号,故在一台电脑启动多个服务时需要在配置文件中更占用本机的端口号
<!--服务占用本机的端口-当本机启动多个服务时须保持不同-->
<dubbo:protocol port=""/>
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-service"/>
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.23.129:2181" timeout="250000"/>
<!--3.配置dubbo包扫描,注解注册服务-->
<!-- <dubbo:annotation package="com.yh1.impl" />-->
<!--3.2xml配置方式注册服务,类上不需要注解-->
<dubbo:service interface="com.yh.ours.UserService" ref="demoService"/>
<bean id="demoService" class="com.yh1.impl.UserServiceImpl"/>

序列化

查询出数据后返回给消费者时所执行的便是序列化

  • 作用:用于不同机器间传输对象的转换,将对象序列化为 流数据进行传输
  • 被序列化的对象类必须实现序列化接口Serializable
  • 接受到流数据后,反序列化为java对象
  • 序列化和反序列化两者皆需要用到对象类,故定义在一个独立模块中,让两者依赖它—>类似于公共接口模块
  • 即domain/pojo实体类皆需要实现接口Serializable且放在独立模块来作为资源被依赖
<groupId>org.yh</groupId>
<artifactId>debbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--被依赖资源-->
<dependency>
<groupId>org.yh</groupId>
<artifactId>dubbo-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

序列化和反序列化操作dubbo已经封装好,只需让pojo类实现接口即可

eg:

//必须实现Serializable
//一个实体类用于 模仿序列化和反序列化操作
public class User implements Serializable {
int id;
String name; public User() {
} public User(int id, String name) {
this.id = id;
this.name = name;
}
//省略get和set方法

Cotroller代码

 @RequestMapping("/find.do")
public User find(int id){
return userService.findById(id);
}

地址缓存

问:注册中心挂了,服务是否可以正常访问?
答:可以,当第一次访问后,会将服务地址缓存至本地
但是当服务的地址变了以后就不行了,需要重新访问注册中心获取

超时和重试

超时

问:消费者创建线程调用提供者服务,如果调用失败或者提供者查询时间过长或挂了,则消费者将一直等待

  • 可以在服务者方法中使用线程沉睡来模拟上述情况
@Service
public class UserServiceImpl implements UserService {
@Override
public User findById(int id) {
//此处让服务睡5秒,用来演示超时操作
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
User user=new User(1,"jack");
return user;
}
}

解决:设置timeout属性值来控制超时时间

  1. 在消费方@reference注解中设置
  2. 在提供者@service注解中设置
  3. 在配置文件中配置
<!--2.配置注册中心的地址-->
<dubbo:registry address="zookeeper://192.168.23.129:2181" timeout="250000"/>
  • 建议配置在服务提供方@Service上
  • 超时时消费者报错如下

重试

问题:出现了网络抖动网突然断了一下,断了3s超时时间设置是1s,则这一次请求就会失败,则会重新发送请求,一共发送3次
解决1:通过retries属性类设置重试次数。默认为2

多版本

灰度发布:新功能时,让一部分用户使用新版本,稳定后让全部用户使用新的版本。


使用:使用version属性来设置和调用同一个接口的不同版本
eg:公共接口模块中的UserService接口在服务提供者中有俩实现类UserServiceImpl1和UserServiceImpl2
在服务提供者的UserServiceImpl1@Service(version=“v1.0”)中设置version和UserServiceImpl2@Service(version=“v2.0”)
在消费者的@Reference(version=“v1.0 or v2.0”)中设置version来选择使用哪个版本

注:此处检验失败,原因未知

负载均衡

适用于集群环境,相同的服务部署在多台机器上
模拟步骤:
1.在服务提供者的@Service注解中添加weight属性,配置权重(可在服务内打印一句话来区别不同的服务)
2.启动该服务tomcat7:run
3.更改三个端口号后继续1,2,3步骤,直至启动三个服务器为止,保持权重不同
4.在消费者的@reference注解中配置loadbalance属性(共有四个值下面有)
5.启动服务,开始模拟

  • 负载均衡策略(4种):来解决访问哪个机器
    可以更改同一个服务的tomcat,dubbo的qos,本机三个的端口来模拟同一服务部署在多台机器
1.
<!--tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8000</port>
<path>/</path>
</configuration>
</plugin>
2.
<dubbo:protocol port="20881"/>
3.
<!--dubbo的配置-->
<!--1.配置项目的名称,唯一-->
<dubbo:application name="dubbo-service">
<!--dubbo的pos服务一个服务会启动一次,故一台机器时不同服务需要更改-->
<dubbo:parameter key="qos.port" value="33331"/>
</dubbo:application>
  • 权重weight是服务提供者@Service注解的配置属性
  1. Random按权重weight属性随机。按权重设置随机概率
  2. RoundRobin按权重轮询
  3. LeastActice最少活跃调用数,相同则随机–>使用机器中处理请求最快的的机器
  4. ConsisitentHash:一致性Hash,相同参数的请求总是发到同一提供者

  • 在消费者的@Reference注解中使用loadbalance属性(该属性值为loadbalance抽象类的四种实现类属性即上的小写)来设置采用上述哪种负载均衡策略

集群容错

问题: 消费者调用集群中某一机器出错了,该如何处理?

  • 集群容错模式:
  1. **Failover Cluster:**失败重试。默认值。当出现失败,重试其它服务器,默认重试2次,使用retries配置。–一般用于读操作
  2. **Failfast Cluster

    Dubbo之高级特性的更多相关文章

    1. Dubbo高级特性实践-泛化调用

      引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

    2. Dubbo 高级特性实践-泛化调用

      引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

    3. ActiveMQ中的Destination高级特性(一)

      ---------------------------------------------------------------------------------------- Destination ...

    4. Python3学习(二)-递归函数、高级特性、切片

      ##import sys ##sys.setrecursionlimit(1000) ###关键字参数(**关键字参数名) ###与可变参数不同的是,关键字参数可以在调用函数时,传入带有参数名的参数, ...

    5. 云端卫士实战录 | Java高级特性之多线程

      <实战录>导语 一转眼作为一名Java开发者已经四年多时间了,说长不长说短不短,对于java的感情还是比较深的,主要嘛毕竟它给了我饭吃.哈哈,开个玩笑.今天我想借此机会来和大家聊聊Java ...

    6. javascript高级特性

      01_javascript相关内容02_函数_Arguments对象03_函数_变量的作用域04_函数_特殊函数05_闭包_作用域链&闭包06_闭包_循环中的闭包07_对象_定义普通对象08_ ...

    7. Visual Studio 2015 速递(4)——高级特性之移动开发

      系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

    8. Android TextView高级特性使用

      TextView一般都是用来显示一段文本,这里说的高级特性主要是一些我们平常不太常用的属性.包括文字阴影.自定义字体.html嵌入多格式.字体加粗.插入图片.这些特性平时开发APP的时候,可能一般使用 ...

    9. Python的高级特性8:你真的了解类,对象,实例,方法吗

      Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...

    随机推荐

    1. 【函数分享】每日PHP函数分享(2021-2-5)

      array_column - 返回数组中指定的一列 说明: array_column ( array $input , mixed $column_key , mixed $index_key = n ...

    2. 使用 with as 优化SQL

      当我们书写一些结构相对复杂的SQL语句时,可能某个子查询在多个层级多个地方存在重复使用的情况,这个时候我们可以使用 with as 语句将其独立出来,极大提高SQL可读性,简化SQL~ with as ...

    3. 2019牛客暑期多校训练营(第二场) H-Second Large Rectangle(单调栈)

      题意:给出由01组成的矩阵,求求全是1的次大子矩阵. 思路: 单调栈 全是1的最大子矩阵的变形,不能直接把所有的面积存起来然后排序取第二大的,因为次大子矩阵可能在最大子矩阵里面,比如: 1 0 0 1 ...

    4. Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final)【ABCDF】

      比赛链接:https://codeforces.com/contest/1443 A. Kids Seating 题意 构造一个大小为 \(n\) 的数组使得任意两个数既不互质也不相互整除,要求所有数 ...

    5. 高斯消元初步(Gauss算法)

      Gauss算法,称为高斯消元算法,用来解决n元一次方程,在解决线性方程问题起着重要作用. 简述 运用高斯消元的方法,我们可以在O(n3)的时间求出n元线性方程,但是由于时间复杂度的原因,请注意题目数据 ...

    6. hdu 5316 Magician 线段树维护最大值

      题目链接:Magician 题意: 给你一个长度为n的序列v,你需要对这个序列进行m次操作,操作一共有两种,输入格式为 type a b 1.如果type==0,你就需要输出[a,b]区间内的美丽序列 ...

    7. Complete the sequence! POJ - 1398 差分方法找数列规律

      参考链接:http://rchardx.is-programmer.com/posts/16142.html vj题目链接:https://vjudge.net/contest/273000#stat ...

    8. 牛客练习赛63 C.牛牛的揠苗助长

      题意:有一个长度为\(n\)的数组,从第一天开始,第\(i\)天可以使\(i\)位置上的数\(+1\),当\(i=n\)时,下次从\(i=1\)再开始,另外,在每天结束时,你可以使任意一个位置上的数\ ...

    9. URAL - 1635 哈希区间(或者不哈希)+dp

      题意: 演队在口试中非常不幸.在42道考题中,他恰好没有准备最后一道题,而刚好被问到的正是那道题.演队坐在教授面前,一句话也说不出来.但教授心情很好,给了演队最后一次通过考试的机会.他让这个可怜的学生 ...

    10. Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本

      Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本 前言 序言 再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点. 适合阅读人群 J ...