在 Spring 框架中使用 Dubbo
在 Spring 框架中使用 Dubbo
參考網址
http://dubbo.apache.org/zh-cn/ Dubbo 官網
http://dubbo.apache.org/zh-cn/docs/user/quick-start.html Dubbo 文件
框架組成
spring 5.1.3 + zookeeper 3.6.2 + dubbo 2.6.5;
工具:IDEA 2019.1.2
Dubbo 體系結構
執行流程:
-
啟動註冊中心:例如 zookeeper,接受 provider 的註冊,接受 consumer 的訂閱,當 provider 有變化的時候,會主動通知 consumer;
-
啟動Provider:provider是服務的提供者,例如提供 com.xian.service.impl.UserServiceImpl 這個服務,它是服務的具體實現,provider 啟動的時候會向 zookeeper 這個註冊中心註冊,表明自己可以提供哪些服務;
-
啟動Consumer:consumer 是服務的消費者,例如通過 com.xian.controller.UserController 去呼叫 UserServiceImpl,consumer 啟動的時候會去 zookeeper 這個註冊中心 訂閱自己需要的服務;
-
啟動Registry:註冊中心,例如 zookeeper,接受 provider 的註冊,接受 consumer 的訂閱,當 provider 有變化的時候,會主動通知 consumer;
-
consumer 呼叫 provider 的具體服務,例如 UserController 呼叫 UserServiceImpl,但是具體由那一臺 provider 伺服器提供服務,取決於 負載均衡排程演算法;
-
Monitor:監控中心,統計服務被呼叫的次數和時間,服務的消費者和提供者會在記憶體中累計呼叫次數和
呼叫時間,定時每分鐘向監控中心傳送一次統計資料;
建立 Project
選單欄:File| New Project, 建立一個空的 Project
填 Project 的名稱和存放路徑,然後點選右下角的【Finish】:
要在這個 Project 下建立 3 個子 module,最終目錄 module 結構如下:
工程:dubbo-spring-common
建立工程
填專案的座標:GroupId, ArtifactId
工程結構
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> <groupId>com.xian</groupId> <artifactId>dubbo-spring-common</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> </project>
User.java
package com.xian.entity;
import java.io.Serializable;
/**
* Author: xian
* Date: 2020-10-19 21:02
* Description: 描述
*/
public class User implements Serializable {
private Integer id;
private String username;
private String password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
UserService.java
package com.xian.service;
import com.xian.entity.User;
/**
* Author: xian
* Date: 2020-10-19 21:04
* Description: 描述
*/
public interface UserService {
public User findById(int id);
}
工程:dubbo-spring-provider
建立工程
父 module 和父工程全部選【None】:
填專案的座標:GroupId, ArtifactId
工程結構
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>
<groupId>com.xian</groupId>
<artifactId>dubbo-spring-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 依賴於 dubbo-spring-common -->
<dependency>
<groupId>com.xian</groupId>
<artifactId>dubbo-spring-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 依賴於 spring 的 4 個包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo 的核心包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<!-- zookeeper 核心包 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
<!-- zookeeper 的客戶端實現 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<properties>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
</project>
provider.xml
<?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.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 配置應用程式的名稱,一般使用專案名 -->
<dubbo:application name="dubbo-spring-provider"/>
<!-- 指定註冊中心 zookeeper 的地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!-- 協議和開放的訪問埠-->
<dubbo:protocol name="dubbo" port="8888"/>
<!-- 配置要暴露的埠-->
<dubbo:service interface="com.xian.service.UserService" ref="userService"/>
<bean id="userService" class="com.xian.service.impl.UserServiceImpl"/>
</beans>
UserServiceImpl.java
package com.xian.service.impl;
import com.xian.entity.User;
import com.xian.service.UserService;
/**
* Author: xian
* Date: 2020-10-19 21:22
* Description: 描述
*/
public class UserServiceImpl implements UserService {
@Override
public User findById(int id) {
System.out.println("UserServiceImpl.findById");
User user = new User();
user.setId(id);
user.setUsername("xian");
user.setPassword("123");
return user;
}
}
Test.java
這是測試程式
package com.xian;
import javassist.ClassPath;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
/**
* Author: xian
* Date: 2020-10-19 22:17
* Description: 描述
*/
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:provider.xml");
new Scanner(System.in).next();
}
}
工程:dubbo-spring-consumer
建立工程
建立 ioc 容器檔案:consumer.xml
建立後的效果:
工程結構
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>
<groupId>com.xian</groupId>
<artifactId>dubbo-spring-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 依賴於 dubbo-spring-common -->
<dependency>
<groupId>com.xian</groupId>
<artifactId>dubbo-spring-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- spring 的 4 個核心包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo 核心包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.5</version>
</dependency>
<!-- zookeeper 的客戶端實現 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<properties>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
</project>
consumer.xml
<?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.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-spring-consumer"/>
<dubbo:reference id="userService" interface="com.xian.service.UserService" retries="3" check="false" url="dubbo://127.0.0.1:8888"/>
<bean class="com.xian.controller.UserController">
<property name="userService" ref="userService"/>
</bean>
</beans>
UserController.java
package com.xian.controller;
import com.xian.entity.User;
import com.xian.service.UserService;
/**
* Author: xian
* Date: 2020-10-19 22:24
* Description: 描述
*/
public class UserController {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public void findUser() {
User user = userService.findById(1001);
System.out.println(user);
}
}
Test.java
package com.xian;
import com.xian.controller.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
/**
* Author: xian
* Date: 2020-10-19 22:39
* Description: 描述
*/
public class Test {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:consumer.xml");
UserController userController = ac.getBean(UserController.class);
userController.findUser();
new Scanner(System.in).next();
}
}
啟動 zookeeper
啟動 dubbo-spring-provider
開啟 Test.java (dubbo-spring-provider) ,按 Ctrl + Shift + F10,或者右鍵 【Run 'Test main'】執行此檔案;
啟動 dubbo-spring-consumer
開啟 Test.java (dubbo-spring-consumer) ,按 Ctrl + Shift + F10,或者右鍵 【Run 'Test main'】執行此檔案;
列印
Test.java (dubbo-spring-provider) 列印:
Test.java (dubbo-spring-consumer) 列印:
可以看到,consumer 訪問了 provider 提供的服務;