新浪开源轻量级分布式RPC框架motan简单示例解析

目录
  • 前言
  • 概述
  • 功能
  • 简单调用示例
    • 在pom中添加依赖
    • 为调用方和服务方创建公共接口
    • 编写业务接口逻辑、创建并启动RPCServer
    • 创建并执行RPCClient
  • 集群调用示例
    • 使用CONSUL作为注册中心
      • Motan-Consul配置
    • 使用ZOOKEEPER作为注册中心
      • Motan-ZooKeeper配置

前言

好消息,支撑微博千亿调用的轻量级 RPC 框架 Motan 在2016年5月份正式开源了,业界现在除了Dubbo 和 DubboX典型的分布式RPC服务治理型框架外,又多了一个优秀的分布式RPC了。心动了吗?使用过dubbo的话,so easy的上手,官方实例如下,动起来吧

我的demo地址,参考官方实例的简单demo,包含zookeeper注册中心,以及服务监控平台:https://coding.net/u/kailingchen/p/motan_Test/git

概述

Motan是一套高性能、易于使用的分布式远程服务调用(RPC)框架。

github项目地址:https://github.com/weibocom/motan

功能

  • 支持通过spring配置方式集成,无需额外编写代码即可为服务提供分布式调用能力。
  • 支持集成consul、zookeeper等配置服务组件,提供集群环境的服务发现及治理能力。
  • 支持动态自定义负载均衡、跨机房流量调整等高级服务调度能力。
  • 基于高并发、高负载场景进行优化,保障生产环境下RPC服务高可用。

简单调用示例

在pom中添加依赖

<dependency>
    <groupId>com.weibogroupId>
    <artifactId>motan-coreartifactId>
    <version>0.1.1version>
dependency>
<dependency>
    <groupId>com.weibogroupId>
    <artifactId>motan-transport-nettyartifactId>
    <version>0.1.1version>
dependency>  <dependency>
    <groupId>com.weibogroupId>
    <artifactId>motan-springsupportartifactId>
    <version>0.1.1version>
dependency>
<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-contextartifactId>
    <version>4.2.4.RELEASEversion>
<dependency>

为调用方和服务方创建公共接口

src/main/java/quickstart/FooService.java

package quickstart; public interface FooService { public String hello(String name);
}

编写业务接口逻辑、创建并启动RPC Server

src/main/java/quickstart/FooServiceImpl.java

package quickstart; public class FooServiceImpl implements FooService { public String hello(String name) { System.out.println(name + " invoked rpc service"); return "hello " + name;
    }
}

src/main/resources/motan_server.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="serviceImpl" class="quickstart.FooServiceImpl" />  <motan:service interface="quickstart.FooService" ref="serviceImpl" export="8002" />

src/main/java/quickstart/Server.java

package quickstart; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Server { public static void main(String[] args) throws InterruptedException { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:motan_server.xml"); System.out.println("server start...");
    }
}

执行Server类中的main函数将会启动Motan服务,并监听8002端口.

创建并执行RPC Client

src/main/resources/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:referer id="remoteService" interface="quickstart.FooService" directUrl="localhost:8002"/>

src/main/java/quickstart/Client.java

package quickstart; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Client { public static void main(String[] args) throws InterruptedException { ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:motan_client.xml"); FooService service = (FooService) ctx.getBean("remoteService"); System.out.println(service.hello("motan"));
    }
}

执行Client类中的main函数将执行一次远程调用,并输出结果。

集群调用示例

在集群环境下使用Motan需要依赖外部服务发现组件,目前支持consul或zookeeper。

使用CONSUL作为注册中心

Consul安装与启动

