DubboSpringBoot

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

Dubbo Spring Boot框架介绍

Apache Dubbo™ 是一款高性能Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。现在Dubbo被很多大公司所使用,是非常流行的Java RPC框架。

Dubbo Spring Boot 是一个开源的Dubbo在Spring Boot上配置的框架。

它实现了Dubbo在Spring Boot中的自动装配,注解驱动,安全, 健康检查, 外部化配置等功能。

Dubbo Spring Boot 的Maven配置:

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.tntxia.study</groupId>
	<artifactId>dubbo-provider</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<properties>
		<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
		<dubbo.version>2.7.8</dubbo.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>

		</dependencies>
	</dependencyManagement>

	<dependencies>
		<!-- Dubbo Spring Boot Starter -->
		<dependency>
			<groupId>org.apache.dubbo</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>2.7.8</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
	</dependencies>
</project>

复制代码

通常情况 , Dubbo 应用有两种使用场景 , 其一为 Dubbo 服务提供方 , 另外一个是 Dubbo 服务消费方。

首先,我们假设存在一个 Dubbo RPC API ,由服务提供方为服务消费方暴露接口 :

public interface IUserService {
	void add(String name);
}
复制代码

实现 Dubbo 服务提供方

1. 实现 IUserService 接口

package com.tntxia.study.dubbo.service.impl;

import org.apache.dubbo.config.annotation.DubboService;

import com.tntxia.study.dubbo.service.IUserService;

@DubboService(version = "1.0.0")
public class UserServiceImpl implements IUserService {
	@Override
	public void add(String name) {
		System.out.println("add user");
	}
}
复制代码

我们可以看到实现接口的方法后,我们只需要加一个@DubboService标签就可以声明这是一个Dubbo Service的实现了。

2. 配置服务提供方的接入信息


spring.application.name=user-service-provider
dubbo.scan.base-packages=com.tntxia.study.dubbo.service

# Dubbo Protocol
dubbo.protocol.name=dubbo
dubbo.protocol.port=12345

## Dubbo Registry
dubbo.registry.address=N/A

复制代码

这里我们配置了Dubbo服务提供方的应用名,组件扫描路径,协议,端口,还有注册地址。

3. Dubbo服务提供方的启动类

package com.tntxia.study.dubbo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;

@EnableAutoConfiguration
public class Application {
	public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
复制代码

这里Application其实就是一个普通的Spring Boot启动类,不需要额外的标签和代码。

配置完后,启动这个Application,后台会打印:

image.png

从后台打印结果,可以看出IUserService已经导出成Dubbo对外的服务了,接下来,我们就可以写服务消费方来使用这个服务了。

实现 Dubbo 服务消费方

1. 首先,我们先配置应用名称,没有配置的话,可能会报错。

配置 application.yml

spring:
  application:
    name: user-service-consumer
复制代码

2. 接下来,我们可以下调用IUserService的代码了。

package com.tntxia.study.dubbo;

import org.apache.dubbo.config.annotation.DubboReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;

import com.tntxia.study.dubbo.service.IUserService;

@EnableAutoConfiguration
public class DubboAutoConfigurationConsumerBootstrap {
	
	private final Logger logger = LoggerFactory.getLogger(getClass());

    @DubboReference(version = "1.0.0", url = "dubbo://127.0.0.1:12345")
    private IUserService userService;

	public static void main(String[] args) {
		SpringApplication.run(DubboAutoConfigurationConsumerBootstrap.class).close();

	}
	
	@Bean
    public ApplicationRunner runner() {
        return args -> {
            userService.add("Jim");;
        };
    }

}
复制代码

运行这个代码后,服务端的后台可以显示出我们要打印的信息:

image.png

说明服务消费方成功的调用了Dubbo服务提供方的代码,Dubbo的功能在Spring Boot实现了。

总结

Spring Boot是基于Spring的强大的一站式框架,使用Dubbo Spring Boot,我们可以把Dubbo和Spring Boot整合起来,是Dubbo的使用更加容易和高效。