Skip to content
郑大侠 edited this page Dec 25, 2016 · 4 revisions
  • 用户指南
    • 基本介绍
    • 架构概述
    • 模块概述
    • 配置概述
  • 使用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配置(或者代码构造)

基于注解配置

1.interface api的配置

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; // 客户端超时时间
}

你可以针对不同的业务方法指定不同的序列化方式或者 压缩方式。

2.server端interface impl的配置

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配置

对于客户端,是没有办法控制提供方提供接口层的注解配置,如果客户端想自定义配置,可以选择基于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());
Clone this wiki locally