dubbo常见的面试题

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)]:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次数据统计到监控中心。

3zookeeper宕机与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=true

4.运行duubo-admin(在项目的target目录下)
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

5.访问localhost:7001(当前端口是在dubbo-admin项目配置文件中的端口)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值