订阅博客
收藏博客
微博分享
QQ空间分享

天平座,微博轻量级 RPC 结构 Motan,云南旅游攻略

频道:娱乐消息 标签:髂嵴90010兔子 时间:2019年05月04日 浏览:189次 评论:0条

概述

Motan 是一套高性能、易于运用的分布式长途服务调用(RPC)结构。

功用

  • 支撑经过spring装备方法集成,无需额定编写代码即可为服务供给分布式调用才能。
  • 支撑集成consul、zookeeper等装备服务组件,供给集群环境的服务发现及办理才能。
  • 支撑动态自界说负载均衡、跨机房流量调整等高档服务调度才能。
  • 依据高并发、高负载场景进行优化,保证出产环境下RPC服务高可用。

简略调用示例

同步调用

  1. 在pom中增加依靠
 
com.weibo
motan-core
RELEASE


com.weibo
motan-transport-netty
RELEASE




com.weibo
motan-springsupport
RELEASE


org.springframework
spring-context
4.2.4.RELEASE

  1. 为调用方和服务方创立公共接口。
  2. src/main/java/quickstart/FooService.java
package quickstart;
public interface FooService {
public String hello(String name);
}
  1. 编写事务接口逻辑、创立并发动RPC Server。
  2. 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;
}
}
  1. src/main/resources/motan_server.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">





`src/main/java/quickstart/Server.java`
package quickstart;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationCont天平座,微博轻量级 RPC 结构 Motan,云南旅游攻略ext;
public class Server {
public static void main(String[] args) throws InterruptedException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:motan_server.xml"雍正之再生结);
System.out.println("server start...");
}
}
  1. 履行Server类中的main函数将会发动Motan服务,并监听8002端口.
  2. 创立并履行RPC Client。
  3. src/main/resources/motan_client.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">



  1. 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:mota成人快猫n_client.xml");
FooService service = (FooService) ctx.getBean("remoteService");
System.out.println(service.hello("motan"));
}
}
  1. 履行Client类中的main函数将履行一次长途调用,并输出成果。

异步调用

异步调用与同步调用基盖世武尊本装备彻底相同,只需求在接口类中加上@MotanAsync注解,然后client端稍作修正。server端不需求做任何修正。详细过程如下:

  1. 在接口类上加@MotanAsync注解
package quickstart;
@MotanAsync
public interface FooService {
public String hello(String name);
}
  1. 编译时,Motan主动生成异步service类,生成途径为t国漫arget/generated-sources/annotations/,生成的类名为service名加上Async,例如service类名为FooService.java,则主动生成的类名为FooServiceAsync.java。 别的,需求将motan主动出产类文件的途径装备为项目source path,能够运用maven plugin或手动装备。pom.xml装备如下:

org.codehaus.mojo
build-helper-maven-plugin
RELEASE


generate-sources

add-source



${project.build.directory}/generated-sources/annotations





  1. 在client端装备motan_client.xml时,在同步调用装备的根底上,只需求修正referer的interface为Motan主动生成的接口类即可。

  1. 异步运用方法如下:
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApp鳌licationContext(new String[] {"classpath:motan_client.xml"});
FooServiceAsync service = (FooServiceAsync) ctx.getBean("remoteService");
// sync call
System.out.println(service.hello("motan"));
// async call
ResponseFuture future = service.helloAsync("motan async ");
System.out.println(future.getValue());
// multi call
ResponseFuture futur领结婚证需求什么e1 = service.helloAsync("motan async multi-1");
ResponseFuture future2 = service.helloAsync("motan async multi-2");
System.out.println(future1.getValue() + ", " + future2.getValue());
// async with listener
FutureListener listener = new FutureListener() {
@Override
public void operationComplete(Future future) throws Exception {
System.out.println("async call "
+ (future.isSuccess() ? "sucess! value:" + future.getValue() : "fail! exception:"
+ future.天平座,微博轻量级 RPC 结构 Motan,云南旅游攻略getException().getMessage()));
}
};
ResponseFuture future3 = service.helloAsync("motan async multi-1");
ResponseFuture future4 = service.helloAsync("motan async multi-2");
fu无所适从ture3.addListener(listener);
future4.addListener(listener);
}

详细代码能够参阅demo模块

集群调用示例

在集群环境下运用Motan需求依靠外部服务发现组件,现在支撑consul或zookeeper。

运用Consul作为注册中心

