-
Notifications
You must be signed in to change notification settings - Fork 192
zh_userguide
- 用户指南
- 基本介绍
- 架构概述
- 模块概述
- 配置概述
- 使用Forest
- 工程依赖
- 处理调用异常
- 配置说明
- 协议与连接
- 注册中心与服务发现
- 服务提供方
- 服务调用方
- 配置清单
- 常用功能介绍
- 管理后台
- 日志说明
- 性能测试
Forest是一套基于java开发的RPC框架,除了常规的点对点调用外,Motan还提供服务治理功能,包括服务节点的自动发现、摘除、高可用和负载均衡等。
架构概述
Forest中分为服务提供方(RPC Server),服务调用方(RPC Client)和服务注册中心(Registry)三个角色。
Server提供服务,向Registry注册自身服务,并向注册中心定期发送心跳汇报状态; Client使用服务,需要向注册中心订阅RPC服务,Client根据Registry返回的服务列表,与具体的Sever建立连接,并进行RPC调用。 当Server发生变更时,Registry会同步变更,Client感知后会对本地的服务列表作相应调整。 三者的交互关系如下图:
Forest体功能了灵活的功能,可以基于注解来配置,也可以通过spring xml来覆盖这些配置,当然你可以可以代码里面自己构造。
配置优先级如下:注解默认配置<spring xml配置(或者代码构造)
a. inteface api
类上可以通过@ServiceProvider
注解来提供服务,@ServiceProvider
用于接口类上,可以配置参数如下:
public @interface ServiceProvider {
String serviceName() default "";//服务名称,隔离级别是以一个服务为粒度
HaStrategyType haStrategyType() default HaStrategyType.FAIL_FAST;
LoadBalanceType loadBalanceType() default LoadBalanceType.RANDOM;
String hashKey() default "";// 仅当使用hash策略时候使用
int connectionTimeout() default Constants.CONNECTION_TIMEOUT;
}
接口层提供给调用方,调用方的client可以继承interface上的@ServiceProvider
配置作为默认配置。
b. interface method可以通过@MethodProvider注解来提供具体的业务服务,参数配置如下:
public @interface MethodProvider {
String methodName() default "";
SerializeType serializeType() default SerializeType.Kyro;
CompressType compressType() default CompressType.None;
int timeout() default Constants.DEFAULT_TIMEOUT; // 客户端超时时间
}
你可以针对不同的业务方法指定不同的序列化方式或者 压缩方式。
a. servcieImpl可以通过@ServiceExport
注解来发布服务,interface impl只有加上了@ServiceExport
才会发布服务。
如果不指定port,则使用默认的port,如需和其他业务隔离,建议使用不同的port来发布。
public @interface ServiceExport {
int port() default Constants.DEF_PORT;
}
当然你也可以加上
@Path
来暴露restful的path,Forest支持基于jersey的restful服务。
b. servcieImpl可以通过@MethodExport
注解来发布方法
serviceImpl的方法上面同时可以支持其他的注解,类似如下:
/**
* 支持jersey,可以通过配置打开,同时启动http服务
*
* @param str
* @return
*/
@Path("/hello/{str}")
@GET
@Produces("text/plain")
@MethodExport
@Rate(2)
@Override
public String say(@PathParam("str") String str) {
return "say " + str;
}
对于客户端,是没有办法控制提供方提供接口层的注解配置,如果客户端想自定义配置,可以选择基于spring xml的配置来覆盖服务提供方推荐的默认配置。
示例如下:
<bean id="methodConfig" class="com.zhizus.forest.common.config.MethodConfig">
<property name="compressType">
<util:constant static-field="com.zhizus.forest.common.CompressType.None"/>
</property>
<property name="serializeType">
<util:constant static-field="com.zhizus.forest.common.SerializeType.Fastjson"/>
</property>
<property name="timeout" value="5000"/>
</bean>
<bean id="sampleServiceProxy" class="com.zhizus.forest.support.spring.ForestProxyFactoryBean">
<property name="serviceInterface" value="com.zhizus.forest.demo.api.SampleService"/>
<!--methodConfMap如果不配置,则使用接口方法注解上面的配置-->
<property name="methodConfigMap">
<map>
<entry key="echo" value-ref="methodConfig"/>
<entry key="say" value-ref="methodConfig"/>
</map>
</property>
</bean>
有的时候觉得xml配置很麻烦,但是又不想使用服务提供方注解上面的默认配置,那么我们可以可以使用代码自己实例化, 示例如下:
SampleService sampleService = Forest.from(SampleService.class, ServiceProviderConfig.Builder.newBuilder()
.withMethodConfig("say", MethodConfig.Builder.newBuilder()
.withCompressType(CompressType.None)
.withSerializeType(SerializeType.Fastjson)
.build())
.withMethodConfig("echo", MethodConfig.Builder.newBuilder()
.withCompressType(CompressType.None)
.withSerializeType(SerializeType.Hession2)
.build())
.build());