Springboot + Dubbo2.7.x + Apollo 集成

環境準備

  1. Java 1.8
  2. Apollo配置中心安裝,Github上有詳細的安裝過程
  3. Zookeeper註冊中心,官網下載和安裝

開始搭建

1. 創建配置

1.1 創建項目

前面安裝好Apollo後,從瀏覽器進入配置中心管理頁面(默認端口8070)
在這裏插入圖片描述
如上圖創建3個Project,分別爲demo-common(公共配置)、demo-provider(提供者配置)、demo-consumer(消費者配置)

1.2 創建公共Namespace

先進入demo-common項目,點擊左下角的添加 Add Namespace 按鈕
在這裏插入圖片描述
進入添加Namespace頁面後點擊 Create Namespace 按鈕
在這裏插入圖片描述
創建一個dubbo的Namespace,然後回到demo-common的項目配置中,此時項目多了一個dubbo的公共配置。然後在dubbo的Namespace下面添加如下配置

dubbo.protocol.name = dubbo
dubbo.registry.address = zookeeper://zookeeper-ip:2181
dubbo.registry.simplified = true

然後點擊 dubbo 上的 Realease 按鈕

1.3 添加私有配置

1.3.1 添加服務端的配置

  • 添加上面創建的dubbo的Namespace,進入 demo-provider項目,點擊 Add Namespace按鈕,然後在下拉選項中選擇 dubbo,然後 Submit
    在這裏插入圖片描述
  • 回到 demo-provider 項目中,在 application 的 Namespace中添加以下配置,然後 Release
dubbo.application.name = demo-provider
dubbo.protocol.port = 20880
dubbo.scan.base-packages = com.dzeb.demo.service # dubbo的Service註解的類的包

1.3.2 添加消費端的配置

  • 跟上面 demo-provider 一樣,進入 demo-consumer, 先添加公共的 dubbo 的 Namespace
  • 在 application 的 Namespace 中添加以下配置,然後 Release
dubbo.application.name = demo-consumer

2. 創建Java工程

2.1 創建Java工程

創建 demo-provider、demo-consumer、demo-api 三個maven工程

2.2 添加Maven依賴

demo-provider的pom.xml:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    <!-- apollo 依賴 -->
    <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.5.0</version>
    </dependency>
    <!-- zookeeper 需要用的依賴 -->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.5.5</version>
    </dependency>
    <!-- dubbo 和 springboot 集成依賴 -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.4.1</version>
    </dependency>
    <!-- demo-api依賴 -->
    <dependency>
        <groupId>com.dzeb</groupId>
        <artifactId>demo-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

demo-consumer 的 pom.xml:

<dependencies>
    <!-- springboot web啓動 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.2.1.RELEASE</version>
    </dependency>
    <!-- Apollo -->
    <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.5.0</version>
    </dependency>
    <!-- dubbo -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>2.7.4.1</version>
    </dependency>
    <!-- zookeeper 需要用到的依賴-->
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.5.5</version>
    </dependency>
    <!-- demo-api -->
    <dependency>
        <groupId>com.dzeb</groupId>
        <artifactId>demo-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

2.3 配置使用 Apollo

demo-provider 的 resources/application.properties:

app.id = demo-provider # Apollo配置中心中的 demo-provider 的 appId
apollo.meta=http://apollo-ip:8080 # 配置中心的meta-server,默認8080端口
apollo.bootstrap.enabled = true # 注入默認application namespace的配置示例
apollo.bootstrap.namespaces = application,dubbo # 要使用的 Namespace

demo-consumer 的 resources/application.properties:

app.id = demo-consumer
apollo.meta=http://apollo-ip:8080
apollo.bootstrap.enabled = true
apollo.bootstrap.namespaces = application,dubbo

2.4 創建測試類

demo-api 工程創建類 DemoService:

public interface DemoService {
    String sayHello(String name);
}

demo-provider 工程創建類 DefaultDemoService 和 DemoProviderApplication:

import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Value;

// 這裏的 Service 是 org.apache.dubbo.config.annotation 包下面的,不是 Spring 的 Service 註解
@Service(version = "1.0.0")
public class DefaultDemoService implements DemoService {

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

    public String sayHello(String name) {
        return String.format("[%s] : Hello, %s", serviceName, name);
    }
}
@SpringBootApplication
public class DemoProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoProviderApplication.class, args);
    }
}

demo-consumer 工程創建類 DemoController 和 DemoApiApplication:

@RestController
@RequestMapping
public class DemoController {

    @Reference(version = "1.0.0")
    private DemoService demoService;

    @RequestMapping("sayHello/{name}")
    public ResponseEntity<String> sayHello(@PathVariable("name") String name) {
        return ResponseEntity.ok().body(demoService.sayHello(name));
    }
}
@SpringBootApplication
public class DemoApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApiApplication.class, args);
    }
}

2.5 啓動訪問

分別啓動 DemoProviderApplication 和 DemoApiApplication,然後在瀏覽器或HTTP測試工具上訪問,如下
在這裏插入圖片描述

填坑

如果啓動遇到如下報錯:

java.lang.IllegalStateException: zookeeper not connected

有一種情況是超時導致的,可以在zookeeper配置的連接增加timeout(default 5000),然後 Release

zookeeper://zookeeper-ip:2181?timeout=10000

總結

這次搭建使用了最新的dubbo 2.7.x,其中有許多改動,比如默認配置中心和移除 zkclient 的實現:

爲了兼容2.6.x版本配置,在使用Zookeeper作爲註冊中心,且沒有顯示配置配置中心的情況下,Dubbo框架會默認將此Zookeeper用作配置中心,但將只作服務治理用途。
注意:在2.7.x的版本中已經移除了zkclient的實現,如果要使用zkclient客戶端,需要自行拓展

源碼地址

https://github.com/dingzebin/dubbo-apollo-demo

參考

Dubbo官方文檔

Apollo官方文檔

發佈了15 篇原創文章 · 獲贊 2 · 訪問量 3964
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章