RPC框架motan使用

簡(jiǎn)介

Hello World

  • 使用的過(guò)程分為Server端和Client端金闽,Server提供RCP的服務(wù)接口籍凝,Client端發(fā)起調(diào)用獲取結(jié)果排监。
  • maven的pom文件配置
<properties>
    <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-springsupport</artifactId>
        <version>${motan.version}</version>
    </dependency>
</dependencies>

Server 端

  • 暴露的接口
package com.raventech.user.motan;

/**
 * @author liuhaiming on 10/11/2016.
 */
public interface HelloService {
  String hello(String world);
}
  • 暴露接口的實(shí)現(xiàn)類(lèi)
package com.raventech.user.motan;

/**
 * @author liuhaiming on 10/11/2016.
 */
public class HelloServiceImpl implements HelloService {
  @Override
  public String hello(String world) {
    return "hello " + world;
  }
}
  • 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">

    <bean id="helloServiceImpl" class="com.raventech.user.motan.HelloServiceImpl"/>
    <motan:service interface="com.raventech.user.motan.HelloService" ref="helloServiceImpl" export="8002"/>
</beans>
  • 啟動(dòng)服務(wù)的方法(運(yùn)行main方法就可以啟動(dòng)服務(wù)了)
package com.raventech.user;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author liuhaiming on 10/11/2016.
 */
public class Server {
  public static void main(String[] args) {
    new ClassPathXmlApplicationContext("classpath:motan-server.xml");
    System.out.println("Server start ...");
  }
}

Client 端

  • 要請(qǐng)求的接口(不論包名還是類(lèi)名都要和Server端的一樣)
package com.raventech.user.motan;

/**
 * @author liuhaiming on 10/11/2016.
 */
public interface HelloService {
  String hello(String world);
}
  • 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:referer id="helloService" interface="com.raventech.user.motan.HelloService" directUrl="127.0.0.1:8002"/>
</beans>
  • 調(diào)用服務(wù)的方法(運(yùn)行main方法就可以調(diào)用服務(wù)了)
package com.raventech.web;

import com.raventech.user.motan.HelloService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author liuhaiming on 10/11/2016.
 */
public class Client {
  public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:motan-client.xml");
    HelloService fooService = (HelloService) applicationContext.getBean("helloService");
    System.out.println(fooService.hello("world"));
  }
}
  • 調(diào)用響應(yīng)結(jié)果

使用Consul作為注冊(cè)中心

  • 在集群環(huán)境下使用motan需要依賴Consul等服務(wù)發(fā)現(xiàn)組件
  • Consul的介紹安裝和使用
  • maven的pom文件配置(在上面的基礎(chǔ)上增加consul)
<dependency>
    <groupId>com.weibo</groupId>
    <artifactId>motan-registry-consul</artifactId>
    <version>${motan.version}</version>
</dependency>

Server 端

  • xml配置文件添加consul的注冊(cè)
<?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="consul" name="registry" address="127.0.0.1:8500"/>

    <bean id="helloServiceImpl" class="com.raventech.user.motan.HelloServiceImpl"/>
    <motan:service interface="com.raventech.user.motan.HelloService" ref="helloServiceImpl" registry="registry"  export="8002"/>
</beans>
  • 啟動(dòng)服務(wù)的方法要在程序啟動(dòng)后調(diào)用心跳開(kāi)關(guān)迫卢,將服務(wù)注冊(cè)到consul,不然Client無(wú)法調(diào)用 (別的和上文Hello World一樣不變邓梅,運(yùn)行main方法啟動(dòng)服務(wù))
package com.raventech.user;

import com.weibo.api.motan.common.MotanConstants;
import com.weibo.api.motan.util.MotanSwitcherUtil;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author liuhaiming on 10/11/2016.
 */
public class Server {
  public static void main(String[] args) {
    new ClassPathXmlApplicationContext("classpath:motan-server.xml");
    MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);
    System.out.println("Server start ...");
  }
}

Client 端

  • xml配置文件添加consul的服務(wù)發(fā)現(xiàn)
