1.Dubbo高级特性-序列化
-
两个机器传输数据,如何传输Java对象
-
Serializable -
dubbo内部已经将序列化和反序列化的过程内部封装了,我们主需要在定义pojo类时实现Serializable接口即可 -
一般会定义一个公共的pojo模块,让生产者和消费者都依赖该模块.
2.Dubbo高级特性-地址缓存
-
注册中心挂了,服务是否可以正常访问
-
可以,因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心. -
当服务提供者地址发生变化时,注册中心会通知服务消费者.
3.Dubbo高级特性-超时
-
服务消费者在调用服务提供者的是否发生了阻塞,等待的情形,这个时候,服务消费者会一直等待下去. -
在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩. -
dubbo利用超时机制来解决这个问题设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接 -
使用timeout属性配置超时时间,默认1000,单位毫秒.
?@Service(timeout = 1000,retries = 2)@Reference(timeout = 1000)
4.Dubbo高级特性-重试
-
设置了超时时间,在这个时间段内,无法完成服务访问,则自动断开连接 -
如果出现网络抖动,则这一次请求就会失败 -
dubbo提供了重试机制来避免类似问题的发生 -
通过retries属性来设置重试次数,默认为两次.//一共请求三次
5.Dubbo高级特性-多版本
-
灰度发布 : 当出现新功能时,会让一部分用户先使用新功能,用户反馈没有问题时,再将所有用户迁移至新的功能. -
dubbo中使用version属性来设置和调用统一接口的不同版本.
服务提供方
@Service(timeout = 3000,retries = 0,version = "v1.0")
//or
@Service(timeout = 3000,retries = 0,version = "v2.0")
服务消费方
@Reference(version = "v2.0")
6.Dubbo高级特性-负载均衡
?
6.1 负载均衡策略-Random
@Service(weight = 100)
@Reference(loadbalance = "random") //在AbstractLoadBalance的实现类中进行查找
6.2 负载均衡策略-RoundRobin
@Reference(loadbalance = "roundrobin") //在AbstractLoadBalance的实现类中进行查找
6.3 负载均衡策略-LeastActive
6.4 负载均衡测录-ConsistentHash
7.Dubbo高级特性-集群容错
7.1 集群容错模式-Failover Cluster
-
失败重试.默认值.当出现失败,重试其他服务器,默认重试2次,使用retries配置,一般用于读操作.
@Reference(cluster = "failover") //在Cluster的实现类中去找
7.2 集群容错模式-Failfast Cluster
7.3 集群容错模式-Failsafe Cluster
7.4 集群容错模式-Failback Cluster
7.5 集群容错模式-Forking Cluster
7.6集群容错模式-Broadcast Cluster
8.Dubbo高级特性-服务降级
8.1 mock=force:return null
表示消费方对该服务的方法调用都直接返回null值,不乏其远程调用.用来屏蔽不重要服务不可用时对调用方的影响
@Reference(mock = "force:return null" ) //不再去调用远程服务了
8.2 mock=fail:return null
表示消费方对该服务的方法调用在失败后,再返回null值,不抛异常.用来容忍不重要服务不稳定时对调用方的影响.
9. SpringBoot整合Dubbo,demo
9.1 interface-api
?
POM
<dependencies>
<!--springboot starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--dubbo-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
9.2 my-springboot-user-service(provider)
UserServiceImpl
@Service //spring
@com.alibaba.dubbo.config.annotation.Service(timeout = 3000,retries = 2,weight = 10) //alibaba dubbo
public class UserServiceImpl implements UserService {
@Override
public User selectUserById(int id) {
System.out.println("权重为2的被访问");
User user = new User();
user.setId(1);
user.setName("wuweinan");
user.setAge(23);
return user;
}
}
-
@Service //Spring 注入IOC容器 -
@com.alibaba.dubbo.config.annotation.Service(timeout = 3000,retries = 2,weight = 10) //alibaba dubbo 对外提供服务
Application
@SpringBootApplication
@EnableDubbo
public class MySpringbootUserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringbootUserServiceApplication.class, args);
}
}
application.yml
server:
port: 8080
dubbo:
application:
name: dubbo-user
registry:
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
POM
<dependencies>
<!--公共接口-->
<dependency>
<groupId>com.nanoswarm</groupId>
<artifactId>my-interface-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
9.3 my-meeting-consumer(consumer)
?MeetingServcieImpl
@Service
public class MeetingServiceImpl implements MeetingService {
@Reference(loadbalance = "random")
private UserService userService;
@Override
public MeetingPublish selectMeetingByMeetingCode(String meetingCode) {
MeetingPublish m = new MeetingPublish();
m.setId(1);
m.setMeetingCode(meetingCode);
m.setName("this is the meetingName");
m.setUid(2);
//TODO dubbo远程调用
User user = userService.selectUserById(1);
System.out.println(user);
return m;
}
}
Application
@EnableDubbo
@SpringBootApplication
public class MyMeetingConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(MyMeetingConsumerApplication.class, args);
}
}
application.yml
server:
port: 8081
dubbo:
application:
name: dubbo-meeting
registry:
address: zookeeper://localhost:2181
POM
<dependencies>
<dependency>
<groupId>com.nanoswarm</groupId>
<artifactId>my-interface-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
|