Dubbo入门篇

dubbo官网,https://cn.dubbo.apache.org/zh-cn/

dubbo官方文档,https://cn.dubbo.apache.org/zh-cn/overview/home/

1. 概述

官方介绍,是一款云原生微服务开发框架,构建具备内置 RPC、流量管控、安全、可观测能力的应用,支持Kubernetes和VM部署环境。

个人理解,dubbo最开始的定位就是一款rpc框架,当然现在已经发展更加全面,朝着spring cloud 微服务全生态的方向发展,dubbo更侧重于rpc功能,而其他的功能,负载均衡,服务超时重试,服务容错,服务降级,服务版本管理都是对于rpc功能的扩展。

2. 快速使用

dubbo + zookeeper 快速使用

参考文档,https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/service-discovery/zookeeper/

dubbo 服务注册模式是有两种第一种是基于接口,一种是基于应用的。为了兼容之前的版本,默认值为all

register-mode: instance # 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all,默认值为 all,未来版本将切换默认值为 instance

分为三个module,公共的接口服务,生产者,消费者。

大致调用流程就是,导入依赖,生产者和消费者通过@EnableDubbo分别开启dubbo

生产者先注册到zookeeper,通过@DubboService注解,使得应用与接口映射

消费者也注册到zookeeper,通过@DubboReference注解注入生产者的实例,从而调用具体功能。

注意,公共的接口服务只是提供接口,具体实现在生产者,只是为了实现生产者和消费者共用

这点和OpenFeign不一样,feign的接口服务,需要指定对应的生产者

@FeignClient(value="producer-serv", path = "/producer"
//        ,fallback = ProducerServiceFallback.class
//        ,fallbackFactory = ProducerServiceFallbackFactory.class
)
public interface ProducerService {
​
    @GetMapping("/addPrefix")
    public String addPrefix(@RequestParam("name") String name);
​
}

2.1 导入依赖

生产者和消费者都导入相关依赖

这是高版本使用

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>3.3.0</version>
</dependency>
<!-- 仅当 Zookeeper Server 版本是 3.4.x 及以下时,使用此依赖 -->
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-zookeeper-spring-boot-starter</artifactId>
    <version>3.3.0</version>
</dependency>
<!-- 仅当 Zookeeper Server 版本是 3.5.x 及以上时,使用此依赖
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-zookeeper-curator5-spring-boot-starter</artifactId>
    <version>3.3.0</version>
</dependency>
-->

或者使用下面的配置,注意低版本需要自己维护duboo与zookeeper版本

    <dependencies>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        
        <!-- rpc协议-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-rpc-dubbo</artifactId>
        </dependency>
​
        <!-- zookeeper注册-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-zookeeper</artifactId>
        </dependency>
    </dependencies>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>3.3.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2.2 公共的接口服务

接口代码

public interface IProductInfoService {
​
    ProductInfoVO getProductInfo(Integer productId);
​
}

2.3 生产者代码以及配置

server:
  port: 8081
​
dubbo:
  application:
    name: dubbo3-producer-serv #应用名称,要求不重复
  registry:
    address: zookeeper://192.168.137.140:2181?backup=192.168.137.139:2181 #注册中心地址
    register-mode: instance # 新用户请设置此值,表示启用应用级服务发现,可选值 interface、instance、all,默认值为 all,未来版本将切换默认值为 instance
#    username: root
#    password: 123456
  protocol:
    name: dubbo  #rpc协议
#    port: 20880  #rpc端口
    port: -1  #rpc端口

代码,@EnableDubbo开启dubbo

@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.wz.producer")
public class ProducerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProducerApplication.class, args);
    }
}

注意这个IProductInfoService是接口服务中的

​
@DubboService(version = "1.0.0")
public class ProductInfoServiceImpl implements IProductInfoService {
​
    @Override
    public ProductInfoVO getProductInfo(Integer productId) {
        ProductInfoVO productInfoVO = new ProductInfoVO();
​
        BeanUtils.copyProperties(getProductInfoMapper(productId), productInfoVO);
​
        return productInfoVO;
    }
​
    private ProductInfo getProductInfoMapper(Integer productId) {
        ProductInfo productInfo = new ProductInfo();
        productInfo.setProductId(productId);
        productInfo.setProductName("产品1");
​
        return productInfo;
    }
}
​

2.4 消费者代码以及配置

server:
  port: 8080
  servlet:
    context-path: /consumer
​
dubbo:
  application:
    name: dubbo3-consumer-serv #应用名称
    qos-port: 22223 # 解决org.apache.dubbo.qos.server.QosBindException: qos-server can not bind localhost:22222 问题
​
  registry:
    address: zookeeper://192.168.137.140:2181?backup=192.168.137.139:2181 #注册中心地址
#    username: root
#    password: 123456
  consumer:
    check: false #启动时检查
    timeout: 30000 #rpc调用的超时时间
    retries: 2 #调用失败后的重试次数

代码,@EnableDubbo开启dubbo代码,

@SpringBootApplication
@EnableDubbo(scanBasePackages = "com.wz.consumer")
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

@DubboReference(version = "1.0.0") 指定版本号,注入的IProductInfoService也是接口服务中的

@Service
public class OrderInfoServiceImpl implements IOrderInfoService {
​
    @DubboReference(version = "1.0.0")
    private IProductInfoService productInfoService;
​
    @Override
    public OrderInfoVO getOrderInfo(Integer orderId) {
​
        OrderInfo orderInfo = getOrderInfoMapper(orderId);
        OrderInfoVO orderInfoVO = new OrderInfoVO();
        BeanUtils.copyProperties(orderInfo, orderInfoVO);
​
        // 根据产品id获取产品信息
        ProductInfoVO productInfoVO = productInfoService.getProductInfo(orderInfo.getProductId());
        BeanUtils.copyProperties(productInfoVO, orderInfoVO);
​
        return orderInfoVO;
    }
​
    // 模拟mapper层的数据
    private OrderInfo getOrderInfoMapper(Integer orderId) {
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setOrderId(orderId);
        orderInfo.setProductId(1);
​
        return  orderInfo;
    }
​
}

controller层代码

@RestController
public class OrderInfoController {
    
    @Resource
    private IOrderInfoService orderInfoService;
​
    @GetMapping("/getOrderInfo")
    public OrderInfoVO getOrderInfo(@RequestParam(required = true, value = "orderId") Integer orderId) {
        return orderInfoService.getOrderInfo(orderId);
    }
}

3. 服务治理功能

参考链接,https://blog.csdn.net/weixin_45404884/article/details/137697450

4. 支持协议

5. 面试