Consul装置与发动

装置(官方文档)

# 这儿以linux为例
wget 贫血吃什么好https://rele厦门超雅乳酪ases.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装备

  1. 在server和client中增加motan-registry-consul依靠

com.weibo
motan-registry-consul
RELEASE

  1. 在server和client的装备文件中别离增加consul registry界说。

  1. 在Motan client及server装备改为经过registry服务发现。
  2. client
 
  1. server
 
  1. server程序发动后,需求显式调用心跳开关,注册到consul。
MotanSwitcherUtil.se直播港澳台最新一期tSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true)
  1. 进入ui后台检查服务是否正常供给调用
  2. 发动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装备

  1. 在server和client中增加motan-registry-zookeeper依靠

com.weibo
mo天平座,微博轻量级 RPC 结构 Motan,云南旅游攻略tan-registry-zookeeper
RELEASE

  1. 在server和client的装备文件中别离增加zookeeper registry界说。
  2. zookeeper为单节点

  1. zookeeper多节点熠熠生辉集群

  1. 在Motan client及server装备改为经过registry服务发现。
  2. client

  1. server

  1. server程序发动后,需求显式调用心跳开关,注册到zookeep耶族部落er。
MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true)
  1. 发动client,调用服务

其他调用示例

供给YAR协议服务

YAR协议是php的一个rpc扩展,motan结构能够供给yar协议的RPC服务 1、引进motan-protocol-yar.jar

 
com.weibo
motan-protocol-yar
RELEASE

2、在服务接口类上增加注解@YarConfig,声明服务的uri

 @YarConfig(path = "/openapi/yarserver/test")
public interface YarService {
public String hello(String name);

3、装备protocol的name="yar"

 

4、装备servi天平座,微博轻量级 RPC 结构 Motan,云南旅游攻略ce的export,运用yar协议供给服务

 
export="demoYar:8003" .../>

详细装备见motan-demo模块 YAR协议运用yar-java进行解析,java作为YAR client时能够直接运用

运用注解方法装备motan

server端装备

1、声明Annotation用来指定需求解析的包名

 @Bean
public AnnotationBean motanAnnotationBean() {
AnnotationBean motanAnnotationBean = new AnnotationBean();
motanAnnotationBean.setPackage("com.weibo.motan.demo.server");
return motanAnnotationBean;
}

2、装备ProtocolConfig、RegistryConfig、BasicServiceConfig的bean方针,功用与xml装备中的protocol、registry、basicService标签共同。

 @Bean(name = "demoMotan")
public ProtocolConfigBean protocolConfig1() {
ProtocolConfigBean config = new ProtocolConfigBean();
config.setDefault(true);
config朵拉历险记全集.setName("motan");
config.setMaxContentLength(1048576);
return config;
}
@Bean(name = "registryConfig1")
public RegistryConfigBean registryConfig() {
RegistryConfigBean config = new RegistryConfigBean();
config.setRegProtocol("local");
return config;
}
@Bean
public BasicServiceConfigBean baseServiceConfig() {
BasicServiceConfigBean config = new BasicServiceConfigBean();
config.setExport("demoMotan:8002");
config.setGroup("testgroup");
config.setAccessLog(false);
config.setShareChannel(true);
config.setModule("motan-demo-rpc");
config.setApplication("myMotanDemo");
config.setRegistry("registryConfig1");
return config;莫拉菲
}

3、service的完结类上增加@MotanService注解,注解的装备参数与xml装备方法的service标签共同。

 @MotanService(export = "demoMotan:8002")
public class MotanDemoServiceImpl implements MotanDemoService {
public String hello(String name) {
System.out.println(name);
return "Hello " + name + "!";
}
}

4、运用spring-boot发动服务

 @EnableAutoConfiguration
@SpringBootApplication
public class SpringBootRpcServerDemo {
public static void main(String[] args) {
System.setProperty("server.port", "8081");
ConfigurableApplicationContext context = SpringApplication.run(SpringBootRpcServerDemo.class, args);

MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, true);
System.out.println("server start...");
}
}

server端详细装备请参阅motan-demo模块

client端装备

1、声明Annotation、protocolConfig、RegistryConfig的装备bean。方法与server端装备相似。

2、装备basicRefererConfig bean

 @Bean(name = "motantestClientBasicConfig")