安装(官方文档

# 这里以linux为例
wget https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip
unzip consul_0.6.4_linux_amd64.zip
sudo mv consul /bin

启动(官方文档

测试环境启动:
consul agent -dev

ui后台 http://localhost:8500/ui

Motan-Consul配置

在server和client中添加motan-registry-consul依赖

<dependency>
    <groupId>com.weibogroupId>
    <artifactId>motan-registry-consulartifactId>
    <version>0.1.1version>
<dependency>

在server和client的配置文件中分别增加consul registry定义。

<motan:registry regProtocol="consul" name="my_consul" address="127.0.0.1:8500"/>

在Motan client及server配置改为通过registry服务发现。

client

<motan:referer id="remoteService" interface="quickstart.FooService" registry="my_consul"/>

server

<motan:service interface="quickstart.FooService" ref="serviceImpl" registry="my_consul" export="8002" />

server程序启动后,需要显式调用心跳开关,注册到consul。

MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true)

进入ui后台查看服务是否正常提供调用

启动client,调用服务

使用ZOOKEEPER作为注册中心

ZooKeeper安装与启动

单机版安装与启动

wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
tar zxvf zookeeper-3.4.8.tar.gz

cd zookeeper-3.4.8/conf/
cp zoo_sample.cfg zoo.cfg

cd ../
sh bin/zkServer.sh start

Motan-ZooKeeper配置

在server和client中添加motan-registry-zookeeper依赖

<dependency>
    <groupId>com.weibogroupId>
    <artifactId>motan-registry-zookeeperartifactId>
    <version>0.1.1version>
<dependency>

在server和client的配置文件中分别增加zookeeper registry定义。

zookeeper为单节点

<motan:registry regProtocol="zookeeper" name="my_zookeeper" address="127.0.0.1:2181"/>

zookeeper多节点集群

<motan:registry regProtocol="zookeeper" name="my_zookeeper" address="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183"/>

在Motan client及server配置改为通过registry服务发现。

client

<motan:referer id="remoteService" interface="quickstart.FooService" registry="my_zookeeper"/>

server

<motan:service interface="quickstart.FooService" ref="serviceImpl" registry="my_zookeeper" export="8002" />

server程序启动后,需要显式调用心跳开关,注册到zookeeper。

MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true)

启动client,调用服务

