springboot集成motan

我的項(xiàng)目沒(méi)有用到maven? 而是用到了一個(gè)叫g(shù)radle的管理工具

Gradle是一個(gè)基于JVM的構(gòu)建工具倔丈,是一款通用靈活的構(gòu)建工具,支持maven, Ivy倉(cāng)庫(kù)钧惧,支持傳遞性依賴管理,而不需要遠(yuǎn)程倉(cāng)庫(kù)或者是pom.xml和ivy.xml配置文件勾习,基于Groovy浓瞪,build腳本使用Groovy編寫(xiě)。



Motan 的架構(gòu)及模塊設(shè)計(jì)

  架構(gòu)設(shè)計(jì)巧婶,分為服務(wù)提供方(RPC Server)乾颁、服務(wù)調(diào)用方(RPC Client)、注冊(cè)中心(Registry)三個(gè)角色艺栈,Server 向 Registry 注冊(cè)聲明所提供的服務(wù)英岭;Client 向 Registry 訂閱指定服務(wù),與 Registry 返回的服務(wù)列表的 Server 建立連接眼滤,進(jìn)行 RPC 服務(wù)調(diào)用巴席。Client 通過(guò) Registry 感知 Server 的狀態(tài)變更。三者的交互關(guān)系如下圖:

關(guān)系圖




motan-api

可以看做是RPC Server

這里面,就是對(duì)client暴露的接口 ,通俗一點(diǎn),對(duì)外暴露的接口,類似于service



motan-client

這里可以簡(jiǎn)單的看做是調(diào)用端,需要配置config的內(nèi)容如下,這里采用注解的方式配置的

/**

*@Author lccsetsun

*@Description client端配置信息

*/

@Configuration

public class MotanConfiguration {

/**

? ? * @Description: 聲明Annotation用來(lái)指定需要解析的包名

? ? */

? ? @Bean

? ? @ConfigurationProperties(prefix ="motan.annotation")

public AnnotationBean motanAnnotationBean() {

AnnotationBean motanAnnotationBean =new AnnotationBean();

// 添加用到motan注解的類的包名

? ? ? ? return motanAnnotationBean;

}

/**

? ? * @Description: 協(xié)議配置

? ? */

? ? @Bean(name ="motan")

@ConfigurationProperties(prefix ="motan.protocol")

public ProtocolConfigBean protocolConfig() {

ProtocolConfigBean config =new ProtocolConfigBean();

return config;

}

/**

? ? * @Description: 注冊(cè)中心配置

? ? */

? ? @Bean(name ="registry")

@ConfigurationProperties(prefix ="motan.registry")

public RegistryConfigBean registryConfig() {

RegistryConfigBean config =new RegistryConfigBean();

return config;

}

/**

? ? * @Description: 服務(wù)端配置

? ? */

? ? @Bean(name ="basicRefererConfig")

@ConfigurationProperties(prefix ="motan.server")

public BasicRefererConfigBean basicRefererConfigBean() {

BasicRefererConfigBean config =new BasicRefererConfigBean();

return config;

}

}

對(duì)應(yīng)的application.properties 配置文件內(nèi)容為


#\u05e2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd

motan.registry.regProtocol=zookeeper

#motan.registry.address=

motan.registry.address=127.0.0.1:2181

motan.registry.connectTimeout=2000

#\u042d\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd

motan.protocol.name=restful

motan.protocol.endpointFactory=netty

#motan.protocol.minWorkerThread=20 #\ufffd\ufffd\u0421\ufffd\ufffd\ufffd\ufffdpool\ufffd\u07f3\ufffd\ufffd\ufffd

#motan.protocol.maxWorkerThread=50 #\ufffd\ufffd\ufffd\ufffd\ufffdpool\ufffd\u07f3\ufffd\ufffd\ufffd

motan.protocol.maxContentLength=1048576

motan.protocol.isDefault=true

#\u05b8\ufffd\ufffd\ufffd\ufffd\u04aa\ufffd\ufffd\ufffd\ufffd\ufffd\u0130\ufffd\ufffd\ufffd

motan.annotation.package=cn.thunderwind.uc.user? ?

#\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd

motan.server.protocol=motan

motan.server.registry=registry

motan.server.throwException=true

# mongodb

spring.data.mongodb.uri=mongodb://192.168.1.203:27017/log_db

# \ufffd\u02ff\ufffd

server.port=9087



motan-server


server則是具體操作,你要操作什么邏輯,全在這里操作,操作mapper? 調(diào)用方法等等

驅(qū)動(dòng)配置如下


/**

*@Author lccsetsun

*@Date 2018/2/1

*@Description? motan配置信息

*/

@Configuration

