motan与zookeeper框架[通俗易懂]

motan与zookeeper框架[通俗易懂]新浪科技讯2016年5月10日,微博方面宣布,支撑微博千亿调用的轻量级RPC框架Motan正式开源了。微博技术团队希望未来能有更多优秀的开源人入驻,并进一步完善优化。搭建新浪RPC框架motanDemo:http://blog.csdn.net/linuu/article/details/53115290 motan是新浪微博开源的RPC框架,github官网是:https:/…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

新浪科技讯 2016年5月10日,微博方面宣布,支撑微博千亿调用的轻量级 RPC 框架 Motan 正式开源了。微博技术团队希望未来能有更多优秀的开源人入驻,并进一步完善优化。

搭建新浪RPC框架motan Demo:http://blog.csdn.net/linuu/article/details/53115290 

motan是新浪微博开源的RPC框架,github官网是:https://github.com/weibocom/motan

今天就先搭建一个Hello world demo,本demo基于motan 0.2.1版本

首先先去github下载源代码(motan-manager报错请忽略,eclipse的web Module不兼容):

motanä¸zookeeperæ¡æ¶

选中motan下的pom.xml,进行编译打包:

motanä¸zookeeperæ¡æ¶

下载源码编译打包的目的有三个:

1)下载源代码可以方便源代码阅读学习

2)下载到motan.xsd,因为motan与spring进行了继承,有了自己的schema,eclipse会不识别,会导致xml报错,跟dubbo的配置文件报错一个道理

3)打包获取到motan-manager的页面管理端的war包(在motan-manager的target文件下找到打好的war包):

motanä¸zookeeperæ¡æ¶

单独找一个tomcat,将其放入webapp文件下

motanä¸zookeeperæ¡æ¶

motanä¸zookeeperæ¡æ¶

打开浏览器http://localhost:8080/motan-manager-0.2.2-SNAPSHOT:

motanä¸zookeeperæ¡æ¶

到此为止motan的管理平台就搭建好了,下面就搭建基于zookeeper为注册中心的RPC demo

1)首先先启动一个简单的zookeeper实例,在windows下简单的启动一个,写个demo,不需要集群

motanä¸zookeeperæ¡æ¶

打开eclipse,搭建两个简单的maven项目:

motanä¸zookeeperæ¡æ¶

motan-provider为服务提供端,motan-client服务调用端。两个项目的依赖基本上一样的:

<properties>       
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>       
	<motan.version>0.2.1</motan.version>   
</properties>      
<dependencies>       
	<dependency>           
		<groupId>com.weibo</groupId>           
		<artifactId>motan-core</artifactId>           
		<version>${motan.version}</version>       
	</dependency>       
	<dependency>           
		<groupId>com.weibo</groupId>           
		<artifactId>motan-transport-netty</artifactId>           
		<version>${motan.version}</version>       
	</dependency>          
	<dependency>           
		<groupId>com.weibo</groupId>           
		<artifactId>motan-registry-zookeeper</artifactId>           
		<version>${motan.version}</version>       
	</dependency>          
	<dependency>           
		<groupId>com.weibo</groupId>           
		<artifactId>motan-springsupport</artifactId>           
		<version>${motan.version}</version>       
	</dependency>       
	<dependency>           
		<groupId>org.springframework</groupId>           
		<artifactId>spring-context</artifactId>           
		<version>4.2.4.RELEASE</version>       
	</dependency>       
	<dependency>           
		<groupId>org.slf4j</groupId>           
		<artifactId>slf4j-api</artifactId>           
		<version>1.5.8</version>       
	</dependency>          
	<dependency>           
		<groupId>org.slf4j</groupId>           
		<artifactId>slf4j-log4j12</artifactId>           
		<version>1.5.8</version>       
	</dependency>          
	<dependency>           
		<groupId>log4j</groupId>           
		<artifactId>log4j</artifactId>           
		<version>1.2.14</version>       
	</dependency>   
</dependencies>  

Jetbrains全家桶1年46,售后保障稳定

服务提供端motan-provider的编写

1)我们写一个简单的接口HelloService:

package com.motan.rpc.service;      
public interface HelloService {              
	public String hello(String str);      
	}   
}

HelloSerivce简单的实现类HelloServiceImpl:

package com.motan.rpc.service;      
public class HelloServiceImpl implements HelloService {          
	public String hello(String str) {           
		return "hello " + str;       
	}             
}  

然后在src/main/resources下配置spring-motan-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:motan="http://api.weibo.com/schema/motan" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd">  
  <!-- spring管理的服务具体实现 -->  
  <bean id="serviceImpl" class="com.bazinga.study.motan.rpc.service.HelloServiceImpl"/>  
  <!-- 注册中心的配置 -->  
  <motan:registry regProtocol="zookeeper" name="zkRegistry" address="127.0.0.1:2181" connectTimeout="2000"/>  
  <!-- 协议配置。为防止多个业务配置冲突,推荐使用id表示具体协议。-->  
  <motan:protocol id="demoMotan" default="true" name="motan" maxServerConnection="80000" 
