1. 程式人生 > >SpringBoot與Dubbo和Zookeeper實現分散式

SpringBoot與Dubbo和Zookeeper實現分散式

今天就來簡單使用Spring Boot與Dubbo及zookeeper整合使用分散式
首先, 先來簡單瞭解一下什麼是Dubbo及zookeeper

Zookeeper
Zookeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護,域名服務,分散式同步,組服務等

Dubbo
Dubbo是Alibaba開源的分散式服務框架,它最大的特點是按照分層的方式來架構,使用這種方式可以使各個層之間解耦合(或者最大限度的鬆耦合),從服務模型的角度來看,Dubbo採用的是一種非常簡單的模型,要麼是提供方提供服務,要麼是消費方消費服務,所以基於這一點可以抽象出服務提供方(Provider)和服務消費方(Consumer)兩個角色

1. 在Liunx系統下下載Zookeeper, 參考如下命令:

[[email protected] ~]# docker pull registry.docker-cn.com/library/zookeeper

這裡的Zookeeper是裝在docker中的, 如果大家沒有裝有docker的話, 可以參考: https://blog.csdn.net/w1316022737/article/details/83652919

2. 啟動Zookeeper, 參考如下命令:

docker run --name 給zookeeper啟的名字 -p 2181:2181 --restart always -d 這塊為安裝的Zookeeper的id

3. 這裡採用的工具是IntelliJ IDEA進行開發, 首先建立一個空專案, 如圖操作:
在這裡插入圖片描述

4. 在建立的空工程裡面, 建立兩個專案, 第一個專案為提供服務者(將服務提供者註冊到註冊中心), 首先建立第一個專案, 如圖操作:
在這裡插入圖片描述
在這裡插入圖片描述
在Group處填寫包名, Artifact中填寫專案名, 其他預設即可, 直接Next
在這裡插入圖片描述
這裡選擇Web就行了, 一定要選好Spring Boot版本
在這裡插入圖片描述
以上是建立空工程中兩個專案的步驟:
5. 編寫第一個服務提供者專案, 首先在pom.xml中引入相關依賴

        <!--引入dubbo的相關依賴-->
		<dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>0.1.0</version>
		</dependency>

		<!--引入zookeeper的客戶端工具-->
		<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
		<dependency>
			<groupId>com.github.sgroschupf</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.1</version>
		</dependency>

6. 在application.properties配置檔案中配置相應屬性:

#dubbo.application.name表示當前應用的名字
dubbo.application.name=springboot-06-provider-ticker

#dubbo.registry.address表示dubbo要將服務傳送到註冊中心,值為zookeeper的地址,該地址為虛擬機器的zookeeper地址
dubbo.registry.address=zookeeper://這塊為Liunx系統的ip加Zookeeper的埠號

#dubbo.scan.base-packages表示要將那個包下的什麼傳送出去
dubbo.scan.base-packages=com.atguigu.springboot06providerticker.service

7. 編寫service介面及實現類

public interface TickerService {

    public String getTicker();
    
}
/**
 * 註解Service是dubbo的service
 * 該註解的作用是將服務釋出出去
 */
@Component
@Service
public class TickerServiceImper implements TickerService {
    @Override
    public String getTicker() {
        return "<厲害了,我的國>";
    }
}

8. 參考啟動類的註釋

/**
 * provider-ticker專案是供應者
 * consumer-user專案是消費者
 * 1.將服務提供者註冊到註冊中心
 *   1)在pom.xml檔案中匯入dubbo與zookeeper的相關依賴
 *   2)在application.properties配置檔案中配置相應屬性,如:要將那個服務傳送出去,傳送的地址等
 *   3)在service實現類中標註service註解,該註解為dubbo下的
 */
@SpringBootApplication
public class Springboot06ProviderTickerApplication {

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

9. 建立第二個消費者專案, 建立專案的步驟和第4步建立專案一樣, 建立好專案之後, 首先引入pom.xml檔案中的相關依賴:

        <!--引入dubbo的相關依賴-->
		<dependency>
			<groupId>com.alibaba.boot</groupId>
			<artifactId>dubbo-spring-boot-starter</artifactId>
			<version>0.1.0</version>
		</dependency>

		<!--引入zookeeper的客戶端工具-->
		<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
		<dependency>
			<groupId>com.github.sgroschupf</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.1</version>
		</dependency>

10. 在application.properties配置中配置相應屬性:

#dubbo.application.name表示當前應用的名字
dubbo.application.name=consumer-user
#dubbo.registry.address表示dubbo要將服務傳送到註冊中心,值為zookeeper的地址,該地址為虛擬機器的zookeeper地址
dubbo.registry.address=zookeeper://這塊為Liunx系統的ip加Zookeeper的埠號

11. 複製服務提供者專案中service的全路徑, 路徑名要和消費者專案的路徑名一樣, 只需要介面類, 不需要實現類

public interface TickerService {

    public String getTicker();
}

12. 編寫service

/**
 * 引用服務的這塊標註的Service註解是spring下的
 */
@Service
public class UserService {

    /**
     * 註解Reference的作用是遠端引用
     * 過程:根據TckerService類全類名進行匹配,看誰給註冊中心註冊了這個全類名的服務
     */
    @Reference
    TickerService tickerService;

    public void hello(){
        String ticker = tickerService.getTicker();
        System.out.println("買到票了:"+ticker);
    }

}

13. 編寫測試類:

@RunWith(SpringRunner.class)
@SpringBootTest
public class ConsumerUserApplicationTests {

	@Autowired
	UserService userService;
	@Test
	public void contextLoads() {
		userService.hello();
	}

}

14. 過程請參考啟動類註釋

/**
 * provider-ticker專案是提供者
 * consumer-user專案是消費者
 * 引用服務:
 *   1)在pom.xml檔案中匯入dubbo與zookeeper的相關依賴
 *   2)在application.properties配置檔案中配置相應的屬性
 *   3)引用服務
 *    在引用服務時,要將傳送服務專案的全路徑包複製到引用服務的專案中,包的結構要一模一樣,
 *    如這塊的:springboot06providerticker/service
 *    但是不需要傳送服務專案中service的實現類
 */
@SpringBootApplication
public class ConsumerUserApplication {

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

注: 在測試的時候, 一定要先啟動服務提供者, 在啟動服務提供者專案時最後從啟動類中啟動, 保證服務一直是執行狀態, 再啟動消費者專案中的測試類, 在測試類完成之前, 服務提供者專案的啟動類必須一直處於執行狀態