天天看點

Spring Boot 進階-SpringBoot如何整合Apache Dubbo詳解

作者:架構師面試寶典
Spring Boot 進階-SpringBoot如何整合Apache Dubbo詳解

首先我們知道Apache Dubbo 是不需要Spring Boot的依賴也可以完成微服務架構的支援與搭建工作,這個是由于在Apache Dubbo中本身就具有Spring相關的依賴,而Spring Boot也是依賴于Spring 來進行實作的。既然兩者都是基于Spring實作,那麼兩者的結合一定會有意想不到的效果。

由于Dubbo被重新開機的時候,無論是Spring Boot還是Dubbo都沒有現在這麼成熟的生态,是以說整合起來比較麻煩,但是現在随着微服務生态體系的不斷完成使用Spring Boot 整合Apache Dubbo來實作微服務操作的應用也越來越多,在加上Spring Boot 自動裝配等優勢,二者結合也是極大地提升了開發的效率。下面我們就來通過一個簡單的小例子來示範一下如何将Spring Boot 與Apache Dubbo進行整合。

建立一個服務提供者

第一步,我們需要建立一個普通的Maven工程與之前一樣,命名為dubbo-spring-boot-provider,并且在這個Maven項目中我們還要提供兩個子產品一個是服務子產品、一個是接口子產品,分别命名為user-service和user-api,目錄結構如下圖所示。

Spring Boot 進階-SpringBoot如何整合Apache Dubbo詳解

第二步,在user-api子產品中定義一個HelloWorld的測試接口,用來進行遠端調用相關的測試工作,然後在通過mvn install指令将其建立到本地的Maven私服中,以便其他項目的引用。

public interface IHelloService {
   
    public String hello(String name);
}
           

第三步,需要在user-service子產品中引入一些Spring Boot以及Apache Dubbo相關的依賴,這裡有一點需要說明,就是在筆者示範的時候用的可能不是最新的依賴版本,但是原理是一樣的。

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>dubbo-spring-boot-provider</artifactId>
        <groupId>com.provider</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>user-service</artifactId>


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

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.5</version>
        </dependency>

        <dependency>
            <groupId>com.provider</groupId>
            <artifactId>user-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>           

第四步,在完成了依賴引入之後,我們就需要在user-provider中實作上面定義的接口,在這裡我們使用SPEL表達式擷取到對應服務的名稱,用來辨別我們的服務調用是否正常執行,

@Service
public class HelloServiceImpl implements IHelloService {

    @Value("${dubbo.application.name}")
    private String serviceName;

    public String hello(String name) {
        return serviceName + "say Hello "+name;
    }
}
           

這裡我們注意到在這個實作類上我們标注的@Service注解是來自Dubbo的Service注解。import org.apache.dubbo.config.annotation.Service; 而不是在Spring Boot中提供的@Service注解。這一點在引入的時候需要注意。

第五步,完成上面的配置之後,我們需要在application.properties配置檔案中加入Dubbo的相關配置服務資訊。

spring.application.name=dubbo-spring-boot-provider
dubbo.application.name=user-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.registry.address=N/A           

第六步,添加完配置依賴之後我們就需要建立一個主啟動類來啟動我們的服務提供者

@DubboComponentScan
@SpringBootApplication
public class DubboProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboProviderApplication.class,args);
    }
}
           

這裡我們需要注意的是,在這個主啟動類上有一個 @DubboComponentScan 注解,這個注解的意思就是掃描目前路徑,以及其子路徑下所有的關于Dubbo的相關注解。例如上面的@Service注解,就是來自Dubbo提供的服務注解。

建立一個服務消費者

根據上面的邏輯,我們需要建立一個服務消費者用來進行服務的調用操作。

第一步,這次我們來建立一個Spring Boot的項目dubbo-spring-boot-consumer,并且添加相關的依賴。

<dependency>
	<groupId>org.apache.dubbo</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>2.7.5</version>
</dependency>

<dependency>
	<groupId>com.provider</groupId>
	<artifactId>user-api</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>           

第二步,添加完依賴之後,在consumer項目中添加配置檔案

dubbo.application.name=dubbo-consumer           

第三步,完成配置之後,在主啟動類中完成如下的配置

@SpringBootApplication
public class DubboSpringBootConsumerApplication {


	@Reference(url = "dubbo://192.168.3.21:8080/com.provider.service.IHelloService")
	private IHelloService helloService;

	public static void main(String[] args) {
		SpringApplication.run(DubboSpringBootConsumerApplication.class, args);
	}

	@Bean
	public ApplicationRunner runner(){
		return args -> System.out.println(helloService.hello("架構師"));
	}

}           

首先我們需要通過@Reference注解來引入服務提供者的調用,其次通過如下的代碼對服務提供者進行遠端調用操作調用,這裡隻是簡單的示範了調用者,在實際開發的過程中我們可以通過Controller層的封裝進行調用。

@Bean
	public ApplicationRunner runner(){
		return args -> System.out.println(helloService.hello("架構師"));
	}           

使用@RestController進行封裝,首先需要在Consumer下建立一個Controller。然後對調用對象進行引入。

@RestController
public class HelloController {
    @Reference(url = "dubbo://192.168.3.21:8080/com.provider.service.IHelloService")
    private IHelloService helloService;
    
    
    @GetMapping("/hello")
    public String hello(){
        return helloService.hello("架構師");
    }
}           

到這裡我們就分别完成了服務提供者和服務調用者的開發工作。然後在本地啟動Dubbo相關的服務就可以完成服務的調用操作。

總結

相比于通過XML的方式進行服務注冊來講,通過注解的方式更加簡單明了,不但提升了開發效率,還在一定程度上簡化的代碼的開發。另外Dubbo官方還提供了基于Dubbo的服務檢測子產品,引入該子產品之後可以針對各種服務進行一個監控。這也是提供了服務高可用健康檢查的更加高效的解決方案。