public BasicRefererConfigBean baseRefererConfig() {
BasicRefererConfigBean config = new BasicRefererConfigBean();
config.setProtocol("demoMotan");
config.setGroup("motan-demo-rpc");
config.setModule("motan-demo-rpc");
config.setApplication("myMotanDemo");
config.setRegistry("registry");
config.setCheck(false);
config.setAccessLog(true);
config.setRetries(2);
config.setThrowException(true);
return config;
}

3、在运用motan service 的方针上增加@MotanReferer注解,注册装备与xml方法的referer标签共同

 @RestController
public class HelloController {
@MotanReferer(basicReferer = "motantestClientBasicConfig", group = "testgroup", directUrl = "127.0.0.1:8002")
MotanDemoService service;
@RequestMapping("/")
@ResponseBody
public String home() {
String result = service.hello("test");
return result;
}
}

4、运用spring-boot发动client

 @EnableAutoConfiguration
@SpringBootApplication
public class SpringBootRpcClientDemo {
public static void main(String[] args) {
SpringApplication.run(SpringBootRpcClientDemo.class, args);
}
}

client端详细装备请参阅motan-demo模块

运用restful协议

功用支撑

  1. 支撑rpc独自进程和布置到servlet容器中
  2. 彻底支撑原有服务办理功用
  3. 支撑rpc request/response的attachment机制
  4. 彻底支撑rpc filter机制
  5. rest服务编程彻底依照JAX-RS代码方法编写

前置条件

引进motan-protocol-restful包

 
com.weibo
motan-protocol-restful
RELEASE

接口声明与完结

服务接口

 @Path("/rest")
public interface RestfulService {
@GET
@Produces(MediaType.APPLICATION_JSON)
List getUsers(@QueryParam("uid") int uid);

@GET
@Path("/primitive")
@Produces(MediaType.TEXT_PLAIN)
String testPri欧元对人民币mitiveType();

@P辽宁地图OST
@Consumes(MediaType.APPLICATION_F天平座,微博轻量级 RPC 结构 Motan,云南旅游攻略ORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
Response add(@FormParam("id") int id, @FormParam("name") String name);

@GET
@Path("/exception")
@Produces(MediaType.APPLICATION_JSON)
void testException();
}

服务完结

