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/

zookeeper目录结构
进入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,目录结构如下:
demo的目录结构
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

Demo运行成功结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值