一、简介
基于Dubbo + ZooKeeper实现的分布式架构,调用接口方法就像调用本地方法一样调用远程服务。
来自Dubbo官网的架构图:
节点 | 角色说明 |
---|---|
Provider |
暴露服务的服务提供方 |
Consumer |
调用远程服务的服务消费方 |
Registry |
服务注册与发现的注册中心 |
Monitor |
统计服务的调用次数和调用时间的监控中心 |
Container |
服务运行容器 |
Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。
二、搭建Zookeeper注册中心详细步骤参考:
https://www.cnblogs.com/sun-flower1314/p/11341499.html
三、创建三个maven工程:接口工程;服务端工程;客户端工程。服务端和客户端去依赖接口工程。
接口工程的作用:定义服务接口,供消服务消费者和提供者使用
1. 创建接口工程的步骤:
1)以maven用jar包的方式创建
2)创建完工程后,定义服务接口
package com.hxc.dubbo.demo; public interface DemoService { String sayHello(String name); }
2. 创建服务端工程的步骤:
1)和创建接口工程相同,packaging项选择war包的形式
2)以war包形式创建后,项目的pom.xml文件会报错:
web.xml is missing and <failOnMissingWebXml> is set to true,原因是没有web.xml文件。
解决错误的方法:
①右击项目,选择Properties ——> Project Facets ——> 将Dynamic Web Module选项去掉,然后选择Apply:
② 再次选中Dynamic Web Module,点击下方的Futher configuration available...进行配置web.xml,在弹出的界面中,在Content directory项填入:src/main/webapp,依次点击ok-> Apply -> Apply and close
3) 项目创建完成后,在pom.xml中依赖接口工程(即依赖由1创建的接口工程)
或者直接自己手动敲:
<dependency> <groupId>com.hxc.dubboInterfaceDemo</groupId> <artifactId>dubboInterfaceDemo</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
4)添加相应的其他依赖jar包
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.8</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.5</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
5)创建服务的接口实现类
package com.hxc.dubbo.demo.provider; import com.hxc.dubbo.demo.DemoService; public class DemoServiceImpl implements DemoService { public String sayHello(String name) { return " Hello " + name; } }
6)增加配置文件 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://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"> <!-- 提供方应用信息,用于计算依赖关系 --> <dubbo:application name="hello-world-app" /> <!-- 使用multicast广播注册中心暴露服务地址 方式为: <dubbo:registry address="multicast://224.5.6.7:1234" />--> <!-- 采用zookeeper的方式 --> <dubbo:registry address="192.168.202.132:2181" protocol="zookeeper" /> <!-- 用dubbo协议在20880端口暴露服务 --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="com.hxc.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 --> <bean id="demoService" class="com.hxc.dubbo.demo.provider.DemoServiceImpl" /> </beans>
7) 测试提供服务的是否能连接通
测试方式一:写测试代码
package com.hxc.demo.test; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ProviderTest { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml"); context.start(); System.in.read(); // 按任意键退出 } }
测试方式二:在web.xml中增加 加载配置文件的 provider.xml 的参数,再将项目添加至tomcat跑起来,查看zookeeper服务中是否已经注册
在web.xml中:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!-- needed for ContextLoaderListener --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:provider.xml</param-value> </context-param> <!-- Bootstraps the root web application context before servlet initialization --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
测试通过后,在zookeeper端可以查看服务注册是否成功,若看到下图对应的值,则说明联接成功:
3. 创建客户端工程的步骤:
1)创建客户端工程和创建服务端工程的步骤相同(1-3步骤)
2)创建完成后,添加依赖jar包
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.8</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.5</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.10.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>
3)增加配置文件,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://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"> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> <dubbo:application name="consumer-of-helloworld-app" /> <!-- 使用multicast广播注册中心暴露发现服务地址 <dubbo:registry address="multicast://224.5.6.7:1234" /> --> <!-- 采用zookeeper的方式 --> <dubbo:registry address="192.168.202.132:2181" protocol="zookeeper" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="demoService" interface="com.hxc.dubbo.demo.DemoService" /> </beans>
4) 测试客户端
注:测试时,一定要先启动服务端在zookeeper上注册完接口,然后再测试客户端
测试方式一:直接写测试代码,运行后在控制台能够看到 Hello world
package com.hxc.dubbo.demo.test; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.hxc.dubbo.demo.DemoService; public class ConsumerTest { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml"); context.start(); DemoService demoService = (DemoService)context.getBean("demoService"); // 获取远程服务代理 String hello = demoService.sayHello("world"); // 执行远程方法 System.out.println( hello ); // 显示调用结果 } }
测试方式二:在web.xml中增加 加载配置文件的 consumer.xml 的参数,再将项目添加至tomcat跑起来,查看zookeeper服务中是否已经注册
在web.xml中:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5" > <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:demo-service-consumer.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
5)再zookeeper服务中心查看结果:
到此就基本完成了整个服务的搭建,至于dubbo更加详细的API,请参考dubbo官方文档。
关于Dubbo的官方API:https://dubbo.gitbooks.io/dubbo-user-book/ 非常全面详细的教程
记得点个赞哦 谢谢
原文:https://www.cnblogs.com/sun-flower1314/p/11344896.html