<?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="consul" name="registry" address="127.0.0.1:8500"/>

    <motan:referer id="helloService" interface="com.raventech.user.motan.HelloService" registry="registry"/>
</beans>
  • 別的和上文Hello World一樣不變脱盲,運(yùn)行Client類(lèi)的main方法調(diào)用服務(wù)

使用注解的方式集成到Spring Boot項(xiàng)目中

  • 項(xiàng)目改成Spring Boot后拋棄了繁瑣的xml文件配置改為用注解的方式。motan也支持注解的方式進(jìn)行配置日缨,這樣更加方便了代碼的集成和風(fēng)格的統(tǒng)一宾毒。
  • 繼續(xù)在前面的代碼中進(jìn)行修改,沒(méi)提到的保持不變

Server 端

  • 刪除motan-server.xml配置文件
  • 用注解加載motan需要的配置
package com.raventech.user.config;

import com.weibo.api.motan.config.springsupport.AnnotationBean;
import com.weibo.api.motan.config.springsupport.BasicServiceConfigBean;
import com.weibo.api.motan.config.springsupport.ProtocolConfigBean;
import com.weibo.api.motan.config.springsupport.RegistryConfigBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author liuhaiming on 10/11/2016.
 */
@Configuration
public class MotanConfiguration {

  @Bean
  public AnnotationBean motanAnnotationBean() {
    AnnotationBean motanAnnotationBean = new AnnotationBean();
    motanAnnotationBean.setPackage("com.raventech.user.motan");
    return motanAnnotationBean;
  }

  @Bean(name = "motan")
  public ProtocolConfigBean protocolConfig1() {
    ProtocolConfigBean config = new ProtocolConfigBean();
    config.setDefault(true);
    config.setName("motan");
    config.setMaxContentLength(1048576);
    return config;
  }

  @Bean(name = "registry")
  public RegistryConfigBean registryConfig() {
    RegistryConfigBean config = new RegistryConfigBean();
    config.setRegProtocol("consul");
    config.setAddress("127.0.0.1:8500");
    return config;
  }

  @Bean
  public BasicServiceConfigBean baseServiceConfig() {
    BasicServiceConfigBean config = new BasicServiceConfigBean();
    config.setExport("motan:8002");
    config.setRegistry("registry");
    return config;
  }
}
  • 暴露接口的實(shí)現(xiàn)類(lèi)加上@MotanService注解殿遂,自動(dòng)生成bean
package com.raventech.user.motan;

import com.weibo.api.motan.config.springsupport.annotation.MotanService;

/**
 * @author liuhaiming on 10/11/2016.
 */
@MotanService
public class HelloServiceImpl implements HelloService {
  @Override
  public String hello(String world) {
    return "hello " + world;
  }
}
  • 啟動(dòng)服務(wù)的方法就是啟動(dòng)Spring Boot項(xiàng)目,并在在程序啟動(dòng)后調(diào)用心跳開(kāi)關(guān) (運(yùn)行main方法啟動(dòng)服務(wù))
package com.raventech.user;

import com.weibo.api.motan.common.MotanConstants;
import com.weibo.api.motan.util.MotanSwitcherUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author liuhaiming on 10/11/2016.
 */
@SpringBootApplication
public class Server {
  public static void main(String[] args) {
    SpringApplication.run(Server.class, args);
    MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);
    System.out.println("Server start ...");
  }
}

Client 端

  • 刪除motan-client.xml配置文件和Client.java啟動(dòng)文件乙各,已經(jīng)沒(méi)用了
  • 用注解加載motan需要的配置
package com.raventech.web.config;

import com.weibo.api.motan.config.springsupport.AnnotationBean;
import com.weibo.api.motan.config.springsupport.BasicRefererConfigBean;
import com.weibo.api.motan.config.springsupport.ProtocolConfigBean;
import com.weibo.api.motan.config.springsupport.RegistryConfigBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author liuhaiming on 10/11/2016.
 */
@Configuration
public class MotanConfiguration {

