dubbo+zookeeper的简单demo
首先放上dubbo官网 dubbo.apache.org ,官网的介绍还是比较全面的。
1、分布式服务架构简介
当垂直应用程序越来越多时,应用程序之间的交互是不可避免的,一些核心业务被提取出来并作为独立的服务提供服务,逐渐形成一个稳定的服务中心,这样前端应用程序可以更好地响应不断变化的市场需求。很快。此时,用于业务重用和集成的分布式服务框架(RPC)是关键。
Provider:服务提供方
Consumer:服务消费者
Registry:注册中心
Monitor:统计服务调用次数和调用时间的监控中心
Container:容器管理服务的生命周期
调用流程
0.启动服务提供者。
1.服务提供者在启动时,向注册中心注册自己提供的服务。
2.服务消费者在启动时,向注册中心订阅自己所需的服务。
3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
注册中心
服务提供方:针对所提供的服务到注册中心发布。
服务消费方:到服务中心订阅所需的服务。
对于任何一方,不论服务提供方或者服务消费方都有可能同时兼具两种角色,即需要提供服务也需要消费服务。
2、安装zookeeper
官网下载zookeeper,下载好之后解压打开解压后的文件夹,新建data和log的文件夹。进入conf目录,拷贝zoo_sample.cfg,重命名为zoo.cfg。使用文本编辑器打开zoo.cfg,更改dataDir=/tmp/zookeeper为(data和log所在路径)
dataDir=H:\tools\apache-zookeeper-3.6.1-bin\conf
dataLogDir=H:\tools\apache-zookeeper-3.6.1-bin\log
进入bin目录,双击zkServer.cmd启动
3、安装dubbo-admin
下载dubbo-admin,解压并进入dubbo-admin文件夹,在空白处shift+右键,打开dos命令,执行
mvn package -Dmaven.skip.test=true
将打好的war包放入tomcat的webapps目录下,双击startup.bat启动tomcat,会在webapps下生成解压war包后文件夹,关掉tomcat启动窗口,进入webapps\dubbo-admin-2.6.0\WEB-INF,文本编辑器打开dubbo.properties,输入一下配置并保存。
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
删掉ROOT,将dubbo-admin-2.6.0文件夹重命名为ROOT。双击startup.bat启动tomcat。访问http://localhost:8080,账号密码都是root
4、创建父工程demo-dubbo
新建maven工程
修改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.tao</groupId>
<artifactId>demo-dubbo</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<!-- module是该工程下的所有子模块-->
<modules>
<module>demo-dubbo-api</module>
<module>demo-dubbo-provider</module>
<module>demo-dubbo-consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
</project>
5、父工程下创建子模块demo-dubbo-api
在demo-dubbo工程下新建子模块demo-dubbo-api,同样是maven项目,修改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">
<parent>
<artifactId>demo-dubbo</artifactId>
<groupId>com.tao</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-dubbo-api</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<!--com.dubbo-springBoot依赖 -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
</project>
新建接口TestService.java
package com.tao.service;
public interface TestService {
String test();
}
6、父工程下创建子模块demo-dubbo-provider
在demo-dubbo工程下新建子模块demo-dubbo-provider,这次新建springboot项目。
修改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>
<artifactId>demo-dubbo-provider</artifactId>
<parent>
<groupId>com.tao</groupId>
<artifactId>demo-dubbo</artifactId>
<version>1.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.tao</groupId>
<artifactId>demo-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
修改application.properties如下
server.port=8001
spring.dubbo.application.id=demo-dubbo-provider
spring.dubbo.application.name=demo-dubbo-provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.server=true
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
新建TestService.java的实现类TestServiceImpl.java
package com.tao.demodubboprovider.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.tao.service.TestService;
import org.springframework.stereotype.Component;
@Service(interfaceClass = TestService.class)
@Component
public class TestServiceImpl implements TestService {
public String test() {
return "Hello world";
}
}
在启动类DemoDubboProviderApplication.java上加上注解@EnableDubboConfiguration
package com.tao.demodubboprovider;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfiguration
public class DemoDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DemoDubboProviderApplication.class, args);
}
}
7、父工程下创建子模块demo-dubbo-consumer
在demo-dubbo工程下新建子模块demo-dubbo-consumer,这次也是新建springboot项目。
修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>demo-dubbo-consumer</artifactId>
<parent>
<groupId>com.tao</groupId>
<artifactId>demo-dubbo</artifactId>
<version>1.0.0</version>
</parent>
<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>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.tao</groupId>
<artifactId>demo-dubbo-api</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
修改application.properties如下
server.port=8002
#Dubbo 服务消费者配置
spring.dubbo.application.name=demo-dubbo-consumer
spring.dubbo.application.id=demo-dubbo-consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.port=20800
spring.dubbo.protocol.name=dubbo
新建TestController.java
package com.tao.demodubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.tao.service.TestService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestController {
@Reference
public TestService testService;
@ResponseBody
@RequestMapping("/")
public String test(){
return testService.test();
}
}
在启动类DemoDubboConsumerApplication.java上加上注解@EnableDubboConfiguration
8、启动项目
运行DemoDubboProviderApplication.java和DemoDubboConsumerApplication.java启动项目。观察dubbo-admin,访问localhost:8002。成功
9、各项目maven依赖结构
10、代码地址
https://github.com/zhangtao8023/dubbo-demo