public class MotanConfiguration {

/**

? ? * @Description: 聲明Annotation用來(lái)指定需要解析的包名

? ? */

? ? @Bean

? ? @ConfigurationProperties(prefix ="motan.annotation")

public AnnotationBean motanAnnotationBean() {

AnnotationBean motanAnnotationBean =new AnnotationBean();

return motanAnnotationBean;

}

/**

? ? * @Description: 協(xié)議配置

? ? */

? ? @Bean(name ="motan")

@ConfigurationProperties(prefix ="motan.protocol")

public ProtocolConfigBean protocolConfig1() {

ProtocolConfigBean config =new ProtocolConfigBean();

return config;

}

/**

? ? * @Description: 注冊(cè)中心配置

? ? */

? ? @Bean(name ="registry")

@ConfigurationProperties(prefix ="motan.registry")

public RegistryConfigBean registryConfig() {

RegistryConfigBean config =new RegistryConfigBean();

return config;

}

/**

? ? * @Description: 服務(wù)端配置

? ? */

? ? @Bean

? ? @ConfigurationProperties(prefix ="motan.server")

public BasicServiceConfigBean baseServiceConfig() {

BasicServiceConfigBean config =new BasicServiceConfigBean();

return config;

}

}

對(duì)應(yīng)的properties配置文件

# \ufffd\u02ff\ufffd

server.port=9996

#AOP

spring.aop.proxy-target-class=true

spring.thymeleaf.cache=false

# \ufffd\ufffd\ufffd\u077f\ufffd

spring.datasource.url=jdbc:mysql://name?characterEncoding=utf8&useSSL=true

spring.datasource.username=name

spring.datasource.password=1123

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# REDIS (RedisProperties)

spring.redis.database=1

spring.redis.host=192.168.1.203

spring.redis.port=6379

spring.redis.password=

spring.redis.pool.max-active=8

spring.redis.pool.max-wait=-1

spring.redis.pool.max-idle=8

spring.redis.pool.min-idle=0

spring.redis.timeout=0

# \ufffd\ufffd\u05be\ufffd\ufffd\ufffd\ufffd\ufffd\u026b

spring.output.ansi.enabled=DETECT

# mongodb

spring.data.mongodb.uri=mongodb://192.168.1.203:27017/log_db

# mybatis

mybatis.config-locations=classpath:myBatis-config.xml

mybatis.mapper-locations=classpath:mapper/*.xml

## motan

motan.registry.regProtocol=zookeeper

motan.registry.address=127.0.0.1:2181

motan.registry.connectTimeout=2000

##\u042d\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd

motan.protocol.name=restful

motan.protocol.endpointFactory=netty

#motan.protocol.minWorkerThread=20 #\ufffd\ufffd\u0421\ufffd\ufffd\ufffd\ufffdpool\ufffd\u07f3\ufffd\ufffd\ufffd

#motan.protocol.maxWorkerThread=50 #\ufffd\ufffd\ufffd\ufffd\ufffdpool\ufffd\u07f3\ufffd\ufffd\ufffd

motan.protocol.maxContentLength=1048576

motan.protocol.isDefault=true

#motan.protocol.filter=statistic

##\u05b8\ufffd\ufffd\ufffd\ufffd\u04aa\ufffd\ufffd\ufffd\ufffd\ufffd\u0130\ufffd\ufffd\ufffd

motan.annotation.package=cn.thunderwind

##\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd

motan.server.export=motan:8003

motan.server.registry=registry


motan日志記錄以及攔截請(qǐng)求

import java.util.HashMap;

import java.util.Map;

/**

* describe:

* MotanService 日志記錄

* @author hetong

* @date 2018/01/30

**/

@SpiMeta(name ="motanLogFilter")

@Activation(key = {MotanConstants.NODE_TYPE_SERVICE}, sequence =30)

public class MotanLogFilterimplements Filter {

private final static GtLoggerlogger = GtLoggerFactory.getLogger(MotanLogFilter.class);

@Override

? ? public Response filter(Caller caller, Request request) {

Long start = System.currentTimeMillis();

Map info =new HashMap<>(7);

info.put("content","MotanService層日志");

info.put("loggerName", request.getInterfaceName());

info.put("method", request.getMethodName());

info.put("attachments", request.getAttachments());

info.put("requestId", request.getRequestId());

Map args =null;

if ( request.getArguments() !=null && request.getArguments().length >0 ) {

args =new HashMap<>(request.getArguments().length);

for (Object arg : request.getArguments()) {

if (arg !=null) {

args.put(arg.getClass().getName(), arg.toString());

}

}

}

info.put("remoteAddress", caller.getUrl().getHost());

info.put("arguments", args);

Response response = caller.call(request);

info.put("takeTime", System.currentTimeMillis() - start);

logger.operate(Operates.desc("MotanService"), JSON.toJSON(info).toString());

Exception exception = response.getException();

if (response ==null || exception !=null) {

info.put("exception", exception.getMessage());

}

logger.operate(Operates.desc("Motan Service"), JSON.toJSONString(info));

return response;

}

}


