Spring Boot Dubbo 構建分佈式服務

概述:

dubbo.png

節點角色說明html

節點 角色說明
Provider 暴露服務的服務提供方
Consumer 調用遠程服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的調用次數和調用時間的監控中心
Container 服務運行的容器

調用關係說明前端

  1. 服務容器 Container 負責啓動,加載,運行服務提供者。
  2. 服務提供者 Provider 啓動的時候,向註冊中心 Registry 註冊本身提供的服務。
  3. 服務消費者 Consumer 在啓動的時候,向註冊中心 Registry 訂閱本身所須要的服務。
  4. 註冊中心 Registry 返回服務提供者的地址列表給消費者,若是有變動註冊中心將基於長鏈接推送變動數據給消費者。
  5. 服務消費者從提供者地址列表中,基於軟負載均衡算法,選擇一臺提供者進行進行調用,若是調用失敗再選擇另一臺。
  6. 服務消費者與提供者在內存中統計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心 Monitor 。

項目構建

開發環境主要涉及如下方面:java

  • Spring Boot
  • JDK 8
  • Dubbo 2.7.1
  • Zookeeper

具體代碼能夠查看 github 的 dubbo 模塊:https://github.com/UniqueDong/springboot-studygit

Dubbo API

定義服務接口,打成 jar 包讓消費者依賴,服務者實現接口。該工程只有接口定義以及 model 對象。@Data 屬於lombok 開源庫提供的特性,方便開發。github

  • model 對象定義:
@Data
public class User implements Serializable {
    private Long id;
    private String username;
}
  • provider 接口定義:
public interface UserProvider {
    List<User> listUser();
}

Provider 服務提供者

  • pom依賴:

引入spring-boot-starter,dubbo-api 接口就是咱們上面提到的 接口定義 jar ,dubbo-spring-boot-starter ,dubbo-dependencies-zookeeper。web

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-logging</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>zero.springboot.study</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <!--dubbo start-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>

        <!-- Zookeeper dependencies -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.1</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--dubbo end-->
       
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.57</version>
        </dependency>
    </dependencies>
  • 配置文件 yaml 定義:
spring:
  application:
    name: dubbo-provider
#自定義配置
embedded:
  zookeeper:
    # zookeeper 服務鏈接端口
    port: 2181

# dubbo 配置
dubbo:
  # 註冊中心配置 
  registry:
    id: dubbo-provider
    address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
    group: local
  application:
    name: dubbo-provider
    id: dubbo-provider
    logger: slf4j
    qosEnable: true
    qosPort: 22224
    qosAcceptForeignIp: false
  # dubbo 協議配置
  protocol:
    # -1 表示使用隨機未被佔用的端口
    port: -1
    name: dubbo
  scan:
    # dubbo 服務提供者實現類所在包
    base-packages: com.zero.provider.impl
  • 實現 api 定義的接口算法

    注意 @Service 是 Dubbo 的,不要導入了 Spring 的。spring

import com.google.common.collect.Lists;
import com.zero.api.model.User;
import com.zero.api.provider.UserProvider;
import org.apache.dubbo.config.annotation.Service;

import java.util.List;

@Service(interfaceClass = UserProvider.class)
public class UserProviderImpl implements UserProvider {
    @Override
    public List<User> listUser() {
        User user = new User();
        user.setId(1L);
        user.setUsername("青龍");
        return Lists.newArrayList(user);
    }
}

Consumer

  • Pom 定義:

咱們要依賴 spring-boot-starter-web 提供http rest接口給前端調用。同時內部經過 Dubbo 實現 RPC調用服務提供者。apache

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>zero.springboot.study</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
        <!--dubbo start-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.1</version>
        </dependency>

        <!-- Zookeeper dependencies -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.1</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--dubbo end-->

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>
  • yaml 定義:
server:
  # web 日更年期端口
  port: 9005
spring:
  application:
    name: dubbo-comsumer
#自定義配置
embedded:
  zookeeper:
    port: 2181
# dubbo 配置
dubbo:
  registry:
    id: dubbo-comsumer
    address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
    group: local
  application:
    name: dubbo-comsumer
    id: dubbo-comsumer
    logger: slf4j
    qosEnable: false
    qosPort: 22223
    qosAcceptForeignIp: false
  protocol:
    port: -1
    name: dubbo
  # 是否檢查服務提供者有效 
  consumer:
    check: false
  • 服務消費者調用服務生產者
import com.zero.api.model.User;
import com.zero.api.provider.UserProvider;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Reference
    private UserProvider userProvider;

    public List<User> listUser() {
        return userProvider.listUser();
    }
}
  • 咱們經過一個RESTfull接口,提供給前端調用。
@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping
    public Object listUser() {
        List<User> list = userService.listUser();
        return list;
    }
}

總結

各類具體協議、註冊中心、多註冊中心、超時等配置能夠查看官方文檔http://dubbo.apache.org/zh-cn/docs/user/quick-start.htmljson

歡迎你們討論糾正,郵箱:zero_develop@163.com 。點贊與關注微信公衆號是咱們前進的動力。
掃碼_搜索聯合傳播樣式-微信標準綠版.png

相關文章
相關標籤/搜索