zoukankan      html  css  js  c++  java
  • Dubbo+zookeeper+SpringMVC搭建最简单的分布式项目

    Dubbo 是什么

    • 一款分布式服务框架
    • 高性能和透明化的RPC远程过程调用(Remote Procedure Call)方案
    • SOA面向服务的架构(Service-Oriented Architecture)治理方案

    Dubbo 架构流程图

    这里写图片描述

    Provider:服务提供方 
    Consumer:服务消费者 
    Registry:注册中心 
    Monitor:统计服务调用次数和调用时间的监控中心

    调用流程
    0.启动服务提供者。
    1.服务提供者在启动时,向注册中心注册自己提供的服务。
    2.服务消费者在启动时,向注册中心订阅自己所需的服务。
    3.注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    4.服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    5.服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    注册中心
    服务提供方:针对所提供的服务到注册中心发布。
    服务消费方:到服务中心订阅所需的服务。
    对于任何一方,不论服务提供方或者服务消费方都有可能同时兼具两种角色,即需要提供服务也需要消费服务。

    架构搭建案例开始

    第一步:Zookeeper下载,安装,配置
    1.1:下载:http://apache.fayea.com/zookeeper/  一般选择稳定版本,我选的是3.4.9

    1.2:然后解压到一个目录,打开conf目录copy一份zoo_sample.cfg文件,并重命名为zoo.cfg(必须是这个名字)

    1.3:打开zoo.cfg,入手阶段基本不用做什么修改,唯一需要注意的是端口号,后面的dubbo 管理配置需要和这个保持一致(后面说)

    1.4:找到bin目录下的 zKserver.cmd 启动zookeeper

    这里zookeeper就OK了

    第二步:下载,配置dubbo的管理项目

    2.1 下载 dubbo admin 项目 地址:http://dubbo.io/Download-zh.htm
     
    2.2 解压,取出war包。
    2.3 拷贝一个tomcat,改一下端口号(用默认容易和其他的tomcat端口冲突)

    2.4 删除 tomcat webapp 目录下面的文件,将dubbo admin 包解压内容放到root目录中,修改classpath 目录下的dubbo.properties, 将这个监测中心注册到zookeeper,即将dubbo.registry.address改成你安装zookeeper的机子IP+zookeeper配置的端口。我这里是一台机子演示,默认端口与zookeeper是一致的所以不用修改。用户名密码就没有改动的必要了。

    2.5 bin目录启动tomcat,输入这个tomat的访问网址 http://localhost:8180/ (端口号注意修改成你自己改的那个),然后登陆密码都是就是上面配置文件中的,root  root登录

     这里可以看到,提供者为0,消费者为0

    第三步:创建提供者

     3.1:创建两个maven项目,一个提供者,一个消费者 (dubbo_provider,dubbo_consuner)

    service包,公用接口,很简单,就是个maven基础java包,不需要加入任何依赖,也不需要加入任何配置文件

    <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.test</groupId>
    <artifactId>service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    </project>

    2个项目dubbo_provider包引入service依赖,且需要引入dubbo,zookeeper,log4依赖,这里不需要引入Spring,dubbo自带依赖,不过版本很旧,也可以自己手动移除然后引入新版本Spring。下面给出其中一个的pom实例,copy请自行修改artifactId

    pom.xml:

    <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.test</groupId>
    <artifactId>dubbo_consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
    <spring.version>3.2.8.RELEASE</spring.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.5.3</version>
    <exclusions>
    <exclusion>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
    </dependency>
    <!-- spring相关 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</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-context</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-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-aop</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>${spring.version}</version>
    </dependency>
    </dependencies>
    </project>

    3.2  在service公有服务接口包中新建接口HelloService ,内容很简单,就包含两个测试接口
    HelloService .java:

    package com.dubbo.service;

    /**
    * 功能概要:提供者service接口层
    *
    * @author zsq
    * @since 2018年9月29日
    */
    public interface HelloService {
    public String sayHello(String name);

    public String testDubbo(String name);
    }

    3.3 在service公共服务接口包下创建HelloService接口的实现类  HelloServiceImpl.java

    package com.dubbo.service.impl;
    import com.dubbo.service.HelloService;

    /**
    * 功能概要:提供者service实现层
    *
    * @author zsq
    * @since 2018年9月29日
    */
    public class HelloServiceImpl implements HelloService {

    public String sayHello(String name) {
    return name + ", Hello dubbo provider111!";
    }

    public String testDubbo(String name) {
    return name + ", test dubbo provider222!";
    }
    }

    3.4:在resource资源包下创建相应的资源配置文件applicationProvider.xml和日志配置文件log4j.properties

    applicationProvider.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-provider" />
    <!-- 使用zookeeper注册中心暴露服务地址,多个地址中间用,号隔开 ?backup=192.168.137.131:2181,192.168.137.132:2181 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20881" />
    <!-- 具体的实现bean -->
    <bean id="helloservice" class="com.dubbo.service.impl.HelloServiceImpl" />
    <bean id="helloDubbo" class="com.dubbo.service.impl.HelloDubboImpl" />
    <!-- 声明需要暴露的服务接口 -->
    <dubbo:service timeout="3000" interface="com.dubbo.service.HelloService" ref="helloservice"
    cluster="failover" />
    <dubbo:service timeout="3000" interface="com.dubbo.service.HelloDubbo" ref="helloDubbo"
    retries="2" cluster="forking" />
    <!--失败自动切换,当出现失败,重试其它服务器,通常用于读操作,但重试会带来更长延迟 ,可通过retries="2"来设置重试次数(不含第一次)。
    默认就是failover,可以不写 ,包括(failfast/failback/forking) ,forks="2",并行调用多个服务器,只要一个成功即返回。
    通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过它来设置最大并行数。 -->

    <dubbo:reference interface=""></dubbo:reference>
    </beans>

    日志配置文件log4j.properties

    # Global logging configurationuff0cu5efau8baeu5f00u53d1u73afu5883u4e2du8981u7528debug
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    注意:在创建applicationProvider.xml时,可能会出现dubbo.xsd不匹配报错的问题,需要手动引入外部的xsd文件

    步骤:window-->preperence-->xml-->xml Catalog-->Add-->dubbo.xsd

    3.5:在test包下创建HelloServiceTest.java类进行测试

    package com.dubbo.service;

    import java.io.IOException;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class HelloServiceTest {

    public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
    new String[]{"applicationProvider.xml"});
    context.start();
    System.out.println("服务注册成功");
    try {
    System.in.read();//让此程序一直跑,表示一直提供服务
    } catch (IOException e) {
    e.printStackTrace();
    }

    }

    }

    至此:服务提供者创建完成

    成功启动之后,显示注册到了zookeeper。

    这个时候我们刷新下dubbo.admin页面看看效果,显示提供者为2,说明一切正常

    第四步:创建消费者

    4.1:创建两个maven项目,一个提供者,一个消费者 (dubbo_provider,dubbo_consuner)

    4.2:在dubbo_consumer项目中,引入项目的相关依赖,pom.xml

    <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.test</groupId>
    <artifactId>dubbo_consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
    <spring.version>3.2.8.RELEASE</spring.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.5.3</version>
    <exclusions>
    <exclusion>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
    </dependency>
    <!-- spring相关 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</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-context</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-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-aop</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>${spring.version}</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>${spring.version}</version>
    </dependency>
    </dependencies>
    </project>

    4.3:在service公共接口包下新建HelloService.java接口

    package com.dubbo.service;
    /**
    * 功能概要:消费者service接口
    *
    * @author zsq
    * @since 2018年9月29日
    */

    public interface HelloService {
    public String sayHello(String name);

    public String testDubbo(String name);
    }

    4.4:在resouce资源包下创建相应的资源文件applicationConsumer.xml和日志文件log4j.properties

    applicationConsumer.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-consumer" />

    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />

    <!-- 生成远程服务代理,可以和本地bean一样使用HelloService -->
    <dubbo:reference id="helloService" interface="com.dubbo.service.HelloService" />
    <dubbo:reference id="helloDubbo" interface="com.dubbo.service.HelloDubbo" />
    </beans>

    日志文件log4j.properties

    # Global logging configurationuff0cu5efau8baeu5f00u53d1u73afu5883u4e2du8981u7528debug
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

    4.5:在test测试包下创建HelloServiceConsumerTest.java测试文件

    package com.dubbo.service;

    import java.io.IOException;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

    public class HelloServiceConsumerTest {

    public static void main(String[] args) {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
    new String[] { "applicationConsumer.xml" });

    context.start();
    HelloService providerService = (HelloService) context.getBean("helloService");
    HelloDubbo providerDubbo=(HelloDubbo) context.getBean("helloDubbo");

    System.out.println(providerService.sayHello("Tom"));
    System.out.println(providerDubbo.sayDubbo("zookeeper+dubbo"));
    try {
    System.in.read();//让此程序一直跑
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

    至此,消费者的代码也书写完毕

    成功启动测试文件后,

     这个时候我们刷新下dubbo.admin页面看看效果,显示消费者为2,说明一切正常

  • 相关阅读:
    CentOS 6.9/7通过yum安装指定版本的MySQL
    CentOS的el5, el6, el7代表什么
    MySQL的mysql.sock文件作用(转)
    MySQL常用命令
    Linux下以特定用户运行命令
    简述TCP的三次握手过程
    Tomcat-connector的微调(1): acceptCount参数
    tomcat修改jsessionid在cookie中的名称
    使用@Async异步注解导致该Bean在循环依赖时启动报BeanCurrentlyInCreationException异常的根本原因分析,以及提供解决方案【享学Spring】
    [LeetCode] Construct the Rectangle 构建矩形
  • 原文地址:https://www.cnblogs.com/zhaosq/p/9799137.html
Copyright © 2011-2022 走看看