随着流量的增大,常规的垂直框架已经逐渐无法应付,分布式框架应运而生,Dubbo是其中极有代表性的一个,今天我们来尝试手动搭建一个dubbo框架
本次搭建完成得框架开源仓库地址:https://github.com/lmz2559/dubbo_mini
Dubbo
从官网拿一张图来说明dubbo的架构,provider提供服务,在启动的时候向注册中心(中介)说明自己提供什么服务,consumer消费服务,启动的时候,向注册中心询问自己想要的服务。
搭建
我的搭建思路是有common为service提供依赖,service为provider与consumer提供依赖
搭建开始:
1、下载zookeeper并启动(在此不详述)
2、新建一个maven项目,在maven项目下,创建四个module,分别是common、service、provider、consumer
3、引入依赖
common:
<?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.lanly</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<dubbo.version>2.7.3</dubbo.version>
</properties>
<dependencies>
<!--commons -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<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>2.8.0</version>
</dependency>
</dependencies>
</project>
service:将其依赖于common
<?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.heaboy</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--依赖于common-->
<dependency>
<groupId>com.heaboy</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
provider:provider依赖于service
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lanly</groupId>
<artifactId>provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>com.lanly</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
consumer:consumer同样依赖于service
<?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.lanly</groupId>
<artifactId>consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>com.lanly</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4、为 provider与comsumer配置文档,与zookeeper建立连接
provider
#spring服务名
spring.application.name=lanly_provider
#dubbo服务名
dubbo.application.name=dubbo_provider
#注册中心配置
dubbo.registry.protocol=zookeeper
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
#暴露服务地址
dubbo.protocol.port=20881
#扫描service实现类所在包
dubbo.scan.base-packages=com.lanly.provider.**.serviceImpl
consumer
#dubbo服务名
dubbo.application.name=dubbo_consumer
#注册中心配置
dubbo.registry.protocol=zookeeper
dubbo.registry.address=zookeeper://127.0.0.1:2181
#服务端口
server.port=8085
5、在service创建一个测试接口
package com.lanly.service.service;
public interface ITestService {
void test();
}
6、在provider实现测试接口
注意这里使用的service注解是org.apache.dubbo包下的
package com.lanly.provider.serviceImpl;
import com.lanly.service.service.ITestService;
import org.apache.dubbo.config.annotation.Service;
@Service
public class TestServiceImpl implements ITestService {
@Override
public void test() {
System.out.println("进入测试");
}
}
7、在consumer写一个测试controller
注意这里使用的reference注解是org.apache.dubbo包下的
package com.lanly.consumer.controller;
import com.lanly.service.service.ITestService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("")
public class TestController {
@Reference
private ITestService testService;
@ResponseBody
@RequestMapping("/test")
public void test(){
testService.test();
}
}
8、为consumer与provider分别编写一个启动类(此处省略)
启动项目,打开zookeeper的UI插件,发现consumer和provider都已经与zookeeper建立了联系
尝试访问controller,访问成功,provider的控制台打印出了我想要的
至此,本次实验完成。
希望这篇文章能够帮到大家,如果我的文章有问题,欢迎批评指正。如果我有哪里说的不够清楚,也欢迎留言,我们一起讨论学习