Dubbo+Zookeeper入门案例
Dubbo和Zookeeper的介绍
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力: 面向接口的远程方法调用、智能容错和负载均衡、以及服务自动注册和发现,Zookeeper是Dubbo推荐的注册中心。
在一个分布式的项目中,web层和service层被拆分开来,分别部署在不同的tomcat服务器中,如果我在web层想要调用service层的接口,而由于web层和service层没有运行在同一个服务器上,所以无法直接调用service中的接口。这时Dubbo和Zookeeper就可以帮我们做到跨服务器调用接口。
我们可以通过Dubbo创建一个服务,并且在Zookeeper注册中心进行注册,填写Zookeeper服务所在的IP和端口号,由于在不同的工程中,在web项目中无法直接找到service的接口,通过使用Dubbo我们就能引入注册进入Zookeeper的Dubbo服务。
Zookeeper在linux系统下的安装
zookeeper官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/
将zookeeper-3.4.6.tar.gz解压到/usr/local/zookeeper文件夹下
解压命令:
sudo tar -zxvf ./Downloads/zookeeper.tar.gz -C /usr/local/
进入conf配置文件目录,将zoo_sample.cfg复制一份到conf目录下,重命名为zoo.cfg
PS:一定要在conf目录下,因为zookeeper服务启动时会默认读取conf目录下的zoo.cfg文件
复制命令:
cp zoo_sample.cfg zoo.cfg
进入到bin目录下,启动zookeeper服务,并查看zookeeper服务启动状态
启动服务命令:
#启动zookeeper服务
sudo ./zkServer.sh start
#查看zookeeper服务
sudo ./zkServer.sh status
到此为止,linux系统下zookeeper的安装完成
Dubbo和Zookeeper的使用
分别创建两个web项目,一个service,一个controller,目录结构如下:
service配置文件如下:
pom.xml相关依赖:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.11.0.GA</version>
</dependency>
</dependencies>
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"
version="2.5">
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
applicationContext-service.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 给当前项目(应用)服务起个名字 发布在dubbo上的名字 demo_UserService-->
<dubbo:application name="dubboxdemo-service"/>
<!-- 配置连接zookeeper的IP和端口 ***.***.***.***:2181-->
<dubbo:registry address="zookeeper://***.***.***.***:2181"/>
<!-- 配置包扫描, 在这个包下面的实现类中使用@Service注解才会生效 配置要发布到Dubbo的服务包 -->
<dubbo:annotation package="com.cqjtu.tzl.service"/>
</beans>
controller配置文件如下:
pom.xml相关依赖和service的依赖相同,在service项目的依赖中加入:
<dependency>
<groupId>com.cqjtu.tzl</groupId>
<artifactId>service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
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"
version="2.5">
<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置springMvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-web.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
applicationContext-web.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:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注解驱动 最少三样:注解扫描 注解驱动 视图解析器-->
<mvc:annotation-driven>
<!-- 将传输的字符串强制转换成utf-8编码, 防止中文乱码 -->
<mvc:message-converters register-defaults="false">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 给当前项目服务起个名-->
<dubbo:application name="dubboxdemo-web"/>
<!-- 配置连接zookepper -->
<dubbo:registry address="zookeeper://***.***.***.***:2181"/>
<!-- 配置包扫描, 只有在这个包下面才可以注入service -->
<dubbo:annotation package="com.cqjtu.tzl.controller"/>
</beans>
TestService.java:
package com.cqjtu.tzl.service;
public interface TestService {
public abstract String getName();
}
TestServiceImpl.java:
注意Service是com.alibaba.dubbo.config.annotation包下的,切勿引错包
package com.cqjtu.tzl.service;
import com.alibaba.dubbo.config.annotation.Service;
@Service
public class TestServiceImpl implements TestService{
@Override
public String getName() {
return "hello zookeeper...";
}
}
TestController.java:
注意自动注入注解用Reference是com.alibaba.dubbo.config.annotation包下的,切勿用Autowired
package com.cqjtu.tzl.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.cqjtu.tzl.service.TestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Reference
private TestService testService;
@RequestMapping("getname")
public String getName(){
return testService.getName();
}
}
测试结果
service和controller两个项目分别用两个tomcat启动
注意:
- 请保证运行的主机与提供zookeeper服务的主机之间可以正常通信
- 先启动service项目的tomcat,后启动controller项目的tomcat