原因
因為公司的項目一直用的都是分布式項目,而我只知道用,卻不知道怎么去搭建,就整的很煩,逐漸暴躁。這兩天一直都在找怎么搭建,因為自己的原因,所以一直搭建不成功,來來回回刪了五六遍,也重建了很多次。
推薦
萬幸我一直沒有放棄,搜了兩個文章,結合去搭建,終於成功。
dubbo項目搭建:https://blog.csdn.net/mapboo/article/details/106682815
多模塊項目的搭建:https://blog.csdn.net/tangthh123/article/details/106837999
Dubbo配置:https://www.jianshu.com/p/150c11275a9e
搭建
提示
父層使用springboot框架,子層provider和customer使用springboot框架,api隨意。
1、框架創建
創建過程中不選擇任何依賴。創建完成后刪除文件(除.idea、pom.xml、springboot-dubbo-demo.iml外)。
然后點擊左上角-》新建-》新模塊,按照創建springboot的方式創建dubbo-api、dubbo-provider、dubbo-customer三個子模塊。
其中api模塊,我只用於放置enity、servic,主要用於實體類、service接口;
provider模塊,用於放置serviceImpl,主要用於邏輯處理、操作數據庫;
customer模塊,用於放置controller,主要用於為前端頁面提供接口。 按照這樣的思路,在創建子模塊的時候請自行按照需求添加依賴。
2、父層配置
創建完之后的項目框架是這樣的,先配置父層pom `
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent><!--使用springboot項目創建完自帶的,參考多個版本創建項目的經驗才知道的--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>springboot-dubbo-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-dubbo-demo</name> <description>springboot-dubbo-demo</description> <packaging>pom</packaging><!--父層打包方式為pom,默認為jar--> <properties> <java.version>1.8</java.version> </properties> <modules><!--添加三個子模塊--> <module>dubbo-api</module> <module>dubbo-provider</module> <module>dubbo-customer</module> </modules> <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><!--這里是打包時可能會因為test塊導致項目編譯不了,所以需要排除test塊的編譯,也可點擊maven窗口的類似於閃電--> <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、api層配置
api層只提供接口,或者實體類,所以不需要啟動類和配置文件,可刪除(根據個人意願,不刪也沒事)。pom文件基本沒什么可以動的,屬於模塊添加好就有的。
<?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 https://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.5.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> <name>dubbo-api</name> <description>dubbo-api</description> <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> <!-- 僅需要被調用,不需要jar包--> <configuration> <skip>true</skip> </configuration> </plugin> </plugins> </build> </project>
根據以上借鑒的教程創建service
public interface HelloService { String sayHello(String name); }
4、provider層
首先先動pom
<?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 https://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.5.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>dubbo-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <name>dubbo-provider</name> <description>dubbo-provider</description> <properties> <java.version>1.8</java.version> <!-- 鎖定版本,在下方的依賴中統一調用--> <zookeeper.version>3.4.13</zookeeper.version> <dubbo.version>0.2.0</dubbo.version> </properties> <dependencies> <!-- 按照provider調用api,customer調用provider的順序,需要在調用者的pom導入被調用者的依賴,參數在被調用者pom的parent下--> <dependency> <groupId>com.example</groupId> <artifactId>dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </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> <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> <!-- log4j 和 slf4j-log4j12 需要排除,否則會與zookeeper沖突;--> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 指定啟動類--> <mainClass>com.example.dubboprovider.DubboProviderApplication</mainClass> </configuration> </plugin> </plugins> </build> </project>
properties.yml的配置
server: port: 8091 dubbo: application: name: dubbo-provider protocol: name: dubbo port: 20880 registry: address: zookeeper://127.0.0.1:2181 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true username: root password: 123456
在resources下新建一個dubbo-provider.xml文件,用於存放調用的service
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!--注冊服務到zookeeper--> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <!-- 用dubbo協議在20880端口暴露服務 --> <dubbo:protocol name="dubbo" port="20880"/> <dubbo:service ref="helloService" interface="com.example.dubboapi.service.HelloService"/> </beans>
啟動類注明dubbo-provider.xml的位置
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @EnableDubbo @ImportResource({"classpath:dubbo-provider.xml"}) @SpringBootApplication public class DubboProviderApplication { public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); } }
實現類在調用時需要在@Service注明service的名字,dubbo-provider.xml的ref
import com.example.dubboapi.service.HelloService; import org.springframework.stereotype.Service; @Service("helloService") public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { System.out.println(name); return "Hello, " + name; } }
項目接口如下
5、customer模塊
先配置pom
<?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 https://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.5.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>dubbo-customer</artifactId> <version>0.0.1-SNAPSHOT</version> <name>dubbo-customer</name> <description>dubbo-customer</description> <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.example</groupId> <artifactId>dubbo-provider</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.example</groupId> <artifactId>dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </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> <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> <!-- log4j 和 slf4j-log4j12 需要排除,否則會與zookeeper沖突;--> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.example.dubbocustomer.DubboCustomerApplication</mainClass> </configuration> </plugin> </plugins> </build> </project>
properties.yml的配置
server: port: 8092 dubbo: application: name: dubbo-customer registry: address: zookeeper://127.0.0.1:2181 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true username: root password: 123456
在resources下新建一個dubbo-customer.xml文件,用於存放調用的service
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 系統服務 --> <dubbo:reference id="helloService" interface="com.example.dubboapi.service.HelloService" check="false" protocol="dubbo"/> </beans>
啟動類注明dubbo-customer.xml的位置
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; @ImportResource({"classpath:dubbo-customer.xml"}) @SpringBootApplication public class DubboCustomerApplication { public static void main(String[] args) { SpringApplication.run(DubboCustomerApplication.class, args); } }
controller的編寫
import com.example.dubboapi.service.HelloService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Autowired private HelloService helloService; @GetMapping("/sayHello") private String sayHello(@RequestParam String name){ System.out.println("調用sayHello成功了..." + " name:" + name); return helloService.sayHello(name); } }
項目結構如下:
這時,大概就配置完成了,先啟動provider,再啟動customer(前提是zookeeper是開啟的,不然項目無法啟動)
地址欄輸入http://localhost:8092/sayHello?name=一語驚醒夢中人