  @Bean
  public AnnotationBean motanAnnotationBean() {
    AnnotationBean motanAnnotationBean = new AnnotationBean();
    # 添加用到motan注解的類(lèi)的包名
    motanAnnotationBean.setPackage("com.raventech.web.controller");
    return motanAnnotationBean;
  }

  @Bean(name = "motan")
  public ProtocolConfigBean protocolConfig1() {
    ProtocolConfigBean config = new ProtocolConfigBean();
    config.setDefault(true);
    config.setName("motan");
    config.setMaxContentLength(1048576);
    return config;
  }

  @Bean(name = "registry")
  public RegistryConfigBean registryConfig() {
    RegistryConfigBean config = new RegistryConfigBean();
    config.setRegProtocol("consul");
    config.setAddress("127.0.0.1:8500");
    return config;
  }

  @Bean(name = "basicRefererConfig")
  public BasicRefererConfigBean basicRefererConfigBean() {
    BasicRefererConfigBean config = new BasicRefererConfigBean();
    config.setProtocol("motan");
    config.setRegistry("registry");
    config.setThrowException(true);
    return config;
  }
}
  • 調(diào)用方法(在Controller中使用)
package com.raventech.web.controller;

import com.raventech.user.motan.HelloService;
import com.raventech.web.common.BaseController;
import com.weibo.api.motan.config.springsupport.annotation.MotanReferer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author liuhaiming on 10/11/2016.
 */
@RestController
@RequestMapping("/motan")
public class HelloController extends BaseController {

  @MotanReferer(basicReferer = "basicRefererConfig")
  private HelloService helloService;

  @RequestMapping(value = "/hello", method = RequestMethod.GET)
  public String hello() throws Exception {
    return helloService.hello("world");
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市耳峦,隨后出現(xiàn)的幾起案子恩静,更是在濱河造成了極大的恐慌,老刑警劉巖蹲坷,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驶乾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡循签,警方通過(guò)查閱死者的電腦和手機(jī)级乐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)县匠,“玉大人风科,你說(shuō)我怎么就攤上這事∑虻” “怎么了贼穆?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兰粉。 經(jīng)常有香客問(wèn)我故痊,道長(zhǎng),這世上最難降的妖魔是什么玖姑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任愕秫,我火速辦了婚禮慨菱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豫领。我一直安慰自己抡柿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布等恐。 她就那樣靜靜地躺著洲劣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪课蔬。 梳的紋絲不亂的頭發(fā)上囱稽,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音二跋,去河邊找鬼战惊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛扎即,可吹牛的內(nèi)容都是我干的吞获。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谚鄙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼各拷!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闷营,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烤黍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后傻盟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體速蕊,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年娘赴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了规哲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筝闹,死狀恐怖媳叨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情关顷,我是刑警寧澤糊秆,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站议双,受9級(jí)特大地震影響痘番,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一汞舱、第九天 我趴在偏房一處隱蔽的房頂上張望伍纫。 院中可真熱鬧,春花似錦昂芜、人聲如沸莹规。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)良漱。三九已至,卻和暖如春欢际,著一層夾襖步出監(jiān)牢的瞬間母市,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工损趋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留患久,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓浑槽,卻偏偏與公主長(zhǎng)得像蒋失,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子桐玻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理高镐,服務(wù)發(fā)現(xiàn),斷路器畸冲,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 在互聯(lián)網(wǎng)應(yīng)用領(lǐng)域,服務(wù)的動(dòng)態(tài)性需求十分常見(jiàn)观腊,這就對(duì)服務(wù)的自動(dòng)發(fā)現(xiàn)和可動(dòng)態(tài)擴(kuò)展提出了很高的要求邑闲。 微服務(wù)系統(tǒng)動(dòng)輒上萬(wàn)...
    Liberalman閱讀 8,038評(píng)論 23 80
  • 整天做著和周?chē)艘粯拥氖虑樯凰剩词故侵車(chē)娜隋e(cuò)了,也很難被意識(shí)到儡陨。如果有人對(duì)說(shuō):嘿褪子!你清醒一點(diǎn)∑澹可能你會(huì)勃然大怒道:...
    狐貍和葡萄閱讀 200評(píng)論 0 0