springboot整合dubbo分散式專案Demo
阿新 • • 發佈:2018-12-05
架構演變史:
-
單一應用架構
- 當網站流量很小時,只需一個應用,將所有功能都部署在一起,以減少部署節點和成本。
- 此時,用於簡化增刪改查工作量的 資料訪問框架(ORM) 是關鍵。
-
垂直應用架構
- 當訪問量逐漸增大,單一應用增加機器帶來的加速度越來越小,將應用拆成互不相干的幾個應用,以提升效率。
- 此時,用於加速前端頁面開發的 Web框架(MVC) 是關鍵。
- 分散式服務架構
- 當垂直應用越來越多,應用之間互動不可避免,將核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。
- 此時,用於提高業務複用及整合的 分散式服務框架(RPC) 是關鍵。
- 流動計算架構
- 當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個排程中心基於訪問壓力實時管理叢集容量,提高叢集利用率。
- 此時,用於提高機器利用率的 資源排程和治理中心(SOA) 是關鍵。
最近學習springboot,嘗試著整合dubbo,實現分散式遠端呼叫介面
專案採用zookeeper為註冊中心:zookeeper-3.4.7
服務監控:dubbo-admin
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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zcl</groupId> <artifactId>dubbo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>dubbo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <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-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.dubbo.springboot</groupId> <artifactId>spring-boot-starter-dubbo</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.7</version> <!--<exclusions> <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> </plugin> </plugins> </build> </project>
②實體類:
package com.zcl.dubbo.domain; import java.io.Serializable; public class User implements Serializable { private Integer userID; private String userName; private Integer age; public Integer getUserID() { return userID; } public void setUserID(Integer userID) { this.userID = userID; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User{" + "userID=" + userID + ", userName='" + userName + '\'' + ", age=" + age + '}'; } }
③:介面
package com.zcl.dubbo.service;
import com.zcl.dubbo.domain.User;
public interface UserService {
/** 根據id查詢使用者*/
User findUserByUserID(Integer userID);
}
④介面實現:
package com.zcl.dubbo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.zcl.dubbo.domain.User;
import com.zcl.dubbo.service.UserService;
@Service(version = "1.0.0")
public class UserServiceImpl implements UserService {
@Override
public User findUserByUserID(Integer userID) {
User user = new User();
user.setUserID(userID);
user.setUserName("小明");
user.setAge(12);
return user;
}
}
⑤生產者配置
spring:
dubbo:
application: #應用配置,用於配置當前應用資訊,不管該應用是提供者還是消費者。
name: provider
registry: #註冊中心配置,用於配置連線註冊中心相關資訊。
address: zookeeper://127.0.0.1:2181
protocol: #協議配置,用於配置提供服務的協議資訊,協議由提供方指定,消費方被動接受。
name: dubbo
port: 20880
scan: com.zcl.dubbo #服務暴露與發現消費所在的package
2.消費者consumer
專案結構圖:實體類和介面均與生產者相同
①依賴:
<?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.zcl</groupId>
<artifactId>dubbox-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dubbox-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot Dubbo 依賴 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<!-- <exclusions>
<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>
</plugin>
</plugins>
</build>
</project>
2.消費者配置:
server:
port: 8081
spring:
dubbo:
application: #應用配置,用於配置當前應用資訊,不管該應用是提供者還是消費者。
name: consumer
registry: #註冊中心配置,用於配置連線註冊中心相關資訊。
address: zookeeper://127.0.0.1:2181
protocol:
name: dubbo
port: 20880
scan: com.zcl.dubbo.controller #服務暴露與發現消費所在的package
③控制層
package com.zcl.dubbo.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.zcl.dubbo.domain.User;
import com.zcl.dubbo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Reference(version = "1.0.0")
private UserService userService;
@RequestMapping("/findUser")
public String findUser() {
return userService.findUserByUserID(2).toString();
}
}