以上就是新浪开源轻量级分布式RPC框架motan简单示例解析的详细内容,更多关于新浪开源轻量级分布式RPC框架motan的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java RPC框架如何实现客户端限流配置

    关键资源 关键资源总是有限的,也就意味着处理能力也有限,所以当面对大量业务时,为了保障自己能够有序的提供服务最经济的做法就是限制同一时间处理的事务数.比如银行的工作人员,一个工作人员同时只能为一个客户服务,来多了根本处理不了,不光是一种浪费而且有可以造成混乱的局面导致工作人员无法工作. 网络请求漏斗 越上层的服务器处理的事务越轻,应付请求的能力也越强,也就意味着同一请求越上层处理时间越短.为了有效的保护下层服务器,就需要对发送给下层的请求量做限流,在下层服务器可接受的范围内.否则就可能会出现下层

  • Java实现简单的RPC框架的示例代码

    一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用).Hessian.Http invoker等.另外,RPC是与语言无关的. rpc框架做的最重要的一件事情就是封装,调用者和被调用者的通讯细节,客户端代理负责向调用方法的方法名参数返回值包等信息根据通信协议组织成报文发送给服务端,服务端解析报文,根据客户端传递的信息执行对应的方法,然后将返回值安装协

  • 分析JAVA中几种常用的RPC框架

    RPC是远程过程调用的简称,广泛应用在大规模分布式应用中,作用是有助于系统的垂直拆分,使系统更易拓展.Java中的RPC框架比较多,各有特色,广泛使用的有RMI.Hessian.Dubbo等.RPC还有一个特点就是能够跨语言,本文只以JAVA语言里的RPC为例. 对于RPC有一个逻辑关系图,以RMI为例: 其他的框架结构也类似,区别在于对象的序列化方法,传输对象的通讯协议,以及注册中心的管理与failover设计(利用zookeeper). 客户端和服务端可以运行在不同的JVM中,Client只

  • 新浪开源轻量级分布式RPC框架motan简单示例解析

    目录 前言 概述 功能 简单调用示例 在pom中添加依赖 为调用方和服务方创建公共接口 编写业务接口逻辑.创建并启动RPCServer 创建并执行RPCClient 集群调用示例 使用CONSUL作为注册中心 Motan-Consul配置 使用ZOOKEEPER作为注册中心 Motan-ZooKeeper配置 前言 好消息,支撑微博千亿调用的轻量级 RPC 框架 Motan 在2016年5月份正式开源了,业界现在除了Dubbo 和 DubboX典型的分布式RPC服务治理型框架外,又多了一个优秀的

  • 公司一般使用的分布式RPC框架及其原理面试

    引言 以前在做一个规模不大的系统的时候,用的是单体架构,一台服务器部署上一个应用和数据库也就够了. 但是现代化互联网公司业务逐渐扩大,服务逐渐细分,很多服务之间需要通过远程分布式接口调用通讯,即不同的服务不是部署在同一个服务器上,比如订单服务在 A 服务上,付款服务在另一个服务上,有同步调用.也有异步调用,这个时候我们就需要远程调用不同的服务,使用的时候调用远程服务就像调用本地服务一样,引入一个 jar 包,就能通过 this.xxx( ) 一样调用远程服务,这背后的机制就是通过 RPC 技术.

  • Java RPC框架过滤器机制原理解析

    过滤器 字面义上理解的过滤器类似下图,从一堆物品中筛选出符合条件的留下,不符合的丢弃. GOF 职责链 GOF中有一种设计模式叫职责链,或者叫责任链,常规的UML图如下: 正统的职责链是将一个请求发给第一个接收者,接收者判断是否属于自己能处理的,如果能处理则执行操作并中止请求下发,流程到此为止.如果不能处理则将请求下发给下一个接收者一直到最后一个接收者. 变体职责链 上面提到正统的职责链有一个特点:当找到符合条件的执行者后流程中止并不会将请求继续下发给后续的执行者.这类场景比较适合比如审核操作,

  • SpringBoot接入轻量级分布式日志框架(GrayLog)的流程分析

    目录 00.为什么需要分布式日志组件? 01.轻量级ELK(Graylog) 02.部署Graylog 03.SpringBoot使用GrayLog 04.懂点GrayLog 05.番外:Swagger 06.总结 我是3y,一年CRUD经验用十年的markdown程序员

  • SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法

    目录 00.为什么需要分布式日志组件? 01.轻量级ELK(Graylog) 02.部署Graylog 03.SpringBoot使用GrayLog 04.懂点GrayLog 05.番外:Swagger 06.总结 我是3y,一年CRUD经验用十年的markdown程序员

  • Python Web框架Flask中使用新浪SAE云存储实例

    对于部署在新浪应用引擎SAE上的项目,使用新浪SAE云存储是不错的存储方案. 新浪SAE云存储仅能在SAE环境中正常使用,对它进行简单封装后,可以直接在Flask中使用,项目代码见GitHub上Flask-SaeStorage. 使用示例代码: 复制代码 代码如下: from flask import Flask from flask_saestorage import SaeStorage   SAE_ACCESS_KEY = 'SAE Access Key' SAE_SECRET_KEY =

  • Android仿QQ、新浪相册的实现

    在移动应用中,很多时候都会用到图片选择.图片裁剪等功能.最近我也在准备一个开源的相册项目,以方便以后开发应用的时候使用,也尽可能的方便需要的人.一个完整的相册,应该包含相册列表.图片列表.图片的单选和多选.图片的裁剪.拍照.多选图片的大图预览等功能.这也是我这个项目将要包含的功能.在本篇博客中,将会讲述下我在这个项目中相册列表和图片列表的大致实现. 实现效果 结合几个常用的APP中的相册效果,当前项目中已经实现了一些基本的功能和UI,在后续完善的过程中还会有所变动.项目在Github上开源,欢迎

  • python使用rpc框架gRPC的方法

    概述 gRPC 是谷歌开源的一个rpc(远程程序调用)框架,可以轻松实现跨语言,跨平台编程,其采用gRPC协议(基于HTTP2). rpc: remote procedure call, 翻译过来就是是远程程序调用.具体来说,就是客户端c1需要调用服务器s1上的某个方法(函数),得到相应的返回值并传递给c1. gRPC协议 要说gRPC协议需要先了解HTTP2, 虽然HTTP1.X 协议至今仍是主流协议,但是随着我们对性能要求越来越高,和web规模的不断扩大,HTTP2就应运而生. 在这里,我们

  • PHP远程调用以及RPC框架

    前言 一个项目,从开始到版本更新,一直到最后的版本维护.功能在不断增多,对应的代码量也在不断增加,也就意味着项目变得更不可维护,这时候,我们需要用拆分的方式将一个项目打散,以便开发团队更好的对项目进行维护. 分模块 这个阶段,一般也是项目的初级阶段,由于人手不够,一个服务端的接口项目只有一个开发进行维护,根据开发的习惯,会把项目分成若干个模块进行开发,在一个项目下进行部署. 这样做的缺点在于项目会随着版本更新而变得不可维护. 分项目 随着每个模块功能的不断完善,代码变得更加臃肿.这时候需要对项目

随机推荐