1.什么是dubbo?
Dubbo 是一款高性能、轻量级的开源RPC框架,它提供了一下核心功能:面向接口的远程服务调用,集群容错和负载均衡,以及服务自动注册与发现。
2.dubbo中的RPC的原理?
注册中心(Registry)[redʒɪstri]:返回服务提供者地址列表给消费者。
服务提供者(Provider)[prəˈvaɪdə(r)]:向注册中心注册自己提供的服务。
服务消费者(Consumer)[kənˈsjuːmə(r)]: 向注册中心订阅自己所需的服务。
监控中心(Monitor)[ˈmɒnɪtə(r)]:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次数据统计到监控中心。
3、zookeeper宕机与dubbo直连
现象:当注册中心发生宕机,消费者还是能够消费dubbo暴露的服务。
原因:
•监控中心掉线不会影响使用,只是丢失部分采样数据。
•数据库宕机之后,注册中心仍能通过缓存提供服务列表查询,但是不能注册新的服务。
•注册中心等集群,任意一台掉了,能够自动切换到另一台服务上。
•注册中心全都挂了,服务提供者和消费者还是可以通过本地缓存实现通讯。
•服务提供者无状态,任意一台掉了,还是可以由其他的提供者提供服务。
•服务提供者全都挂了,那么消费者就不能使用应用了,并且会无限次地重试等待服务者恢复。
4、负载均衡机制
1. 基于权重的随机负载均衡机制;(随机访问的时候,访问概率等于权重比。)
2. 基于权重的轮询负载均衡机制;(轮询访问的时候,访问概率等于权重比。)
3. 最少活跃数负载均衡机制;(尽可能调用相应速度最快的服务提供者。)
4. 一致性哈希负载均衡机制;(根据消费者的请求信息,映射到相应的提供者。)
5、服务降级
什么是服务降级?
当服务器压力剧增的情况下,根据实际业务情况,对一些服务不处理或换种简单的方式处理,从而释放服务器资源以保证核心业务正常运行;
可以通过服务降级功能临时屏蔽某个出错的非重要服务,并定义降级后的返回策略。
服务降级的策略
• mock = force:return+null 表示消费方对该服务的方法调用直接放回null值,不发起远程调用。用来屏蔽 不重要服务不可用时对调用方的影响。
• mock = fail:return + null 表示消费方对该服务器的方法调用在失败后,再返回null,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
6、集群容错
集群容错模式分为6种:
1. failover [feɪl'əʊvər] cluster ['klʌstə(r)]
失败后自动切换,当出现失败,重试其它的服务器。通常用于读操作,但是重试会带来延迟,可以通过retries=2,来设置重试次数。这是dubbo默认的集群模式。
2. failfast cluster
发起一次调用,失败了就立即报错。通常用于非幂等性的写操作,比如新增记录。
3. failsafe [feɪl'seɪf]] cluster
出现异常的时候,直接忽略。通常用于吸入审计日志等操作。
4. failback [feɪl'bæk]] cluster
后台记录失败请求,定时重发。通常用于消息通知操作。
5. forking cluster
并行调用多个服务器,只要一个成功即可返回。通常用于实时性要求高的读操作,但需要浪费更多的资源。可以通过forks= "2",来设置最大并行数。
6. broadcast['brɔːdkɑːst] cluster
广播调用所有提供者,逐个调用,任意一台报错,则报错。通常用于通知所有服务提供者更新缓存或日志等本地资源信息。进行同步。
集群模式配置
可以分别在提供方和消费者配置集群模式。默认模式是失败自动切换。
<dubbo:service cluster="failsafe"/>
或
<dubbo:reference cluster="failsafe"/>
消费者的ServiceImpl实现如下:
@Reference(loadbalance="random") //引用服务
UserService userService;
//当项目出现容错时则调用hello()返给控制器
@HystrixCommand(fallbackMethod="hello")
@Override
public List<UserAddress> initOrder(String userId) {
// TODO Auto-generated method stub
System.out.println("用户id:"+userId);
//1、查询用户的收货地址
List<UserAddress> addressList = userService.getUserAddressList(userId);
return addressList;
}
public List<UserAddress> hello(String userId) {
// TODO Auto-generated method stub
return Arrays.asList(new UserAddress(10, "测试地址", "1", "测试", "测试", "Y"));
}
提供者的ServiceImpl实现如下:
@Service // dubbo暴露服务
@Component
public class UserServiceImpl implements UserService {@HystrixCommand //远程接口方法添加@HystrixCommand注解
@Override
public List<UserAddress> getUserAddressList(String userId) {
// TODO Auto-generated method stub
System.out.println("UserServiceImpl..3.....");
UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
if (Math.random() > 0.5) {
throw new RuntimeException();
}
return Arrays.asList(address1, address2);
}
启动类如下:
@EnableDubbo(scanBasePackages="com.atguigu.gmall") //开启dubbo注解并扫描包下面的所有注解 作用:暴露服务
@EnableHystrix //开启服务容错
@SpringBootApplication
public class BootUserServiceProviderApplication {public static void main(String[] args) {
SpringApplication.run(BootUserServiceProviderApplication.class, args);
}
}
配置的优先级:消费端——》客户端——》全局配置
7.说说核心的配置有哪些?
dubbo:service/ #暴露服务 ref:指向服务的真正的实现对象
dubbo:reference/ #引用服务
dubbo:protocol/ #指定对外暴露的接口
dubbo:registry/ #指定注册中心的位置
dubbo:application/ #指定当前服务/应用的名字
dubbo:provider/ #统一设置服务提供方的规则
dubbo:consumer/ #配置当前消费者的统一规则
dubbo:method/ #配置服务的超时时间等
##################dubbo提供者的配置文件##################
#1、指定当前服务/应用的名字
dubbo.application.name=user-service-provider# 2、指定注册中心的位置
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper#3、指定通信规则(通信协议?通信端口) 20882当前服务的端口
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881#4、连接监控中心
dubbo.monitor.protocol=registry
#//开启dubbo注解并扫描包下面的所有注解 暴露服务
dubbo.scan.base-packages=com.atguigu.gmall#提供者暴露的端口为
dubbo.protocol.port=20882##################dubbo消费者的配置文件##################
server.port=8081
#1、指定当前服务/应用的名字
dubbo.application.name=boot-order-service-consumer
# 2、指定注册中心的位置
dubbo.registry.address=zookeeper://127.0.0.1:2181
#3、连接监控中心
dubbo.monitor.protocol=registry
1、下载zookeeper
网址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/2、解压zookeeper
解压运行zkServer.cmd ,初次运行会报错,没有zoo.cfg配置文件3、修改zoo.cfg配置文件
将conf下的zoo_sample.cfg复制一份改名为zoo.cfg即可。
注意几个重要位置:
dataDir=./ 临时数据存储的目录(可写相对路径)
clientPort=2181 zookeeper的端口号
修改完成后再次启动zookeeper########监控中心的配置################
1.在网上下载dubbo-admin项目
2.进入目录,修改 src\main\resources\application.properties 指定zookeeper地址
spring.guest.password=guest
dubbo.registry.address=zookeeper://127.0.0.1:2181
3.打包 duubo-admin
mvn clean package -Dmaven.test.skip=true4.运行duubo-admin(在项目的target目录下)
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar5.访问localhost:7001(当前端口是在dubbo-admin项目配置文件中的端口)