微服務框架(二)Spring Boot 集成 Dubbo

  此係列文章將會描述Java框架Spring Boot、服務治理框架Dubbo、應用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等開源框架,其中穿插着Spring Boot中日誌切面等技術的實現,然後通過gitlab-CI以持續集成爲Docker鏡像。
  本文爲此Spring Boot通過使用起步依賴dubbo-spring-boot-starter及自動裝配的方式集成Dubbo。

本系列文章中所使用的框架版本爲Spring Boot 2.0.3-RELEASE,Spring 5.0.7-RELEASE,Dubbo 2.6.2。

Spring Boot

  Spring Boot旨在讓開發人員使用最少的配置,儘可能快地着手開發並運行一個應用。Spring Boot框架從本質上來說就是Spring,但通過自動配置和起步依賴的方式將開發人員從繁重的配置中解放出來,專注於業務邏輯的實現。Spring Boot 的特性見微服務框架(一)Spring Boot + Dubbo + Docker 框架特性簡述

Profile運行環境配置

  Spring Boot簡化了開發人員需要的模板配置,因此我們只需要引入application.properties/application.yml即可。

在多環境配置下常使用application.properties只配置spring.profiles.active屬性,以起選擇對應環境的配置文件的作用

這裏寫圖片描述

如上中,application.properties只需要配置spring.profiles.active = dev來選擇配置文件,Spring Boot會自動加載config包下application-dev.properties的配置

在運行jar包或docker鏡像時只需要設置spring.profiles.active運行變量

jar: java -jar provider.jar --spring.profiles.active=dev
docker: -e "SPEING_PROFILES_ACTIVE=dev"

Dubbo

Dubbo是一個由阿里巴巴開源的高性能、基於Java的RPC框架。與許多RPC系統一樣,dubbo基於定義服務的思想,指定可以使用其參數和返回類型來遠程調用的方法。在服務器端,Provider實現此接口並運行dubbo服務器來處理客戶端調用。在客戶端,Customer有一個提供與服務器相同的方法的存根。

  Dubbo Spring Boot 項目致力於簡化 Dubbo RPC 框架在 Spring Boot 應用場景的開發。同時也整合了 Spring Boot 自動裝配生產就緒的特性。

依賴引入及接口定義

Maven中引入dubbo-spring-boot-starter的起步依賴至pom.xml

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>

依賴關係:

版本 Java Spring Boot Dubbo
0.2.0 1.8+ 2.0.x 2.6.2+
0.1.1 1.7+ 1.5.x 2.6.2+

Dubbo RPC API:

public interface DemoService {
    String saySomething(String word);
}

Dubbo Provider

1.編寫Spring Boot啓動類

Dubbo的服務容器是一個 standalone 的啓動程序,不需要Web容器

@SpringBootApplication
public class Starter {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Starter.class)
            .web(WebApplicationType.NONE) // 非 Web 應用
            .run(args);
    }
}

2.實現DemoService接口

@Service(version = "${demo.service.version}")
public class DemoServiceImpl implements DemoService {

    @Override
    public String saySomething(String word) {
        return StringUtils.isNotEmpty(word) ? word : "Say you won't let go";
    }

}

3.spring boot配置文件

Spring Boot的自動裝配及起步依賴使開發人員只需配置文件,而無需重複使用模板定義

application.properties/application.yml

# Spring boot application
spring.application.name = dubbo-provider-demo
server.port = 9090

# Service version
demo.service.version = 1.0.0

# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages  = org.spring.boot.dubbo.provider

# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-provider-demo
dubbo.application.name = dubbo-provider-demo

## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 9900

## RegistryConfig Bean
dubbo.registry.id = my-registry
dubbo.registry.address = zookeeper://127.0.0.1:2181

注:啓動消費者時需啓動對應的註冊中心,否則服務會啓動失敗

Dubbo Customer

使用Spring Boot框架構建Web應用時需引入spring-boot-starter-web的起步依賴

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

1.編寫Spring Boot啓動類(Web應用)

@SpringBootApplication(scanBasePackages = "org.spring.boot.dubbo.consumer.controller")
public class Starter {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Starter.class)
            .web(WebApplicationType.SERVLET).run(args);
    }
}

2.通過 @Reference 注入 DemoService

下述配置中消費者爲直連生產者,未經過註冊中心(@Referenceurl參數若已配置則直連對應生產者,若未配置則經過配置文件中dubbo.registry.address參數連接註冊中心,獲取相應的生產者信息)

@RestController
public class DemoController {

    @Reference(version = "${demo.service.version}", 
                url = "dubbo://localhost:9900")
    private DemoService demoService;

    @RequestMapping("/saySomething")
    public String sayHello(@RequestParam String name) {
        return demoService.saySomething(name);
    }
}

3.spring boot配置文件

Spring Boot的自動裝配及起步依賴使開發人員只需配置文件,而無需重複使用模板定義

application.properties/application.yml

# Spring boot application
spring.application.name = dubbo-consumer-demo
server.port = 9090

# Service version
demo.service.version = 1.0.0

# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages  = org.spring.boot.dubbo.consumer.controller

# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-consumer-demo
dubbo.application.name = dubbo-consumer-demo

## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 9901

## RegistryConfig Bean
dubbo.registry.id = my-registry
dubbo.registry.address = zookeeper://localhost:2181

參考資料:

  1. Dubbo Spring Boot官方文檔
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章