Dubbo與SpringBoot的結合


前言

這段時間在接觸分布式的內容,由於本身比較熟悉rpc的原理,所以我順其自然地選擇了 dubbo 作為我學習的框架。
看了任務清單,這篇文章應該是在6天前出來的,但是因為實習等等的一些事情耽誤了,今天立下決心動筆了。

准備

必需
JAVA 環境
注冊中心(我選用的是 nacos )

非必需
Maven
docker
idea(這個應該是必需的?當然也可以用記事本(滑稽.jpg))

正文

  1. 新建普通的 maven 項目(不勾選任何選項),手動寫入 pom 文件,配置項如下
<dependency>
	<groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
    <scope>provided</scope>
</dependency>

其實也可以不要 lombok ,此處只是方便調試。

  1. 新建三個module,分別命名為 api,provider,consumer
  • 模塊作用
api -- 普通 maven 項目,用於定義provider以及consumer交互的接口以及規范
provider -- Spring Boot 本地項目,用於為 api 中定義的服務接口創建實體類
consumer -- Spring Boot web 項目,接收用戶請求,調用 provider 處理請求並返回結果
  • 模塊pom定義

    • 根項目新增
    <modules>
        <module>api</module>
        <module>provider</module>
        <module>consumer</module>
    </modules>
    
    • api 新增
    <version>0.0.1-SNAPSHOT</version>
    
    • consumer 新增
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
         </dependency>
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>com</groupId>
             <artifactId>api</artifactId>
             <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-spring-boot-starter</artifactId>
             <version>2.7.3</version>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo</artifactId>
             <version>2.7.3</version>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-registry-nacos</artifactId>
             <version>2.7.3</version>
         </dependency>
         <dependency>
             <groupId>com.alibaba.nacos</groupId>
             <artifactId>nacos-client</artifactId>
             <version>1.0.0</version>
         </dependency>
    </dependencies>
    
    • provider 新增
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
    	</dependency>
        <dependency>
            <groupId>com</groupId>
            <artifactId>api</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    
  • 模塊配置文件

    • provider 配置文件
    dubbo:
      registry:
        address: nacos://192.168.99.100:8848
      application:
        name: dubbo-provider
    
    • consumer 配置文件
    spring:
      application:
        name: dubbo-consumer
      cloud:
        nacos:
        discovery:
          server-addr: 192.168.99.100
    server:
      port: 8081
      servlet:
        context-path: /text
    dubbo:
      protocol:
        port: -1
        name: dubbo
      registry:
        address: nacos://192.168.99.100:8848
      cloud:
        subscribed-services: dubbo-spring-cloud-provider
      application:
        name: consumer
    
  1. 示例搭建(Hello World)
  • 接口 HelloService 構建
package com.api;

public interface HelloService {

    String say(String name);
}

  • 服務提供類實現
package com.producer;

import com.api.HelloService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

@Service
@Component
public class HelloServiceImp implements HelloService {

    @Override
    public String say(String name) {
        return "hello,"+name;
    }
}

注意:@Service 注解是 dubbo 的注解,不是 Spring 的注解

  • 服務提供者啟動類添加@EnableDubbo注解
@SpringBootApplication
@EnableDubbo
public class DubboProducerApplication {

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

}
  • 消費者實現
package com.consumer;

import com.api.HelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
public class TextController {
    
    @Reference
    private HelloService helloService;

    @GetMapping("/text")
    public String text(){
        return helloService.say("cartoon");
    }
    
}

dubbo 的服務消費應該在消費者中的 Service 層做整合消費后返回處理結果,這里僅為演示。

  1. 運行

先運行 provider 再運行 consumer,否則 dubbo 會因無法找到服務提供者自行關閉消費者。

  • nacos 的結果

image

  • 插件 RestServices 的模擬調用

image

后記

雖然在網上已經有很多這方面的教程,但是大多是用 zookeeper 作為注冊中心。
而個人喜歡接觸新技術,nacos 在今年1月才由阿里開源出來。而且我比較喜歡 nacos 的界面風格,雖然 nacos 在功能上不如 zookeeper+dubboAdmin 強大,但是作為入門應該是足夠的。
在我的任務清單上,還規划着 dubbo 的 spi 機制的全注解輔以配置文件使用文章,但是因為時間以及我對機制還沒深入理解,所以我將這篇文章押后了,等深入源碼之后再根據源碼寫出我想要的文章。

本文首發於cartoon的博客
轉載請注明出處:https://cartoonyu.github.io/cartoon-blog/post/dubbo/dubbo與springboot的結合/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM