基於SpringBoot+Dubbo+Zookeeper+Maven+IDEA搭建分散式專案實戰
1.環境搭建:
2.專案搭建:
2、開啟IDEA開發工具,建立一個基於maven的SpringBoot的父專案,然後基於父專案建立三個子模組module,最終專案結構如下圖:
1)開啟父專案pom.xml檔案,新增剛才建立的三個子模組,如下圖完整程式碼:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.demo</groupId>
<artifactId>spring-dubbo-demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>dubboapi</module>
<module>dubboprovider</module>
<module>dubbocustomer</module>
</modules>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:<packaging>pom</packaging> 需要手動新增。
2)dubbo-api模組中新增服務介面類HelloService,程式碼如下:
package com.demo.api.service; public interface HelloService { String sayHello(String name); }
dubbo-api中pom.xml程式碼如下:
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.demo</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
結構目錄如下圖:
3)dubbo-provider模組中新增實現介面類HelloServiceImpl,程式碼如下:
package com.demo.provider.service.impl; import com.alibaba.dubbo.config.annotation.Service; import com.demo.api.service.HelloService; /** * @author youqc * @version V1.0 * @Description: (用一句話描述該檔案做什麼) * @date 2021/7/21 */ @Service //@Service 是dubbo釋出服務的註解 public class HelloServiceImpl implements HelloService{ @Override public String sayHello(String name) { return "Hello,"+name; } }
dubbo-provider中DubboProviderApplication啟動類新增dubbo註解,程式碼如下:
package com.demo.provider; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author youqc * @version V1.0 * @Description: (用一句話描述該檔案做什麼) * @date 2021/7/21 */ @SpringBootApplication @EnableDubbo //@EnableDubbo 是啟動dubbo服務註解; public class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); } }
dubbo-provider中pom.xml程式碼如下:
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.demo</groupId> <artifactId>provider</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> <zookeeper.version>3.4.13</zookeeper.version> <dubbo.version>0.2.0</dubbo.version> </properties> <dependencies> <dependency> <groupId>com.demo</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
dubbo-provider中application.yml配置內容如下:
server: port: 8091 dubbo: application: name: dubbo-provider protocol: name: dubbo port: 20884 registry: address: zookeeper://127.0.0.1:2181
結構目錄如下圖:
注意:
@Service 是dubbo釋出服務的註解;
@EnableDubbo 是啟動dubbo服務註解;
log4j 和 slf4j-log4j12 需要排除,否則會與zookeeper衝突;
4)dubbo-customer模組中新增控制類HelloController,便於測試,程式碼如下:
package com.demo.customer.controller; import com.alibaba.dubbo.config.annotation.Reference; import com.demo.api.service.HelloService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * @author youqc * @version V1.0 * @Description: (用一句話描述該檔案做什麼) * @date 2021/7/21 */ @RestController public class HelloController { @Reference //@Reference 是dubbo引用服務的註解 private HelloService helloService; @GetMapping("/sayHello") private String sayHello(@RequestParam String name){ System.out.println("呼叫成功"); return helloService.sayHello(name); } }
dubbo-customer中pom.xml程式碼如下:
<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.5</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.demo</groupId> <artifactId>dubbo-customer</artifactId> <version>1.0-SNAPSHOT</version> <properties> <java.version>1.8</java.version> <zookeeper.version>3.4.13</zookeeper.version> <dubbo.version>0.2.0</dubbo.version> </properties> <dependencies> <dependency> <groupId>com.demo</groupId> <artifactId>dubbo-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>${dubbo.version}</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
dubbo-customer中application.yml配置內容如下:
server: port: 8092 dubbo: application: name: dubbo-customer registry: address: zookeeper://127.0.0.1:2181
結構目錄如下圖:
注意:
@Reference 是dubbo引用服務的註解;
至此,基於dubbo的分散式專案框架就搭建完成了。
三、專案消費-服務功能測試:
1)首先執行啟動服務提供者dubbo-provider子模組
2)然後啟動服務消費者dubbo-customer子模組
3)測試網址路徑:http://localhost:8090/sayHello?name=12312