統(tǒng)一異常處理

@SpiMeta(name = "motanExceptionFilter") @Activation(key = {MotanConstants.NODE_TYPE_SERVICE}, sequence = 40) public class MotanExceptionFilter implements Filter { private final static GtLogger logger = GtLoggerFactory.getLogger(MotanExceptionFilter.class); @Override public Response filter(Caller caller, Request request) { Response response = null; boolean isThrowable = false; DefaultResponse e_resp = null; try { response = caller.call(request); Exception exception = response.getException(); if (response == null || exception != null) { isThrowable = true; e_resp = transExceptionRespWithResp(response, exception.getCause()); } } catch (Exception e) { isThrowable = true; e_resp = transExceptionRespWithReq(request, e.getCause()); } return isThrowable ? e_resp : response; } private DefaultResponse transExceptionRespWithResp(Response response, Throwable exception) { logger.error("MotanService 返回異常", exception); DefaultResponse dResp = new DefaultResponse(); dResp.setAttachments(response.getAttachments()); dResp.setProcessTime(response.getProcessTime()); dResp.setRpcProtocolVersion(response.getRpcProtocolVersion()); dResp.setRequestId(response.getRequestId()); dResp.setValue(new ResponseEntity.Builder().setData(exception) .setMessage("返回異常! error:" + exception.getMessage()) .setStatus(-1) .build()); return dResp; } private DefaultResponse transExceptionRespWithReq(Request response, Throwable exception) { logger.error("MotanService 返回異常", exception); DefaultResponse dResp = new DefaultResponse(); dResp.setAttachments(response.getAttachments()); dResp.setRpcProtocolVersion(response.getRpcProtocolVersion()); dResp.setRequestId(response.getRequestId()); dResp.setValue(new ResponseEntity.Builder().setData(exception) .setMessage("返回異常! error:" + exception.getMessage()) .setStatus(-1) .build()); return dResp; } }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诅需,一起剝皮案震驚了整個(gè)濱河市漾唉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌堰塌,老刑警劉巖赵刑,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異场刑,居然都是意外死亡般此,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)牵现,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铐懊,“玉大人,你說(shuō)我怎么就攤上這事瞎疼】坪酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵贼急,是天一觀的道長(zhǎng)茅茂。 經(jīng)常有香客問(wèn)我捏萍,道長(zhǎng),這世上最難降的妖魔是什么空闲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任令杈,我火速辦了婚禮,結(jié)果婚禮上碴倾,老公的妹妹穿的比我還像新娘逗噩。我一直安慰自己,他們只是感情好影斑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布给赞。 她就那樣靜靜地躺著,像睡著了一般矫户。 火紅的嫁衣襯著肌膚如雪片迅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天皆辽,我揣著相機(jī)與錄音柑蛇,去河邊找鬼。 笑死驱闷,一個(gè)胖子當(dāng)著我的面吹牛耻台,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播空另,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盆耽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扼菠?” 一聲冷哼從身側(cè)響起摄杂,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎循榆,沒(méi)想到半個(gè)月后析恢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秧饮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年映挂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盗尸。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柑船,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泼各,到底是詐尸還是另有隱情椎组,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布历恐,位于F島的核電站寸癌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弱贼。R本人自食惡果不足惜蒸苇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吮旅。 院中可真熱鬧溪烤,春花似錦、人聲如沸庇勃。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)责嚷。三九已至鸳兽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間罕拂,已是汗流浹背揍异。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留爆班,地道東北人衷掷。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像柿菩,于是被迫代替她去往敵國(guó)和親戚嗅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理枢舶,服務(wù)發(fā)現(xiàn)懦胞,斷路器,智...
    卡卡羅2017閱讀 134,665評(píng)論 18 139
  • =========================================================...
    lavor閱讀 3,490評(píng)論 0 5
  • 在我搭建基于Spring Cloud的微服務(wù)體系應(yīng)用的時(shí)候所需要或者是常用的屬性配置文件祟辟,還有這些屬性的用途医瘫,此配...
    StrongManAlone閱讀 4,027評(píng)論 0 18
  • RPC框架遠(yuǎn)程調(diào)用的實(shí)現(xiàn)方式在原理上是比較簡(jiǎn)單的,即將調(diào)用的方法(接口名旧困、方法名醇份、參數(shù)類型、參數(shù))序列化之后發(fā)送到...
    謎碌小孩閱讀 3,105評(píng)論 0 13
  • Fresco學(xué)習(xí)中文地址:Fresco中文學(xué)習(xí) Fresco Javadoc地址:Javadoc Fresco初始...
    TragedyGo閱讀 4,446評(píng)論 2 10