java rpc motan_RPC框架motan使用
简介
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使用相关推荐
- Java RPC 分布式框架性能大比拼,Dubbo排老几?
来源:http://985.so/aXe2 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成 ...
- motan学习笔记 一 微博轻量级RPC框架Motan
前言 motan学习笔记 一 微博轻量级RPC框架Motan motan学习笔记 二 motan架构分析 motan学习笔记 三 motan Demo 分析 motan学习笔记 四 motan Dem ...
- Dobbo的继任者?试用微博RPC框架Motan
从14年开始就陆续看到新浪微博RPC框架Motan的介绍,时隔两年后,微博团队终于宣布开源轻量级RPC框架Motan,项目地址: https://github.com/weibocom/motan/ ...
- 微博轻量级RPC框架Motan
Motan 正式开源了,项目地址为https://github.com/weibocom/motan.微博技术团队希望未来能有更多优秀的开源人入驻,并进一步完善优化. 微博轻量级RPC框架Motan正 ...
- 微博RPC框架Motan
原文来自:http://blog.csdn.net/autfish/article/details/51374798 从14年开始就陆续看到新浪微博RPC框架Motan的介绍,时隔两年后,微博团队终于 ...
- voyage java_GitHub - yezilong9/voyage: 采用Java实现的基于netty轻量的高性能分布式RPC服务框架...
Voyage Overview 采用Java实现的基于netty轻量的高性能分布式RPC服务框架.实现了RPC的基本功能,开发者也可以自定义扩展,简单,易用,高效. Features 服务端支持注解配 ...
- 视频教程-RPC服务框架(Dubbo)源码分析-Java
RPC服务框架(Dubbo)源码分析 鲁班学院-子路老师曾就职于谷歌.天猫电商等多家互联网公司,历任java架构师.研发经理等职位,参与并主导千万级并发电商网站与后端供应链研发体系搭建,多次参与电商大 ...
- 开源项目推荐:主流RPC开源框架及知识科普
什么是rpc框架? 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比 ...
- 微博开源框架Motan初体验
前两天,我在开源中国的微信公众号看到新浪微博的轻量Rpc框架--Motan开源了.上网查了下,才得知这个Motan来头不小,支撑着新浪微博的千亿调用,曾经在2014年的春晚中有着千亿次的调用,对抗了春 ...
最新文章
- Java关键字系列(public,protected,private)
- BPSK,QPSK,2FSK,16QAM,64QAM信号在高斯信道与瑞利信道下的误码率性能仿真
- opencv 设置视频帧的分辨率“无效”
- 如何HttpWebRequest模拟登陆,获取服务端返回Cookie以便登录请求后使用
- concurrent(七)ConcurrentHashMap源码分析
- [LeetCode]高频算法题
- linux ospf 命令,OSPF单区域配置 - linuxprobe2020的个人空间 - OSCHINA - 中文开源技术交流社区...
- 来前端君朋友圈,一起聊前端面试技巧
- 北京市交管局联合高德地图发布北京中考出行提示
- 计算机信息安全与信息伦理课件,信息安全实验室
- 提高编程技能最有效的方法
- 【穷举】用c#实现一个数组(1,1,2,2,3,3,4,4)排列,每两个相同数字中间都间隔了这个数字个数...
- mysql demo_mysql 查询小demo
- 155款安卓开源项目源码整理,总有你要找的(精心收集)
- 《教我兄弟学Android逆向12 编写xpose模块》
- linux vi回到末行模式,Linux vi/vim 的命令模式,,编辑模式,末行模式
- 原生JS快速实现拖放(drag and drop)效果
- 去水印的手机APP哪个好用,怎么一键去水印
- 移动开发---背景渐变色(由蓝色变成红色),以及数字变化
- 极客时间--数据结构与算法之美
热门文章
- 计算机网络在校园中的应用方向,计算机技术在大学校园网络中的应用
- hexo-admin快速发布博客
- 更新补丁导致360随身wifi提示USB设备驱动异常
- [Swagger] Swagger2Markup 配置
- 大数据和云计算(一)——神奇的打字复印店
- 同底数幂比较大小方法_七年级下学期,幂的乘方常见题型分析,利用法则比较大小...
- Ubuntu系统安装以及解决黑屏问题
- pipe 半双工_管道为什么是半双工的呢?
- linux进程状态1026,Linux进程状态分析
- 爬取盗墓笔记存放csv中