• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

forest: 基于netty和zookeeper实现的分布式RPC框架

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

forest

开源软件地址:

https://gitee.com/dempe/forest

开源软件介绍:

Forest

LicenseBuild Status

Overview

基于netty轻量的高性能分布式RPC服务框架。简单,易用,高效。

Features

  • 服务端支持多种序列化方式:fastjson,hession,kryo
  • 服务端支持多种压缩方式:gzip,snappy
  • 服务端支持同时基于jersey暴露restful服务
  • 支持注解配置,也支持spring xml配置
  • 支持服务发现服务注册
  • client端支持多种负载均衡策略和容灾策略
  • client内置连接池
  • client支持熔断,一个时间段错误次数达到一定阈值,自动熔断
  • 基于netty 4.x版本实现,高性能(win 8cpu单机8w+)

Protocol

Alt text

Quick Start

Add dependencies to pom.

<dependency>    <groupId>com.zhizus</groupId>    <artifactId>forest-rpc</artifactId>    <version>0.0.2</version></dependency><dependency>    <groupId>com.zhizus</groupId>    <artifactId>forest-common</artifactId>    <version>0.0.2</version></dependency>

1.定义接口

通过注解@ServiceProvider暴露服务,通过@MethodProvider暴露方法默认配置,如:压缩方式,序列化方式,客户端超时时间

@ServiceProvider(serviceName = "sampleService", haStrategyType = HaStrategyType.FAIL_FAST,        loadBalanceType = LoadBalanceType.RANDOM, connectionTimeout = Constants.CONNECTION_TIMEOUT)public interface SampleService {    @MethodProvider(methodName = "say")    String say(String str);    @MethodProvider(methodName = "echo", serializeType = SerializeType.Hession2, compressType = CompressType.None)    String echo(String msg);}

2.实现接口

基于注解@ServiceExport发布服务,基于注解 @MethodExport发布方法,

@Path("/sample")@ServiceExportpublic class SampleServiceImpl implements SampleService {    /**     * 支持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;    }    @Interceptor("metricInterceptor")    @MethodExport    @Override    public String echo(String msg) {        return "echo>>> " + msg;    }}

3.服务端开发

spring context 配置:

application.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xmlns="http://www.springframework.org/schema/beans" xmlns:forest="http://api.zhizus.com/schema/forest"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd        http://api.zhizus.com/schema/forest http://api.zhizus.com/schema/forest.xsd">    <context:component-scan base-package="com.zhizus.forest.demo"/>    <context:property-placeholder location="classpath:/*.properties"/>    <forest:registry id="registry" regProtocol="local"  name="registry" address="127.0.0.1:2181"/>    <!--<forest:registry id="registry" regProtocol="zookeeper" name="registry" address="127.0.0.1:2181"/>-->    <forest:server id="forestServer" registry="registry" startHttpServer="true"/>    <forest:interceptors>        <forest:interceptor id="metricInterceptor" class="com.zhizus.forest.support.MetricInterceptor" auto-match="public *(*)"/>    </forest:interceptors></beans>

Server开发

public class SampleServer {    public static void main(String[] args) throws Exception {	new ClassPathXmlApplicationContext(new String[]{"application.xml"});    }}

4.客户端开发

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xmlns="http://www.springframework.org/schema/beans"       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:forest="http://api.zhizus.com/schema/forest"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://api.zhizus.com/schema/forest http://api.zhizus.com/schema/forest.xsd">    <context:component-scan base-package="com.zhizus.forest.demo.client"/>    <forest:registry id="registry" regProtocol="local" name="registry" address="127.0.0.1:9999"/>    <forest:referer id="sampleService" interface="com.zhizus.forest.demo.api.SampleService" registry="registry">        <forest:method name="echo" timeout="5000" serializeType="Fastjson"/>        <forest:method name="say" timeout="5000" serializeType="Fastjson" compressType="GZIP"/>    </forest:referer></beans>
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"application-client.xml"});     SampleService bean = (SampleService) context.getBean("sampleService");     String test = bean.say("hello");

Console输出

23:10:10.295 [pool-1-thread-1] INFO MetricInterceptor 34 - methodName:/sampleService/say, current tps:83342, avgTime:0, maxTime:63, minTime:023:10:11.298 [pool-1-thread-1] INFO MetricInterceptor 34 - methodName:/sampleService/say, current tps:86271, avgTime:0, maxTime:63, minTime:023:10:12.295 [pool-1-thread-1] INFO MetricInterceptor 34 - methodName:/sampleService/say, current tps:86063, avgTime:0, maxTime:63, minTime:023:10:13.295 [pool-1-thread-1] INFO MetricInterceptor 34 - methodName:/sampleService/say, current tps:84305, avgTime:0, maxTime:63, minTime:0

更多示例

Documents

TODO

  • 跨语言协议支持
  • 服务治理管理后台

License

Forest is released under the Apache License 2.0.


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap