电竞比分网-中国电竞赛事及体育赛事平台

分享

Spring Boot Dubbo 構(gòu)建分布式服務(wù)

 小世界的野孩子 2020-07-05

概述:

dubbo.png

節(jié)點(diǎn)角色說(shuō)明

節(jié)點(diǎn) 角色說(shuō)明
Provider 暴露服務(wù)的服務(wù)提供方
Consumer 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方
Registry 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心
Monitor 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心
Container 服務(wù)運(yùn)行的容器

調(diào)用關(guān)系說(shuō)明

  1. 服務(wù)容器 Container 負(fù)責(zé)啟動(dòng),加載,運(yùn)行服務(wù)提供者。
  2. 服務(wù)提供者 Provider 啟動(dòng)的時(shí)候,向注冊(cè)中心 Registry 注冊(cè)自己提供的服務(wù)。
  3. 服務(wù)消費(fèi)者 Consumer 在啟動(dòng)的時(shí)候,向注冊(cè)中心 Registry 訂閱自己所需要的服務(wù)。
  4. 注冊(cè)中心 Registry 返回服務(wù)提供者的地址列表給消費(fèi)者,如果有變更注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者。
  5. 服務(wù)消費(fèi)者從提供者地址列表中,基于軟負(fù)載均衡算法,選擇一臺(tái)提供者進(jìn)行進(jìn)行調(diào)用,如果調(diào)用失敗再選擇另外一臺(tái)。
  6. 服務(wù)消費(fèi)者與提供者在內(nèi)存中統(tǒng)計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心 Monitor 。

項(xiàng)目構(gòu)建

開(kāi)發(fā)環(huán)境主要涉及以下方面:

  • Spring Boot
  • JDK 8
  • Dubbo 2.7.1
  • Zookeeper

具體代碼可以查看 github 的 dubbo 模塊:https://github.com/UniqueDong/springboot-study

Dubbo API

定義服務(wù)接口,打成 jar 包讓消費(fèi)者依賴(lài),服務(wù)者實(shí)現(xiàn)接口。該工程只有接口定義以及 model 對(duì)象。@Data 屬于lombok 開(kāi)源庫(kù)提供的特性,方便開(kāi)發(fā)。

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

Provider 服務(wù)提供者

  • pom依賴(lài):

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

<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 服務(wù)連接端口
    port: 2181

# dubbo 配置
dubbo:
  # 注冊(cè)中心配置 
  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 協(xié)議配置
  protocol:
    # -1 表示使用隨機(jī)未被占用的端口
    port: -1
    name: dubbo
  scan:
    # dubbo 服務(wù)提供者實(shí)現(xiàn)類(lèi)所在包
    base-packages: com.zero.provider.impl
  • 實(shí)現(xiàn) api 定義的接口

    注意 @Service 是 Dubbo 的,不要導(dǎo)入了 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 定義:

我們要依賴(lài) spring-boot-starter-web 提供http rest接口給前端調(diào)用。同時(shí)內(nèi)部通過(guò) Dubbo 實(shí)現(xiàn) RPC調(diào)用服務(wù)提供者。

<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
  # 是否檢查服務(wù)提供者有效 
  consumer:
    check: false
  • 服務(wù)消費(fèi)者調(diào)用服務(wù)生產(chǎn)者
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();
    }
}
  • 我們通過(guò)一個(gè)RESTfull接口,提供給前端調(diào)用。
@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

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

總結(jié)

各種具體協(xié)議、注冊(cè)中心、多注冊(cè)中心、超時(shí)等配置可以查看官方文檔http://dubbo./zh-cn/docs/user/quick-start.html

歡迎大家討論糾正,郵箱:zero_develop@163.com 。點(diǎn)贊與關(guān)注微信公眾號(hào)是我們前進(jìn)的動(dòng)力。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多