Dubbo使用

48 阅读2分钟

Dubbo核心概念

image-20251117202312546.png

  • Registry : 注册中心,dubbo支持zookeeper,nacos
  • consumer:服务消费方
  • provider:服务提供方

Dubbo通过分组和版本去唯一定位一个服务。

  • group:分组,区分不同业务
  • version:区分不同版本

Springboot整合Dubbo

Maven依赖

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
​
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.5.0</version>
        </dependency>
​
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

yml配置 : 消费者方,服务方配置相同,消费方也可以提供服务

server:
  port: 9876
dubbo:
  registry:
    address: nacos://192.168.169.223:8848
    parameters:
      username: nacos
      password: nacos
      group: dubbo1 # nacos的分组
      register-consumer-url: true # 消费者也注册到nacos上
  application:
    name: dubbo-consumer-demo
  protocol:
    name: dubbo # 协议类型
    port: 20881 # 协议端口
  consumer:
    check: false  # 关闭所有服务的启动时检查 ,使得即使没有提供方也能启动
ncaos:
  discovery:
    metadata:
      application: dubbo-consumer-demo

配置文件导入导出服务

服务提供方

服务接口

package com.yang;
​
public interface UserService {
​
    void sayHello(String name);
}
​

实现接口

package com.yang;
​
public interface ProviderService {
    String sayHello(String name);
}
​

导出服务配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
​
    <!-- 服务实现Bean -->
    <bean id="userService" class="com.yang.UserServiceImpl" />
    <!-- 服务暴露 : ref引用bean, group:分组,还可以配置version -->
    <dubbo:service interface="com.yang.UserService" ref="userService" group="provider"/></beans>

启动类:指名配置文件

​
@SpringBootApplication
@ImportResource(locations = {"classpath:dubbo-provider.xml","classpath:dubbo-consumer.xml"})
public class provider01App {
     public static void main(String[] args) {
         // 避免启动缓存冲突
         ApplicationHome home = new ApplicationHome(provider01App.class);
         File jarFile = home.getSource();
         String dirPath = jarFile.getParentFile().toString();
         String filePath = dirPath + File.separator + ".dubbo";
         System.out.println(filePath);
         System.setProperty("dubbo.meta.cache.filePath", filePath);
         System.setProperty("dubbo.mapping.cache.filePath",filePath);
​
         SpringApplication.run(provider01App.class, args);
    }
}

服务消费方

引用服务配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
​
    <!-- 服务暴露 -->
    <dubbo:reference interface="com.yang.ProviderService" id="providerService" group="provider"/></beans>

启动类

@SpringBootApplication
@ImportResource(locations = {"classpath:dubbo-provider.xml","classpath:dubbo-consumer.xml"})
@RestController
@RequestMapping("/consumer")
public class Main {
    // 需要和服务提供方一样,边写对应的接口类,方法名称一致,通常来说接口会用一个模块维护,然后引用
    @Autowired
    private ProviderService providerService;
    
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
​
    @GetMapping("/test")
    public void run() {
        String result = providerService.sayHello("dubbo");
        System.out.println(result);
    }
​
}

基于注解开发

消费方装配时使用注解@DubboReference

    // @Reference 用dubbo包也可以
    @DubboReference
    UserService userService;

服务提供方标注接口实现类使用注解@DubboService

// @Service 也可以,使用dubbo提供的即可
@DubboService
public class ProviderServiceImpl implements ProviderService {
    ....
}

启动类使用注解标注使用注解开发@EnableDubbo

@EnableDubbo
@SpringBootApplication
public class provider01App {
     public static void main(String[] args) {
         SpringApplication.run(provider01App.class, args);
    }