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 模塊:github.com/UniqueDong/…git

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;
    }
}

複製代碼

總結

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

歡迎你們討論糾正,郵箱:zero_develop@163.com 。點贊與關注微信公衆號是咱們前進的動力。

掃碼_搜索聯合傳播樣式-微信標準綠版.png
相關文章
相關標籤/搜索