一個基於Dubbo+Zookeeper搭建的項目

文 | 平哥 日期 | 20201013java

具體代碼詳見GitHub倉庫:點我跳轉git

項目簡介

此項目爲本身學習Dubbo+Zookeeper,搭建的第一個項目,主要架構就是一個父項目、三個子Module:dubbo_provider、 dubbo_consumer 和 dubbo_api,三個子Module分別繼承父項目。github

Dubbo的遠程訪問是基於接口的。Consumer和Provider使用同一個接口,能夠實現遠程訪問。web

  • Provider給接口寫實現,提供服務。
  • Consumer使用接口,並經過Dubbo建立的動態代理對象,遠程訪問Provider。
  • 把接口獨立定義在一個工程(dubbo_api)中,作依賴管理。

p.s. 此項目重點是練習Dubbo+Zookeeper,故沒有寫鏈接數據庫的內容,只是模擬了訪問數據庫。spring

Step 1 建立項目並編寫父項目Maven依賴

1.1 建立項目

用IDEA建立項目,建立完項目目錄以下:
數據庫

1.2 編寫父項目Maven依賴

直接上代碼:apache

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.gcp</groupId>
    <artifactId>dubbo_pro01</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>dubbo_provider</module>
        <module>dubbo_consumer</module>
        <module>dubbo_api</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>
    <dependencies>
        <!--springboot 啓動器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--lombok依賴-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--dubbo springboot啓動器-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>
        <!--curator依賴-->
        <!--Curator提供了一套Java類庫, 能夠更容易的使用ZooKeeper。 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>
</project>

Step 2 編寫dubbo_api

2.1 定義POJO類

package com.gcp.pojo;
import lombok.Data;
@Data
public class User {
    private Long id;
    private String name;
    private String password;
}

2.2 定義Service接口

package com.gcp.service;
import com.gcp.pojo.User;
/**
 * 用戶服務接口
 */
public interface UserService {
    void register(User user);
    User getUserById(Long id);
}

Step 3 編寫dubbo_provider

說明

  • Dubbo服務提供者Provider,是不須要定義Controller的,是直接經過Service提供服務的。
  • 使用Dubbo框架提供的註解@DubboService,聲明當前的類型的對象,是一個Dubbo服務提供者。
  • 讓Spring容器初始化、管理,並經過curator框架,把服務信息註冊到Zookeeper中。
  • 在老版本的Dubbo(2.6(含)之前)中,註解命名是@Service。因此使用老版本開發的時候,注意導入的註解的包。
  • 須要提供一個application.yml配置文件,說明Dubbo使用的註冊中心是什麼,地址是什麼。

3.1 配置pom.xml

在pom.xml文件中添加依賴:api

<dependencies>
    <dependency>
        <groupId>com.gcp</groupId>
        <artifactId>dubbo_api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

3.2 定義Mapper接口和類

UserMapper接口:瀏覽器

import com.gcp.pojo.User;

/**
 * 模擬數據庫訪問
 */
public interface UserMapper {
    void insert(User user);
    User selectById(Long id);
}

UserMapperImpl實現類:springboot

@Repository
public class UserMapperImpl implements UserMapper {
    @Override
    public void insert(User user) {
        System.out.println("數據庫訪問:新增用戶 - " + user);
    }

    @Override
    public User selectById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("name" + id);
        user.setPassword("password" + id);
        System.out.println("數據庫訪問:主鍵查詢用戶 - " + user);
        return user;
    }
}

3.3 定義Service實現類

@DubboService(loadbalance = "roundrobin"), 其中 loadbalance = "roundrobin" 意思是若是此服務有集羣將採用輪詢的方式進行負載均衡訪問,
默認是 random:隨機

@DubboService(loadbalance = "roundrobin")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public void register(User user) {
        System.out.println("UserService 實現類中:註冊用戶");
        userMapper.insert(user);
    }

    @Override
    public User getUserById(Long id) {
        System.out.println("UserService 實現類中:根據id查詢用戶");
        return userMapper.selectById(id);
    }
}

3.4 配置application.yml

說明:

  • dubbo中,對每一個服務提供者和消費者的管理,都是基於應用級別的。
  • 都是使用命名做爲惟一標記的。
  • 同名的服務提供者或消費者,自動組成集羣。
  • dubbo應用默認使用的協議是dubbo協議,使用的端口默認爲20880。協議是能夠配置的。

在 resources 文件夾下建立application.yml:

dubbo: # dubbo配置根節點
  registry: # 配置dubbo的註冊中心 registry
    address: zookeeper://192.168.40.170:2181  # 提供註冊中心的訪問地址。
  application: # 配置本dubbo應用信息
    name: gcp-dubbo-first-provider  # 配置本dubbo的應用名稱,名稱組成是:字母,數字,'-',字母開頭
  protocol: # 協議,協議自定義配置的時候,全部的默認值失效。
    name: dubbo # 協議名
    port: 20880 # 端口,默認20880

