一、浩言
曾国藩说的"既往不恋,当下不杂,未来不迎"
二、背景
dubbo的一直说要来记载下,写了又一直没有完整的整理下,今天加班把这篇整理了下,公司最近我们改的项目都使用了dubbo,但是分布式事物这一块还是没有处理,就类型一个http调用失败那么如何处理样,这事需要思考的,这篇算是入门篇了,后续会在记载更多知识,后面的dubbo启动方式很多人的选择应该不一样的吧,我感觉dubbo自带的用命令启动就很不错,现在类似的springboot模块,打包成jar的模式,直接运行jar启动也是可以的。看个人需要了。
三、dubbo配置
3.1、dubbo的配置
maven的jar如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
根据dubbo官网<a href="http://dubbo.io/User+Guide-zh.htm">用户教程</a>中的配置可以自己搭建一个dubbo项目,当然,dubbo在<a href=" https://github.com/alibaba/dubbo.git ">github</a>上的源码里面也有demo的,那么现在看看我自己搭建的项目
dubbo-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"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 读入配置属性文件 -->
<context:property-placeholder location="classpath*:service.properties" />
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="mouse-moon-app-web"/>
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181" /> -->
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.mouse.moon.api.UserService" ref="userService" />
<!-- 和本地bean一样实现服务 -->
<bean id="userService" class="com.mouse.moon.service.UserServiceImpl" />
</beans>
使用main方法进行发布暴露代码
package com.mouse.moon.service;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppMain {
public static void main(String[] args) throws Exception{
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"/provider-test/spring-mybatis.xml"});
context.start();
System.in.read();
}
}
配置消费端dubbo-consumer.xml的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-mouse-monn" />
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<!--用户查询 -->
<dubbo:reference id="userService" interface="com.mouse.moon.api.UserService"/>
</beans>
消费端代码如下
package org.mouse.consumer;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mouse.moon.api.UserService;
public class Client {
public static void main(String args[]){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"/consumer-test/dubbo-consumer.xml"});
context.start();
UserService userService = (UserService)context.getBean("userService");
System.out.println(userService.getUserInfoById("1"));
}
}
发布接口的日志:
暴露接口列表
暴露接口的详情:
消费端在监控平台显示:
调用端查询数据的相关日志:
集群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="mouse-moon-app-web"/>
<!-- 使用multicast广播注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://121.12.60.22:2183?backup=121.12.60.22:2181,121.12.60.22:2182" />
<!-- <dubbo:registry address="zookeeper://121.12.60.22:2181" /> -->
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20881" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.mouse.moon.api.UserService" ref="userService" />
<!-- 和本地bean一样实现服务 -->
<bean id="userService" class="com.mouse.moon.service.UserServiceImpl" />
</beans>
上面的集群地址是在我的这篇<a href="http://www.jianshu.com/p/950fb55ea53a">zookeeper集群配置</a>文章中配置的。
上面给的是集群配置,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 protocol="zookeeper" address="121.12.60.22:2183,121.12.60.22::2181,121.12.60.22::2182" />
</bean>
其实这里面主要就是这些xml的配置,其他代码就是分了模块的,比如我这项目结构如下
新建module时候可以如此,在父项目上右键(我的IDE是eclipse),然后根据自己的需要新建不同的module
上面的监控的说明见下面的说明
3.2 dubbo监控
将dubbo源码下的dubbo-admin项目编译后的war包放到tomcat下,访问项目提示需要输入账号密码
用户名:root
密码:root
监控中的账号面属性在源码里面可以看到为止如下图位置
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
四、有关启动的方式
4.1、启动方式
上面看到了,我其实是使用main方法来启动暴露dubbo,这事一种方式。dubbo源码中自带了可以转成命令的形式操作,也是用main方式,只是加载固定位置的配置文件,以shell脚本的形式启动。
package com.mouse.moon.service;
public class AppMain {
public static void main(String[] args) throws Exception{
com.alibaba.dubbo.container.Main.main(args);
}
}
以上述方式启动代码,下面是打印的日志
----------->[Ljava.lang.String;@15db9742
log4j:WARN No appenders could be found for logger (com.alibaba.dubbo.common.logger.LoggerFactory).
log4j:WARN Please initialize the log4j system properly.
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/tool/repository/ch/qos/logback/logback-classic/1.1.3/logback-classic-1.1.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/tool/repository/org/slf4j/slf4j-log4j12/1.6.1/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
.14:59:41.307 DEBUG [main] org.springframework.core.env.StandardEnvironment[109] - Adding [systemProperties] PropertySource with lowest search precedence
.14:59:41.311 DEBUG [main] org.springframework.core.env.StandardEnvironment[109] - Adding [systemEnvironment] PropertySource with lowest search precedence
.14:59:41.311 DEBUG [main] org.springframework.core.env.StandardEnvironment[127] - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]
.14:59:41.312 INFO [main] org.springframework.context.support.ClassPathXmlApplicationContext[581] - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@14bf9759: startup date [Tue Feb 14 14:59:41 CST 2017]; root of context hierarchy
.14:59:41.342 DEBUG [main] org.springframework.core.env.StandardEnvironment[109] - Adding [systemProperties] PropertySource with lowest search precedence
.14:59:41.343 DEBUG [main] org.springframework.core.env.StandardEnvironment[109] - Adding [systemEnvironment] PropertySource with lowest search precedence
.14:59:41.343 DEBUG [main] org.springframework.core.env.StandardEnvironment[127] - Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]
.14:59:41.351 DEBUG [main] org.springframework.core.io.support.PathMatchingResourcePatternResolver[317] - Resolved classpath location [META-INF/spring/] to resources []
.14:59:41.352 DEBUG [main] org.springframework.core.io.support.PathMatchingResourcePatternResolver[483] - Resolved location pattern [classpath*:META-INF/spring/*.xml] to resources []
.14:59:41.352 DEBUG [main] org.springframework.beans.factory.xml.XmlBeanDefinitionReader[224] - Loaded 0 bean definitions from location pattern [classpath*:META-INF/spring/*.xml]
.14:59:41.354 DEBUG [main] org.springframework.context.support.ClassPathXmlApplicationContext[615] - Bean factory for org.springframework.context.support.ClassPathXmlApplicationContext@14bf9759: org.springframework.beans.factory.support.DefaultListableBeanFactory@6fb0d3ed: defining beans []; root of factory hierarchy
.14:59:41.384 DEBUG [main] org.springframework.context.support.ClassPathXmlApplicationContext[728] - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@6cc7b4de]
.14:59:41.386 DEBUG [main] org.springframework.context.support.ClassPathXmlApplicationContext[752] - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@2bbaf4f0]
.14:59:41.387 DEBUG [main] org.springframework.beans.factory.support.DefaultListableBeanFactory[744] - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6fb0d3ed: defining beans []; root of factory hierarchy
.14:59:41.388 DEBUG [main] org.springframework.context.support.ClassPathXmlApplicationContext[779] - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@282003e1]
.14:59:41.388 DEBUG [main] org.springframework.beans.factory.support.DefaultListableBeanFactory[251] - Returning cached instance of singleton bean 'lifecycleProcessor'
.14:59:41.390 DEBUG [main] org.springframework.core.env.PropertySourcesPropertyResolver[91] - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
.14:59:41.396 DEBUG [main] org.springframework.beans.factory.support.DefaultListableBeanFactory[251] - Returning cached instance of singleton bean 'lifecycleProcessor'
[2017-02-14 14:59:41] Dubbo service server started!
所以,如果使用这种方式启动发布,那么我们需要将dubbo的配置文件配置到[classpath:META-INF/spring/.xml]**下,我们现在的dubbo项目的配置就是如此的。
五:浩语
__
__ _ ____ __| |__ _____ ___
\ \/ \/ / | \ | \\__ \ / _ \
\ /| | / Y \/ __ \( <_> )
\/\_/ |____/|___| (____ /\____/
\/ \/
任何事情都是要靠努力和用心。