maxContentLength="1048576" maxWorkerThread="800" minWorkerThread="20"/>  
  <!-- 服务的默认配置 group:标识服务的分组 module:标识模块信息 registry:标识service使用的注册
中心,与motan:registry中的name对应  -->  
  <motan:basicService export="demoMotan:8002" group="lyncc-motan-demo-rpc" 
accessLog="true" shareChannel="true" module="motan-demo-rpc" application="myMotanDemo" 
registry="zkRegistry" id="serviceBasicConfig"/>  
  <!-- 要暴露的服务,唯一标识是integerface -->  
  <motan:service interface="com.bazinga.study.motan.rpc.service.HelloService" 
ref="serviceImpl" export="demoMotan:8001" basicService="serviceBasicConfig"/> 
</beans>

注意此时你的IDE可能会报错,不识别<motan:registry>这些标签,解决方案:

Window–>Preferences—>XML:

motanä¸zookeeperæ¡æ¶

选中我们刚才冲源码包中获取到的motan.xsd,然后key type选择Schema location 最最关键的就是key值了:http://api.weibo.com/schema/motan.xsd

这个值要与你命名空间中的值一样:

motanä¸zookeeperæ¡æ¶

重新打开spring-motan-provider.xml文件就不报错了~

好了,我们继续,编写provider的启动类ProviderStarter:

package com.motan.rpc.quickstart;      
import org.springframework.context.ApplicationContext;   
import org.springframework.context.support.ClassPathXmlApplicationContext;      
import com.weibo.api.motan.common.MotanConstants;   
import com.weibo.api.motan.util.MotanSwitcherUtil;      
public class ProviderStarter {              
	public static void main(String[] args) {           
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-motan-provider.xml");           
		MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);           
		System.out.println("server start...");       
	}      
}

 启动该类:

motanä¸zookeeperæ¡æ¶

此时再打开motan-manager的管理页面:

motanä¸zookeeperæ¡æ¶

可以查询到我们刚才注册好的服务,并且可以看到Server的服务者的个数是1个,我们开始编写motan-client的编写:

1)先把motan-provider端的HelloSerivce接口复制到motan-client,package的目录也要一样,因为接口的绝对路径被认为服务的唯一标识

2)在motan-client的src/main/resources文件夹下新建文件spring-motan-client.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:motan="http://api.weibo.com/schema/motan" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
http://api.weibo.com/schema/motan http://api.weibo.com/schema/motan.xsd">  
  <motan:registry regProtocol="zookeeper" name="registry" address="127.0.0.1:2181"/>  
  <!-- motan协议配置 -->  
  <motan:protocol default="true" name="motan" haStrategy="failover" 
loadbalance="roundrobin" maxClientConnection="10" minClientConnection="2"/>  
  <!-- 通用referer基础配置 -->  
  <motan:basicReferer requestTimeout="200" accessLog="true" retries="2" group="lyncc-motan-
demo-rpc" module="motan-demo-rpc" application="myMotanDemo" protocol="motan" 
registry="registry" id="motantestClientBasicConfig" throwException="false" check="true"/>  
  <motan:referer id="remoteService" interface="com.bazinga.study.motan.rpc.service.HelloService" 
connectTimeout="300" requestTimeout="300" basicReferer="motantestClientBasicConfig"/> 
</beans>

 3)编写启动类:

package com.motan.rpc.quickstart;      
import org.springframework.context.ApplicationContext;   
import org.springframework.context.support.ClassPathXmlApplicationContext;      
import com.bazinga.study.motan.rpc.service.HelloService;      
public class ClientStart {              
	public static void main(String[] args) {           
		ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring-motan-client.xml");           
		HelloService service = (HelloService) ctx.getBean("remoteService");           
		for(int i = 0;i< 50;i++){               
			System.out.println(service.hello("motan " + i));           
		}       
	}      
}  

 4)log4j.properties

log4j.rootLogger=warn  
log4j.logger.info=info,infofile  
log4j.logger.warn=warn,warnfile  
log4j.logger.error=error,errorfile  
log4j.logger.profile=info,profile  
  
log4j.logger.trace=trace,tracefile  
log4j.logger.accessLog=debug,accessfile  
log4j.logger.serviceStatsLog=info,serviceStatsLog  
  
