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