基于spring及zookeeper的dubbo工程搭建
一、生产者搭建
新建一个maven工程,勾选Create a simple project
Packaging方式选择jar包的方式。
修改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.</modelVersion>
- <groupId>com.shaw</groupId>
- <artifactId>provider</artifactId>
- <version>1.0.</version>
- <properties>
- <spring.version>4.3..RELEASE</spring.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>dubbo</artifactId>
- <version>2.5.</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>
按照如图的方式,创建相关目录文件
ProviderService.java
- package com.shaw.service;
- public interface ProviderService {
- public void sayHello();
- }
ProviderServiceImpl.java
- package com.shaw.service.impl;
- import com.shaw.service.ProviderService;
- public class ProviderServiceImpl implements ProviderService{
- @Override
- public void sayHello() {
- System.out.println("Hello!I am Provider!");
- }
- }
TestProviderService.java
- package com.shaw.service;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class TestProviderService {
- public static void main(String[] args) {
- ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"application.xml"});
- context.start();
- System.out.println("生产者服务已经注册成功!");
- try {
- System.in.read();//让此程序一直跑,表示一直提供服务
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
application.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 ">
- <!-- 具体的实现bean -->
- <bean id="providerService" class="com.shaw.service.impl.ProviderServiceImpl" />
- <!-- 提供方应用信息,用于计算依赖关系 -->
- <dubbo:application name="provider" />
- <!-- 使用zookeeper注册中心暴露服务地址 -->
- <dubbo:registry address="zookeeper://127.0.0.1:2181" />
- <!-- 用dubbo协议在20880端口暴露服务 -->
- <dubbo:protocol name="dubbo" port="" />
- <!-- 声明需要暴露的服务接口 -->
- <dubbo:service interface="com.shaw.service.ProviderService" ref="providerService" />
- </beans>
按照如下步骤测试生产者:
1、启动zookeeper
2、启动tomcat 【1、2两点的相关搭建可以参考博主之前的博文《zookeeper环境及dubbo-admin管理平台搭建》】
3、右键TestProviderService类。
地址栏输入:http://localhost:8080/dubbo-admin-2.5.4/ 账户密码为root/root。输入服务名称:com.shaw.service.ProviderService
至此,生产者搭建完成并提供服务了。
二、消费者搭建
按照搭建生产者的过程重新搭建一个consumer的工程:
工程目录如下:
TestConsumerService.java
- package com.shaw.consumer;
- import java.io.IOException;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.shaw.service.ProviderService;
- public class TestConsumerService {
- public static void main(String[] args) {
- ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext(new String[]{"application.xml"});
- context.start();
- ProviderService testService = (ProviderService) context.getBean("testProviderService");
- testService.sayHello();
- try {
- System.in.read();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
application.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" />
- <!-- 使用multicast广播注册中心暴露发现服务地址 -->
- <dubbo:registry protocol="zookeeper" address="zookeeper://127.0.0.1:2181" />
- <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
- <dubbo:reference id="testProviderService" interface="com.shaw.service.ProviderService" />
- </beans>
消费者测试:
继续生产者的测试步骤不同的是最后在TestConsumerService类右键。
控制台输入了生产者打印出来的信息:
同时登录:http://localhost:8080/dubbo-admin-2.5.4/ 也可以查看相关消费者的服务信息如图:
三、相关dubbo配置信息
3.1 dubbo常用配置
- <dubbo:service/> 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。
- <dubbo:service ref="demoService" interface="com.unj.dubbotest.provider.DemoService" />
- <dubbo:reference/> 引用服务配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。
- <dubbo:reference id="demoService" interface="com.unj.dubbotest.provider.DemoService" />
- <dubbo:protocol/> 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。
- <dubbo:protocol name="dubbo" port="" />
- <dubbo:application/> 应用配置,用于配置当前应用信息,不管该应用是提供者还是消费者。
- <dubbo:application name="xixi_provider" />
- <dubbo:application name="hehe_consumer" />
- <dubbo:registry/> 注册中心配置,用于配置连接注册中心相关信息。
- <dubbo:registry address="zookeeper://127.0.0.1:2181" />
- <dubbo:module/> 模块配置,用于配置当前模块信息,可选。
- <dubbo:monitor/> 监控中心配置,用于配置连接监控中心相关信息,可选。
- <dubbo:provider/> 提供方的缺省值,当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值,可选。
- <dubbo:consumer/> 消费方缺省配置,当ReferenceConfig某属性没有配置时,采用此缺省值,可选。
- <dubbo:method/> 方法配置,用于ServiceConfig和ReferenceConfig指定方法级的配置信息。
- <dubbo:argument/> 用于指定方法参数配置。
3.2 服务调用超时设置
上图中以timeout为例,显示了配置的查找顺序,其它retries, loadbalance, actives也类似。
方法级优先,接口级次之,全局配置再次之。
如果级别一样,则消费方优先,提供方次之。
其中,服务提供方配置,通过URL经由注册中心传递给消费方。
建议由服务提供方设置超时,因为一个方法需要执行多长时间,服务提供方更清楚,如果一个消费方同时引用多个服务,就不需要关心每个服务的超时设置。
理论上ReferenceConfig的非服务标识配置,在ConsumerConfig,ServiceConfig, ProviderConfig均可以缺省配置。
3.3 启动时检查
Dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及早发现问题,默认check=true。
如果你的Spring容器是懒加载的,或者通过API编程延迟引用服务,请关闭check,否则服务临时不可用时,会抛出异常,拿到null引用,如果check=false,总是会返回引用,当服务恢复时,能自动连上。
可以通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。
- 、关闭某个服务的启动时检查:(没有提供者时报错)
- <dubbo:reference interface="com.foo.BarService" check="false" />
- 、关闭所有服务的启动时检查:(没有提供者时报错) 写在定义服务消费者一方
- <dubbo:consumer check="false" />
- 、关闭注册中心启动时检查:(注册订阅失败时报错)
- <dubbo:registry check="false" />
引用缺省是延迟初始化的,只有引用被注入到其它Bean,或被getBean()获取,才会初始化。
如果需要饥饿加载,即没有人引用也立即生成动态代理,可以配置:
<dubbo:reference interface="com.foo.BarService" init="true" />
3.4 订阅
1、问题
为方便开发测试,经常会在线下共用一个所有服务可用的注册中心,这时,如果一个正在开发中的服务提供者注册,可能会影响消费者不能正常运行。
2、解决方案
可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务,通过直连测试正在开发的服务。
- 禁用注册配置:
- <dubbo:registry address="10.20.153.10:9090" register="false" />
- 或者:
- <dubbo:registry address="10.20.153.10:9090?register=false" />
3.5 回声测试(测试服务是否可用)
回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。
所有服务自动实现EchoService接口,只需将任意服务引用强制转型为EchoService,即可使用。
- <dubbo:reference id="memberService" interface="com.xxx.MemberService" />
- MemberService memberService = ctx.getBean("memberService"); // 远程服务引用
- EchoService echoService = (EchoService) memberService; // 强制转型为EchoService
- String status = echoService.$echo("OK"); // 回声测试可用性
- assert(status.equals("OK"))
3.6 延迟连接
延迟连接,用于减少长连接数,当有调用发起时,再创建长连接。
只对使用长连接的dubbo协议生效。
<dubbo:protocol name="dubbo" lazy="true" />
3.7 令牌验证
防止消费者绕过注册中心访问提供者,在注册中心控制权限,以决定要不要下发令牌给消费者,注册中心可灵活改变授权方式,而不需修改或升级提供者
- 、全局设置开启令牌验证:
- <!--随机token令牌,使用UUID生成-->
- <dubbo:provider interface="com.foo.BarService" token="true" />
- <!--固定token令牌,相当于密码-->
- <dubbo:provider interface="com.foo.BarService" token="" />
- 、服务级别设置开启令牌验证:
- <!--随机token令牌,使用UUID生成-->
- <dubbo:service interface="com.foo.BarService" token="true" />
- <!--固定token令牌,相当于密码-->
- <dubbo:service interface="com.foo.BarService" token="" />
- 、协议级别设置开启令牌验证:
- <!--随机token令牌,使用UUID生成-->
- <dubbo:protocol name="dubbo" token="true" />
- <!--固定token令牌,相当于密码-->
- <dubbo:protocol name="dubbo" token="" />
3.8 日志适配
缺省自动查找:log4j、slf4j、jcl、jdk
可以通过以下方式配置日志输出策略:dubbo:application logger="log4j"/>
访问日志:
如果你想记录每一次请求信息,可开启访问日志,类似于apache的访问日志。此日志量比较大,请注意磁盘容量。
- 将访问日志输出到当前应用的log4j日志:
- <dubbo:protocol accesslog="true" />
- 将访问日志输出到指定文件:
- <dubbo:protocol accesslog="http://10.20.160.198/wiki/display/dubbo/foo/bar.log" />
3.9 配置Dubbo缓存文件
配置方法如下:
<dubbo:registryfile=”${user.home}/output/dubbo.cache” />
注意:
文件的路径,应用可以根据需要调整,保证这个文件不会在发布过程中被清除。如果有多个应用进程注意不要使用同一个文件,避免内容被覆盖。
这个文件会缓存:
注册中心的列表
服务提供者列表
有了这项配置后,当应用重启过程中,Dubbo注册中心不可用时则应用会从这个缓存文件读取服务提供者列表的信息,进一步保证应用可靠性。
本文代码下载:dubbo-provider-consumer
基于spring及zookeeper的dubbo工程搭建的更多相关文章
- 基于Nginx和Zookeeper实现Dubbo的分布式服务
一.前言 公司的项目基于阿里的Dubbo 微服务框架开发.为了符合相关监管部门的安全要求,公司购买了华东1.华东2两套异地服务器,一套是业务服务器,一套是灾备服务器.准备在这两套服务器上实现 Dubb ...
- 基于Spring+SpringMVC+Mybatis的Web系统搭建
系统搭建的配置大同小异,本文在前人的基础上做了些许的改动,重写数据库,增加依据权限的动态菜单的实现,也增加了后台返回json格式数据的配置,详细参见完整源码. 主要的后端架构:Spring+Sprin ...
- 基于Dcoker的ZooKeeper集群的搭建
背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 Docker 的镜像了, 于是就尝试了一下, 发现真是爽 ...
- 基于Vue+Spring MVC+MyBatis+Shiro+Dubbo开发的分布式后台管理系统
本文项目代码: 服务端:https://github.com/lining90567/dubbo-demo-server 前端:https://github.com/lining90567/dubbo ...
- 基于maven+dubbo+spring+zookeeper的简单项目搭建
maven下搭建dubbo小demo,供初学者学习,有不正确地方还请见谅. 先推荐一篇创建maven项目的文章,个人认为比较完整详细清楚: http://www.cnblogs.com/leiOOle ...
- 用ZooKeeper做为注册中心搭建基于Spring Cloud实现服务注册与发现
前提: 先安装好ZooKeeper的环境,搭建参考:http://www.cnblogs.com/EasonJim/p/7482961.html 说明: 可以再简单的理解为有两方协作,一个是服务提供这 ...
- 【Dubbo实战】 Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)
Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...
- Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(转)
Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...
- 通过dubbo暴露接口调用方法,及基于zookeeper的dubbo涉及配置文件
现在很流行的Dubbo很多朋友都听说过吧,最近我也在看这方面的东西,分享先我的心得笔记. 先说说我们团队要做的项目框架,很简单重在实现基于zookeeper的dubbo注册. 框架:springmvc ...
随机推荐
- codeforces上某题
一道codeforces上的题目. 题目大意: 定义有k个不同的字符的字符串为好字符串.现在给出一个字符串,求解对该字符串的每个前缀Si至少是多少个好字符串的连接,若不能由好字符串连接而成则输出-1. ...
- 20145231第二周Java学习笔记
20145231 <Java程序设计>第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本,再看视频,然后实践敲代码,最后根据学习笔记总结完成博客. 第三章:基础语法 知识点比 ...
- 优美的英文诗歌Beautiful English Poetry
<When you are old>——<当你老了> --- William Butler Yeats ——威廉·巴特勒·叶芝When you are old and grey ...
- JavaWeb Request和Response
1. Request与Response 1.1. Web应用运行机制 到目前为止,我们已经掌握了Web应用程序的运行机制,现在学习的就是Web应用程序运行机制中很重要的内容 —— Request与Re ...
- tree 命令【转】
本文转载自:http://www.jb51.net/LINUXjishu/283874.html linux下怎么用tree命令以树形结构显示文件目录结构?tree命令可以以树形结构显示文件目录结构, ...
- vRO 添加已有磁盘到VM
在vRO实现将已有虚拟机磁盘添加到另外的虚拟机上,以为vRA发布Oracle/SQL集群做准备: // 脚本需要两个输入 vm_obj和diskPathSystem.log("Attempt ...
- MongoDB快速入门(九)- 投影
MongoDB投影 mongodb投影意义是只选择需要的数据,而不是选择整个一个文档的数据.如果一个文档有5个字段,只需要显示3个,只从中选择3个字段. MongoDB的find()方法,解释了Mon ...
- 0x5C 计数类DP
cf 559C 考虑到黑色的格子很少,那么我把(1,1)变成黑色,然后按每个黑色格子接近终点的程度排序,计算黑色格子不经过另一个黑色格子到达终点的方案,对于当前的格子,要减去在它右下角的所有方案数(注 ...
- linux下java unrecognized class file version错误的解决
root@Mr javaPC]# java HelloWorldException in thread “main” java.lang.ClassFormatError: HelloWorld (u ...
- NCBI
RefSeq: NCBI Reference Sequences GeneBank序列注释说明 利用NCBI查找基因信息 NCBI中RefSeq各种accession说明(一) NCBI中RefSeq ...