Analysis of SpringBoot integration and use from shallow to deep Dubbo core source code

Table of Contents

  • 1 Integration of Dubbo and SpringBoot
  • 2 Public RPC interface project
  • 3. Server engineering
  • 4. Consumer Engineering
  • 5. Project call verification

1 Integration of Dubbo and SpringBoot

Realize the integration of Dubbo and Spring Boot based on Zookeeper, relying on import

 <properties>
        <dubbo-version>2.7.8</dubbo-version>
        <spring-boot.version>2.3.0.RELEASE</spring-boot.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!-- Spring Boot -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Apache Dubbo -->
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-dependencies-bom</artifactId>
                <version>${dubbo-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo-version}</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>javax.servlet</groupId>
                        <artifactId>servlet-api</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo-version}</version>
        </dependency>
        <!-- Dubbo core components -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <!--Spring Boot dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>
        <!-- Zookeeper Client Framework -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- Zookeeper dependencies -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>${dubbo-version}</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

Dubbo uses version 2.7.8, and Spring Boot uses version 2.3.0.RELEASE.

If there is a problem with the dependent download, you can specify a specific warehouse:

<repositories>
    <repository>
        <id>apache.snapshots.https</id>
        <name>Apache Development Snapshot Repository</name>
        <url>https://repository.apache.org/content/repositories/snapshots</url>
        <releases>
            <enabled>false</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

2 Public RPC interface project

In order to facilitate the reference of the RPC interface between the client and the server, the RPC interface is uniformly encapsulated here.

An order service interface is defined for testing and verification.

public interface OrderService {<!-- -->

    /**
     * Get order details
     * @param orderId
     * @return
     */
    String getOrder(Long orderId);
}

3. Server project

  1. engineering structure

  1. POM dependencies
 <dependencies>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo-version}</version>
        </dependency>
        <!-- Dubbo core dependencies -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
        <!-- public RPC interface dependency -->
        <dependency>
            <groupId>com.oldlu</groupId>
            <artifactId>dubbo-spring-interface</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
  1. RPC service interface
 @DubboService(version = "${dubbo.spring.provider.version}")
public class OrderServiceImpl implements OrderService {<!-- -->

    /**
     * Service port
     */
    @Value("${server.port}")
    private String serverPort;
    
    @Value("${dubbo. spring. provider. version}")
    private String serviceVersion;

    /**
     * Get order details
     * @param orderId
     * @return
     */
    public String getOrder(Long orderId) {<!-- -->

       String result = "get order detail ,orderId=" + orderId + ",serverPort=" + serverPort + ",serviceVersion=" + serviceVersion;
        System.out.println(result);
        return result;
    }
}

Through the DubboService annotation, it is declared as an RPC service, the version can identify the specific version number, and the consumer needs to match and keep consistent.

  1. Engineering configuration
 # service port
server.port=18081
# application name
spring.application.name=dubbo-spring-provider
# Dubbo service scanning path
dubbo.scan.base-packages=com.oldlu

# Dubbo communication protocol
dubbo.protocol.name=dubbo
# The port provided by the Dubbo service, configured as -1, represents a random port, the default is 20880
dubbo.protocol.port=-1

## Dubbo Registrar configuration information
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.file = ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
dubbo.spring.provider.version=1.0.0

  1. Spring Boot starter
 @SpringBootApplication
@ComponentScan(basePackages = {<!-- -->"com.itheima"})
public class DubboSpringProviderApplication {<!-- -->

    public static void main(String[] args) {<!-- -->
        SpringApplication.run(DubboSpringProviderApplication.class, args);
    }
}

?

4. Consumer project

  1. engineering structure

  1. POM dependencies:
 <dependencies>
        <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo-version}</version>
        </dependency>
        <!-- public RPC interface dependency -->
        <dependency>
            <groupId>com.itheima</groupId>
            <artifactId>dubbo-spring-interface</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>

?

  1. consumer call
 @Controller
@RequestMapping("/order")
public class OrderController {<!-- -->

    private final Logger logger = LoggerFactory. getLogger(getClass());


    /**
     * Order service interface
     */
    @DubboReference(version = "${dubbo.spring.provider.version}")
    private OrderService orderService;

    /**
     * Get order details interface
     * @param orderId
     * @return
     */
    @RequestMapping("/getOrder")
    @ResponseBody
    public String getOrder(Long orderId) {<!-- -->
        String result = null;
        try {<!-- -->
            result = orderService. getOrder(orderId);
        }catch(Exception e) {<!-- -->
            logger. error(e. getMessage(), e);
        }
        return result;
    }

}

?

  1. Engineering configuration
# service port
server.port=18084
#service name
spring.application.name=dubbo-spring-consumer
#Service version number
dubbo.spring.provider.version=1.0.0
#Consumer register configuration information
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.registry.file = ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
  1. Spring Boot starter
@SpringBootApplication
@ComponentScan(basePackages = {<!-- -->"com.itheima"})
public class DubboSpringConsumerApplication {<!-- -->

    public static void main(String[] args) {<!-- -->
        SpringApplication.run(DubboSpringConsumerApplication.class, args);
    }
}
   

?

5. Project call verification

  1. Start the ZK Registry

  2. Start the server and run DubboSpringProviderApplication

  3. Start the consumer and run DubboSpringConsumerApplication

  4. Request to get order interface, address: http://127.0.0.1:18084/order/getOrder?orderId=1001

    The call is successful: