windows下dubbo-admin和zookeeper安装部署
官网地址:
http://mirrors.cnnic.cn/apache/zookeeper/zookeeper
比如:G:\zhq_foresee\work\dubbo\zookeeper
复制zookeeper\conf目录下的zoo_sample.cfg文件改名为zoo.cfg,无需做其他修改。
zoo.cfg配置了zookeeper的相关参数
说明:
clientPort:监听客户端连接的端口。
tickTime:基本事件单元,以毫秒为单位。它用来控制心跳和超时,默认情况下最小的会话超时时间为两倍的 tickTime。
我们可以对配置文件的端口等或者进行高级配置和集群配置例如:maxClientCnxns:限制连接到 ZooKeeper 的客户端的数量等
启动zookeeper
打开cmd,进入zookeeper\bin目录,直接双击zkServer.cmd文件或者执行zkServer.cmd命令
启动成功后的输出:
- 安装dubboadmin
- 下载dubbo-admin-2.5.3
官网:http://dubbo.io/Download-zh.htm
将解压后的dubbo-admin-2.5.3拷贝到tomcat的apache-tomcat-6.0.35\webapps目录下,
然后将dubbo-admin-2.5.3目录名称改为ROOT
dubboadmin下的一个dubbo.properties文件配置了指向zookeeper的参数
打开cmd,进入apache-tomcat\\bin目录,输入startup.bat命令,即可启动tomcat.
打开浏览器,输入http://127.0.0.1:8080/,输入帐号密码root/root。进入
@注:基于zookeeper为3.4.6版本,dubbo在版本2.5.3以下时,jdk用<= 1.7
版本 2.6.0时,可用jdk8
调用程序
1. 简化流程图
此流程图是一个简化的流程图,主要描述dubbo调用的全过程。
RPC调用时,Consumer根据负载均衡算法获取invoker,在执行完filter链以后,就开始平装数据,发送数据到socket中,consumer这一端通过ReentrantLock进入await状态。
Provider从socket获取数据后,执行receive方法, 接着执行Filter链,接着找到invoker通过代理对象执行Service,最后将返回结果写入socket。
Consumer收到返回结果以后,唤醒之前await的内容,然后将返回结果返回给调用方。
服务样例(HelloWorld):
自我理解:
dubbo+zokkerper服务相当于一监控服务(可以监控提供者和消费者,同时也可做限制措施,负载均衡)。
提供者(生产者) ---- 提供数据和处理结果,一般作于底层数据处理和数据库打交道。
消费者 ---- 提供服务调用,一般多为API接口。通过它来调用生产者。
生产者和消费者,通过注册的服务接口(service),来相互通信。
服务接口(service),可写为公共项目,进行嵌套,以供生产者和消费者共同使用。
提供者(dubbo-provider):
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.hw.dubbo.provider</groupId> <artifactId>dubbo-provider</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
<name>dubbo-provider</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>
<!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.4.10</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
DubboProviderApplication:
package com.hw.dubbo.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource;
@SpringBootApplication @ImportResource(value = {"classpath:providers.xml"}) public class DubboProviderApplication {
public static void main(String[] args) { SpringApplication.run(DubboProviderApplication.class, args); } } |
providers.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://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 配置可参考 http://dubbo.io/User+Guide-zh.htm --> <!-- 服务提供方应用名,用于计算依赖关系 --> <dubbo:application name="dubbo-provider" owner="dubbo-provider"/> <!-- 定义 zookeeper 注册中心地址及协议 --> <dubbo:registry protocol="zookeeper" address="192.168.0.133:2181" client="zkclient"/> <!-- 定义 Dubbo 协议名称及使用的端口,dubbo 协议缺省端口为 20880,如果配置为 -1 或者没有配置 port,则会分配一个没有被占用的端口 --> <dubbo:protocol name="dubbo" port="-1"/> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.hw.dubbo.remote.TestService" ref="testService" timeout="10000"/> <!-- 和本地 bean 一样实现服务 --> <bean id="testService" class="com.hw.dubbo.provider.impl.TestServiceImpl" /> </beans> |
消费者(dubbo-consumer):
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.hw.dubbo.consumer</groupId> <artifactId>dubbo-consumer</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
<name>dubbo-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>
<!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.4.10</version> <exclusions> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> <exclusions> <exclusion> <artifactId>slf4j-log4j12</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
TestController:
package com.hw.dubbo.consumer; import com.hw.dubbo.remote.TestService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody;
@Controller public class TestController {
@Autowired private TestService testService;
@ResponseBody @RequestMapping("/hello") public String hello(){ return "hello world"; }
@ResponseBody @RequestMapping(value = "/sayHello",method = RequestMethod.GET) public String sayHello(){ System.out.println("controller test"); System.out.println(testService.sayHello("world")); return "test successful"; } } |
DubboConsumerApplication:
package com.hw.dubbo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ImportResource;
@SpringBootApplication @ImportResource(value = {"classpath:consumers.xml"}) public class DubboConsumerApplication {
public static void main(String[] args) { SpringApplication.run(DubboConsumerApplication.class, args); } } |
consumers.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://code.alibabatech.com/schema/dubbo" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- 配置可参考 http://dubbo.io/User+Guide-zh.htm --> <!-- 服务提供方应用名,用于计算依赖关系 --> <dubbo:application name="dubbo-consumer" owner="dubbo-consumer"/> <!-- 定义 zookeeper 注册中心地址及协议 --> <dubbo:registry protocol="zookeeper" address="192.168.0.133:2181" client="zkclient"/> <!-- 定义 Dubbo 协议名称及使用的端口,dubbo 协议缺省端口为 20880,如果配置为 -1 或者没有配置 port,则会分配一个没有被占用的端口 --> <dubbo:protocol name="dubbo" port="-1"/> <!-- 生成远程服务代理,可以和本地 bean 一样使用 testService --> <dubbo:reference id="testService" interface="com.hw.dubbo.remote.TestService" /> </beans> |
公共接口(interface)和实现类:
package com.hw.dubbo.remote;
public interface TestService { String sayHello(String name); } |
|
package com.hw.dubbo.provider.impl; import com.hw.dubbo.remote.TestService; public class TestServiceImpl implements TestService { @Override public String sayHello(String name) { return "test" + name + "!"; } } |
@注: 两个服务的端口,provider - 8011,consumer - 8012。
测试:
通过客户端调用:
http://127.0.0.1:8012/sayHello