简介

motan是新浪微博开源的一套轻量级、方便使用的RPC框架

Hello World

使用的过程分为Server端和Client端,Server提供RCP的服务接口,Client端发起调用获取结果。

maven的pom文件配置

0.2.1

com.weibo

motan-core

${motan.version}

com.weibo

motan-transport-netty

${motan.version}

com.weibo

motan-springsupport

${motan.version}

Server 端

暴露的接口

package com.raventech.user.motan;

/**

* @author liuhaiming on 10/11/2016.

*/

public interface HelloService {

String hello(String world);

}

暴露接口的实现类

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配置文件,暴露接口

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">

启动服务的方法(运行main方法就可以启动服务了)

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 端

要请求的接口(不论包名还是类名都要和Server端的一样)

package com.raventech.user.motan;

/**

* @author liuhaiming on 10/11/2016.

*/

public interface HelloService {

String hello(String world);

}

xml配置文件,获取接口信息

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">

调用服务的方法(运行main方法就可以调用服务了)

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"));

}

}

调用响应结果

使用Consul作为注册中心

在集群环境下使用motan需要依赖Consul等服务发现组件

maven的pom文件配置(在上面的基础上增加consul)

com.weibo

motan-registry-consul

${motan.version}

Server 端

xml配置文件添加consul的注册

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">

启动服务的方法要在程序启动后调用心跳开关,将服务注册到consul,不然Client无法调用 (别的和上文Hello World一样不变,运行main方法启动服务)

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的服务发现

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">

别的和上文Hello World一样不变,运行Client类的main方法调用服务

使用注解的方式集成到Spring Boot项目中

项目改成Spring Boot后抛弃了繁琐的xml文件配置改为用注解的方式。motan也支持注解的方式进行配置,这样更加方便了代码的集成和风格的统一。

继续在前面的代码中进行修改,没提到的保持不变

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;

}

}

暴露接口的实现类加上@MotanService注解,自动生成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;

}

}

启动服务的方法就是启动Spring Boot项目,并在在程序启动后调用心跳开关 (运行main方法启动服务)

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启动文件,已经没用了

用注解加载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注解的类的包名

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;

}

}

调用方法(在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");

}

}

java rpc motan_RPC框架motan使用相关推荐

  1. Java RPC 分布式框架性能大比拼,Dubbo排老几?

    来源:http://985.so/aXe2 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成 ...

  2. motan学习笔记 一 微博轻量级RPC框架Motan

    前言 motan学习笔记 一 微博轻量级RPC框架Motan motan学习笔记 二 motan架构分析 motan学习笔记 三 motan Demo 分析 motan学习笔记 四 motan Dem ...

  3. Dobbo的继任者?试用微博RPC框架Motan

    从14年开始就陆续看到新浪微博RPC框架Motan的介绍,时隔两年后,微博团队终于宣布开源轻量级RPC框架Motan,项目地址: https://github.com/weibocom/motan/ ...

  4. 微博轻量级RPC框架Motan

    Motan 正式开源了,项目地址为https://github.com/weibocom/motan.微博技术团队希望未来能有更多优秀的开源人入驻,并进一步完善优化. 微博轻量级RPC框架Motan正 ...

  5. 微博RPC框架Motan

    原文来自:http://blog.csdn.net/autfish/article/details/51374798 从14年开始就陆续看到新浪微博RPC框架Motan的介绍,时隔两年后,微博团队终于 ...

  6. voyage java_GitHub - yezilong9/voyage: 采用Java实现的基于netty轻量的高性能分布式RPC服务框架...

    Voyage Overview 采用Java实现的基于netty轻量的高性能分布式RPC服务框架.实现了RPC的基本功能,开发者也可以自定义扩展,简单,易用,高效. Features 服务端支持注解配 ...

  7. 视频教程-RPC服务框架(Dubbo)源码分析-Java

    RPC服务框架(Dubbo)源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大 ...

  8. 开源项目推荐:主流RPC开源框架及知识科普

    什么是rpc框架? 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比 ...

  9. 微博开源框架Motan初体验

    前两天,我在开源中国的微信公众号看到新浪微博的轻量Rpc框架--Motan开源了.上网查了下,才得知这个Motan来头不小,支撑着新浪微博的千亿调用,曾经在2014年的春晚中有着千亿次的调用,对抗了春 ...

最新文章

  1. Java关键字系列(public,protected,private)
  2. BPSK,QPSK,2FSK,16QAM,64QAM信号在高斯信道与瑞利信道下的误码率性能仿真
  3. opencv 设置视频帧的分辨率“无效”
  4. 如何HttpWebRequest模拟登陆,获取服务端返回Cookie以便登录请求后使用
  5. concurrent(七)ConcurrentHashMap源码分析
  6. [LeetCode]高频算法题
  7. linux ospf 命令,OSPF单区域配置 - linuxprobe2020的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 来前端君朋友圈,一起聊前端面试技巧
  9. 北京市交管局联合高德地图发布北京中考出行提示
  10. 计算机信息安全与信息伦理课件,信息安全实验室
  11. 提高编程技能最有效的方法
  12. 【穷举】用c#实现一个数组(1,1,2,2,3,3,4,4)排列,每两个相同数字中间都间隔了这个数字个数...
  13. mysql demo_mysql 查询小demo
  14. 155款安卓开源项目源码整理,总有你要找的(精心收集)
  15. 《教我兄弟学Android逆向12 编写xpose模块》
  16. linux vi回到末行模式,Linux vi/vim 的命令模式,,编辑模式,末行模式
  17. 原生JS快速实现拖放(drag and drop)效果
  18. 去水印的手机APP哪个好用,怎么一键去水印
  19. 移动开发---背景渐变色(由蓝色变成红色),以及数字变化
  20. 极客时间--数据结构与算法之美

热门文章

  1. 计算机网络在校园中的应用方向,计算机技术在大学校园网络中的应用
  2. hexo-admin快速发布博客
  3. 更新补丁导致360随身wifi提示USB设备驱动异常
  4. [Swagger] Swagger2Markup 配置
  5. 大数据和云计算(一)——神奇的打字复印店
  6. 同底数幂比较大小方法_七年级下学期,幂的乘方常见题型分析,利用法则比较大小...
  7. Ubuntu系统安装以及解决黑屏问题
  8. pipe 半双工_管道为什么是半双工的呢?
  9. linux进程状态1026,Linux进程状态分析
  10. 爬取盗墓笔记存放csv中