如何安裝Zookeeper能夠詳見我另外一篇文章

3.5 建立SpringBoot啓動程序

  • 啓動的每一個Dubbo應用,必定會在註冊中心中註冊信息。
  • 服務提供者註冊的是/dubbo/xxx/providers
  • 服務消費者註冊的是/dubbo/xxx/consumers

*

  • Dubbo啓動器(dubbo-spring-boot-starter)默認不生效。
  • 必須經過@EnableDubbo讓啓動器生效。
  • 在2.7.2-之前版本中,部分配置默認不加載,須要使用@EnableDubboConfig讓所有配置生效。
  • 負載均衡策略:
  • 設置負載均衡策略,能夠在@DubboService或者@DubboReference註解上
  • 加屬性loadbalance進行配置。
  • 消費者默認是不考慮負載均衡策略的,是使用提供者定義的負載均衡策略。
  • 若是消費者配置了負載均衡策略,則忽略提供者配置的負載均衡策略。

com.gcp 包下建立SpringBoot啓動類:

@SpringBootApplication
@EnableDubbo
// @EnableDubboConfig
public class DbProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(DbProviderApplication.class,args);
    }
}

此時可啓動,測試看Zookeeper中是否成功註冊上服務,訪問Linux服務器,利用Zookeeper客戶端工具查看:

Step 4 編寫dubbo_consumer

4.1 配置pom.xml

在pom.xml文件中添加依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.gcp</groupId>
        <artifactId>dubbo_api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

4.2 建立consumer本地Service接口和實現類

有人可能會疑惑,Zookeeper註冊中心中已經有提供的Service服務了,怎麼本地還須要Service?
說明: 其實,dubbo遠程服務調用,是爲了 封裝通用規則,但各個子項目有本身的個性邏輯
如:用戶的註冊邏輯,在一個企業中是統一的。提供一個Provider實現註冊邏輯;
對於consumer來講,是不一樣的,能夠提供若干入口。如騰訊的用戶註冊,能夠經過QQ、QQ音樂、QQ空間等實現註冊或登陸。底層的用戶是相同的。

LocalUserService接口:

package com.gcp.service;
import com.gcp.pojo.User;
/**
 * consumer子Module的本地Service
 */
public interface LocalUserService {
    void register(User user);
    User getById(Long id);
}

LocalUserServiceImpl實現類:

@Service
public class LocalUserServiceImpl implements LocalUserService {

    /**
     * 遠程服務的接口。經過註解@DubboReference實現動態代理建立
     * 規則:
     * 一、 通知Dubbo框架,根據配置找註冊中心,發現服務的地址。
     *    拿接口名稱做爲zookeeper中節點的命名規則,獲取地址。
     * 二、 通知Spring,根據Dubbo框架的特性,建立接口的動態代理對象,並維護
     *    在Spring容器中。
     * 三、 相似@Autowired,把代理對象注入到當前的變量中。
     */
    @DubboReference
    private UserService userService;
    @Override
    public void register(User user) {
        System.out.println("準備調用遠程服務,服務對象類型是:" + userService.getClass().getName());
        System.out.println("註冊的用戶是: " + user);
        userService.register(user);
    }
    @Override
    public User getById(Long id) {
        System.out.println("根據主鍵查詢用戶,主鍵是: " + id);
        return userService.getUserById(id);
    }
}

4.3 建立Controller類

UserController類:

@RestController
public class UserController {

    @Autowired
    private LocalUserService localUserService;
    @RequestMapping("findUser")
    public User findUser(Long id){
        return localUserService.getById(id);
    }
    @RequestMapping("registerUser")
    public String register(User user){
        localUserService.register(user);
        return "註冊用戶成功";
    }
}

4.4 配置註冊中心地址

在 resources 文件夾下建立 application.yml:

dubbo:
  registry:
    address: zookeeper://192.168.40.170:2181

4.5 建立Springboot啓動類

在 com.gcp 包下建立 DbConsumerApplication:

@SpringBootApplication
@EnableDubbo
public class DbConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DbConsumerApplication.class,args);
    }
}

4.6 啓動測試

啓動consumer的啓動類,查看Zookeeper註冊中心是否註冊成功:

Step 5 項目總體測試

打開瀏覽器,輸入consumer訪問地址,測試是否能夠正常訪問:

後臺輸出:
consumer 子 Module:

provider 子 Module:

至此,項目搭建建立成功,你們能夠本身多複製幾個provider和consumer子Module的啓動類,把端口都改爲不同試試集羣輪詢、隨機訪問的效果。

具體代碼詳見GitHub倉庫:點我跳轉

相關文章
相關標籤/搜索