前言:
好久沒有使用dubbo了,溫習一下。
一、先搭建一個SpringCloud框架
整體框架如下圖
1. 先創建一個父工程:
<?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><groupId>com.fan</groupId><artifactId>springclouddubbo</artifactId><version>1.0-SNAPSHOT</version><modules><module>provider</module><module>consumer</module><module>common</module></modules><packaging>pom</packaging><!-- 統一管理jar包版本 --><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><junit.version>4.12</junit.version><log4j.version>1.2.17</log4j.version><lombok.version>1.16.18</lombok.version><mysql.version>5.1.47</mysql.version><druid.version>1.1.16</druid.version><mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version></properties><!-- 子模塊繼承之后,提供作用:鎖定版本+子modlue不用寫groupId和version --><dependencyManagement><dependencies><!--spring boot 2.2.2--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.2.2.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--spring cloud Hoxton.SR1--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.boot.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><optional>true</optional></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><fork>true</fork><addResources>true</addResources></configuration></plugin></plugins></build></project>
注意:剛創建時還沒有?<modules>
2. 子工程 provider
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.8.RELEASE</version></dependency></dependencies>
ProviderApplication啟動類:
@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}
?3. 子工程 consumer
pom同上,ConsumerApplication啟動類:
@SpringBootApplication
public class ConsumerApplication {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}
4. 分別創建對應的controller與service
provider
@Service
public class UserService {public String getUser() {return "user";}
}
@RestController
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/user")public String getUser() {return userService.getUser();}
}
consumer
@Service
public class OrderService {// 使用restTemplate,調用服務提供者的Controller方法@Autowiredprivate RestTemplate restTemplate;public String getUser() {String forObject = restTemplate.getForObject("http://localhost:8080/user", String.class);return forObject;}
}
@RestController
public class UserController {@Autowiredprivate OrderService orderService;@GetMapping("/order")public String getUser() {return orderService.getUser();}
}
分別啟動provider、consumer,訪問?http://localhost:8081/order?查看是否成功。
二、改造Dubbo
1.為provider、consumer添加pom依賴
添加dubbo核心依賴、添加要使用的協議的依賴、添加要使用的注冊中心依賴,這里我使用nacos作為注冊中心需要引入倆個依賴。
<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>3.0.7</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-rpc-dubbo</artifactId><version>3.0.7</version></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-registry-zookeeper</artifactId><version>3.0.7</version></dependency>
2.配置dubbo相關的基本信息
?配置application.properties,注意修改consumer對應的name
server.port=8081
dubbo.application.name=provider-application
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dobbo.protocol.host=127.0.0.1
dubbo.registry.address=zookeeper://127.0.0.1:2181
server.port=8082dubbo.application.name=consumer-application
dubbo.registry.address=zookeeper://127.0.0.1:2181
3. 改造項目
由于dubbo是面向接口的形式,所以我們不在使用?RestTemplate 要替換為對應的服務接口。
(1)修改provider
? ? ? ? 創建userseivce接口
public interface UserService {public String getUser();
}
????????實現該接口
// 可以為Dubbo服務添加對應的版本
@DubboService(version = "1.0")
public class UserServiceImpl implements UserService {public String getUser() {return "user";}
}
@DubboService:SpringBoot將添加該注解的方法發布為Dubbo服務。
由于我們要提供服務接口,所以?provider中的controller已經沒有用了,這里可以刪除了。
(2)創建公共模塊,抽象服務接口
創建公共模塊,common,將provider中的?UserService移動到common中
為provider、consumer添加公共模塊的依賴
<dependency><groupId>com.fan</groupId><artifactId>common</artifactId><version>1.0-SNAPSHOT</version></dependency>
(3)修改consumer
@Service
public class OrderService {@DubboReferenceprivate UserService userService;public String getUser() {return userService.getUser();}
}
-
@DubboReference:注入遠程服務的代理對象。
(4)啟動類開啟@EnableDubbo
@EnableDubbo:用于掃描@DubboService(加在啟動類上,就會掃描啟動類所在包及其子包內的所有@DubboService),并把對應的對象實例化,發布成RPC服務。
@DubboComponentScan:如果需要掃描其他包下的注解使用。
在yml配置文件中,掃描包dubbo.scan.base-packages等同于@EnableDubbo注解
4. 啟動項目
先啟動?provider、再啟動consumer,瀏覽器訪問:http://localhost:8082/order