log4j.appender.tracefile=org.apache.log4j.DailyRollingFileAppender   
log4j.appender.tracefile.file=./logs/client/trace.log  
log4j.appender.tracefile.DatePattern='.'yyyyMMdd  
log4j.appender.tracefile.layout=org.apache.log4j.PatternLayout  
log4j.appender.tracefile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  
log4j.appender.accessfile=org.apache.log4j.DailyRollingFileAppender   
log4j.appender.accessfile.file=./logs/client/access.log  
log4j.appender.accessfile.DatePattern='.'yyyyMMdd  
log4j.appender.accessfile.layout=org.apache.log4j.PatternLayout  
log4j.appender.accessfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%p %d{yy/MM/dd HH:mm:ss} %-50.50c(%L) - %m%n  
  
log4j.appender.infofile=org.apache.log4j.DailyRollingFileAppender   
log4j.appender.infofile.file=./logs/client/info.log  
log4j.appender.infofile.DatePattern='.'yyyyMMdd-HH  
log4j.appender.infofile.layout=org.apache.log4j.PatternLayout  
log4j.appender.infofile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  
log4j.appender.warnfile=org.apache.log4j.DailyRollingFileAppender   
log4j.appender.warnfile.file=./logs/client/warn.log  
log4j.appender.warnfile.DatePattern='.'yyyyMMdd  
log4j.appender.warnfile.layout=org.apache.log4j.PatternLayout  
log4j.appender.warnfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender   
log4j.appender.errorfile.file=./logs/client/error.log  
log4j.appender.errorfile.DatePattern='.'yyyyMMdd  
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout  
log4j.appender.errorfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%p] %m%n  
  
  
#profile  
log4j.appender.profile=org.apache.log4j.DailyRollingFileAppender   
log4j.appender.profile.file=./logs/client/profile.log  
log4j.appender.profile.DatePattern='.'yyyyMMdd-HH  
log4j.appender.profile.layout=org.apache.log4j.PatternLayout  
log4j.appender.profile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %m%n  
  
#serviceStats  
log4j.appender.serviceStatsLog=org.apache.log4j.DailyRollingFileAppender  
log4j.appender.serviceStatsLog.file=./logs/client/serverserviceStatsLog.log  
log4j.appender.serviceStatsLog.DatePattern='.'yyyyMMdd  
log4j.appender.serviceStatsLog.layout=org.apache.log4j.PatternLayout  
log4j.appender.serviceStatsLog.layout.ConversionPattern=%-d{HH:mm:ss} %m%n  

启动ClientStart.java

motan与zookeeper框架[通俗易懂]

现在已经调通了,我们再看看motan-manager:

motan与zookeeper框架[通俗易懂]

好了,到此为此,一个简单的motan demo已经搭建好了~

完整的项目截图:

motan与zookeeper框架[通俗易懂]

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207136.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux查看系统基本信息,版本信息(最全版)

    Linux查看系统基本信息,版本信息(最全版)Linux下如何查看版本信息,包括位数、版本信息以及CPU内核信息、CPU具体型号1.uname-a  (Linux查看版本当前操作系统内核信息)2.cat/proc/version(Linux查看当前操作系统版本信息)3.cat/etc/issue 或cat/etc/redhat-release(Linux查看版本当前操作系统发行版信息)4.cat/…

    2022年6月6日
    163
  • 51单片机iic通信例程_linux移植8位单片机

    51单片机iic通信例程_linux移植8位单片机移植好的源码下载:http://download.csdn.net/detail/lxj_com2006/3746433Keil3C518.18注册版下载:http://download.csdn.net/detail/lxj_com2006/3746501网络抓包工具下载:http://download.csdn.net/detail/lxj_com2006/3746594

    2022年10月21日
    2
  • maven配置以及设置国内镜像

    maven配置以及设置国内镜像下载好maven时,将maven包放进D盘,创建maven文件夹,进行解压。然后进行配置右键“计算机”,选择“属性”,之后点击“高级系统设置”,点击“环境变量”,来设置环境变量,有以下系统变量需要配置:新建系统变量MAVEN_HOME变量值:D:\maven\apache-maven-3.5.4编辑系统变量Path添加变量值:;%MAVEN_HOM…

    2022年5月8日
    51
  • Pytest(15)pytest分布式执行用例[通俗易懂]

    Pytest(15)pytest分布式执行用例[通俗易懂]前言平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间

    2022年7月29日
    10
  • vue跨域解决方案 简书_vueaxios跨域请求

    vue跨域解决方案 简书_vueaxios跨域请求vue解决跨域问题vue跨域解决方法和小总结vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No’Access-Control-Allow-Origin’headerispresentontherequestedresource.”这种跨域错误。要想本地正常的调试,解决的办法有三个:一、后台更改headerheader(‘A…

    2022年9月17日
    3
  • translate3d绕轴旋转

    translate3d绕轴旋转<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><metahttp-equiv=”X-UA-Compatible”content=”IE=edge”><metaname=”viewport”content=”width=device-width,initial-scale=1.0″><title…

    2025年5月31日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号