 public class RestfulServerDemo implements RestfulService {

@Override
public List getUsers(@CookieParam("uid") int uid) {
return Arrays.asList(new User(uid, "name" + uid));
}

@Override
public String testPrimitiveType() {
return "helloworld!";
}

@Override
public Response add(@FormParam("id") int id, @FormParam("name") String name) {
return Response.ok().cookie(neplumw NewCookie("ck", String.valueOf(id))).entity(new User(id, name)).build();
}

@Override
public void testException() {
throw new UnsupportedOperationException("unsupport");
}
}

装备restserver

独立rpc进程方法

server端装备:

 






application="myMotanDemo" registry="reg天平座,微博轻量级 RPC 结构 Motan,云南旅游攻略istry" id="serviceBasicConfig"/>


ref="motanDemoServiceImpl" basicService="serviceBasicConfig"/>

client端装备:

 






application="myMotanDemo" protocol="restfulProtocol" registry="registry"
id="motanTestClientBasicConfig" />



basicReferer="motanTestClientBasicConfig"/>

集成到java应用服务器中(如布置到tomcat中)

此刻需求留意contextpath问题

服务端还需装备web.xml如下:

 

com.weibo.api.motan.protocol.restful.support.servlet.RestfulServletContainerListener


dispatcher
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
1

resteasy.servlet.mapping.prefix
/servlet



dispatcher
/servlet/*

集成到java应用服务器的方法(servlet方法)合适不同言语直接http调用,需求留意url中contextpath的问题。引荐运用rpc进程方法

java作为client端调用时,引荐server端一起导出restful和motan两种协议,java运用motan协议进行调用,其他言语运用规范http协议调用。

详细请参阅motan-demo模块中的RestfulServerDemo、RestfulClient

运用OpenTracing

Motan经过filter的SPI扩展机制支撑OpenTracing,能够支撑任何完结了OpenTracing规范的trace完结。运用OpenTracing需求以下过程。

1、引进filter-opentracing扩展

 
com.weibo
filter-opentracing
RELEASE

2、假如第三方trace东西声明晰io.opentracing.Tracer的SPI扩展,直接引进第三方trace的jar包即可。假如第三方没有声明,则转第三步。

3、自界说一个TracerFactory完结TracerFactory接口,经过getTracer()来获取不同tracer完结。设置OpenTracingContext的tracerFactory为自界说的TracerFactory即可。

可参阅filter-opentracing模块src/test/java/com.weibo.api.motan.filter.opentracing.zipkin.demo包下的server端和client端完结。

高雅的中止服务

Motan支撑在Consul、ZooKeeper集群环境下高雅的封闭节点,当需求封闭或重启节点时,能够先将待上线节点从集群中去除,防止直接封闭影响正常恳求。

待封闭节点需求调用以下代码,主张经过servlet或事务的办理模块进行该调用。

MotanSwitcherUtil.setSwitcherValue(MotanConstants.REGISTRY_HEARTBEAT_SWITCHER, false)

办理后台

办理后台首要包括RPC服务查询、流量切换、Motan指令设置等功用,需运用ZooKeeper作为注册中心

办理后台独立于Motan其他部分,可独自布置

办理后台装置

  1. 装备
  2. 修正装备文件application.properties,装备注册中心类型(zookeeper, consul)及注册中心地址,默许不运用数据库
  3. 默许的登录用户及权限如下:
 办理员:用户名admin 暗码admin
访客:用户名guest 暗码guest
  1. 若需运用前史操作查询功用,则需装备数据库:
  • 数据库表结构坐落motan-manager.sql,可直接导入
  • 数据库装备地址坐落application.properties
  • 修正 MotanManagerApp 注解 @ImportResource(locations = {"classpath:spring-security.xml"})为 +@ImportResource(locations = {"classpath:spring-mybatis.xml", "classpath:spring-security.xml"})
  1. 发动
  2. 在 motan/motan-manager/ 下履行 mv朱门绣卷n package, 然后 java -jar target/motan天平座,微博轻量级 RPC 结构 Motan,云南旅游攻略-manager.jar 。

办理后台运用

RPC服务查询

查询指定group的一切service状况,包括正常供给服务的Server和正在调用的Client

注:Consul注册中心暂不支撑Client查询

过程:

  • 在导航栏挑选RPC服务查询,进入RPC服务查询页面
  • 下拉列表中挑选要查询的服务地点的分组,如motan-demo-rpc,点击查询按钮

流量切换(需求办理员权限)

对指定服务依据分组或ip地址进行动态流量调整

过程:

以下示例演示将来自motan-demo-rpc分组中一切服务的流量切换到motan-demo-rpc2分组中

  • 在导航栏挑选流量切换,进入流量切换页面
  • Step1:
  • 来历流量的RPC分组列表中挑选需求切换流量的Service地点的分组,如motan-demo-rpc
  • 服务列表中*表明一切服务,也可输入服务称号,语法见服务名语法,点击Next


  • Step2:
  • 方针流量的RPC分组列表中挑选方针流量分组,如motan-demo-rpc2,
  • 流量权重分配中依据需求按份额分配(可选规模是[0,100]),这儿输入0和1,表明将来自motan-demo-rpc的流量悉数转入motan-demo-rpc2,点击Next


  • Step3:(可选)若需依据详细IP调整流量,可在此装备
  • RPC Client中输入来历流量的ip,RPC Server中输入方针流量的ip,点击增加后将在路由规矩成果中显现
  • 也可在路由规矩成果中手动输入路由规矩,路由规矩见路由规矩语法,点击Next


  • Step4:指令预览
  • 功用暂未启用,点击Finish完结流量切换操作

服务名语法

  • 类名支撑[a-zA-Z0-9_$.*]
  • 运算符支撑 () 姐姐保卫战! & |,优先级由高到低
  • 杂乱示例如下
(com.weibo.User* & !com.weibo.UserMapping) | com.weibo.Status*
# 匹配com.weibo下以User最初的不包括UserMapping的一切服务,或以Status最初的一切服务

路由规矩语法

  • 有必要包括to关键字,to左右两头别离为rpc client和rpc server的ip表达式,示例如下
* to 10.75.1.*
10.75.2.* to 10.73.1.*
* to !10.75.1.1

指令办理

对注册中心下的一切指令信息进行增修正查操作

过程:

  • 在导航栏挑选指令查询,进入指令查询页面
  • 指令修正和删去操作需求办理员权限


操作记载查询(需求办理员权限)

查询指令增修正查记载

过程:

  • 在导航栏挑选操作记载查询,进入操作记载查询