前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

1、JSF配置

1.1、<jsf:registry>

配置注册中心用,注册服务和订阅服务,订阅配置。 全局唯一即可。

一级元素,下面可以有parameter节点。对应 com.jd.jsf.gd.config.RegistryConfig

<jsf:registry id="jsfRegistry" index="i.jsf.jd.com"/>
标签 属性 类型 必填 默认值 描述 起始版本
registry id string   SpringBeanId 1.0.0
registry address string   注册中心地址,多个用逗号分隔(addressindex 必须存在一个) 1.0.0
registry index string   注册中心Index服务地址(address和index 必须存在一个。) 1.0.0
registry protocol string jsfRegistry 注册中心协议 1.0.0
registry timeout int 20000(v1.0) 5000 v1.0连接注册中心的超时时间,单位毫秒 v1.2改为调用注册中心超时时间,单位毫秒 1.0.0
registry connectTimeout int 20000 连接注册中心的超时时间,单位毫秒 1.2.0
registry file string ${user.home}/jsf 备份文件保存地址 1.0.0
registry register boolean true 是否注册服务 1.0.0
registry subscribe boolean true 是否订阅服务列表 1.0.0
registry batchCheck int 10 定时批量检查时的条目数 1.2.0

1.2、<jsf:server>

配置服务端用,只在发布服务端时候声明。一个server对应一个端口一个协议。一个server下可以发布多个provider

一级元素,下面可以有parameter节点。对应 com.jd.jsf.gd.config.ServerConfig

<jsf:server threads="400" threadpool="fixed" id="jsfServer" protocol="jsf"/>
标签 属性 类型 必填 默认值 描述 起始版本
server id string   Spring的BeanId 1.0.0
server protocol string   服务端协议。 1.0.0
server host string   服务端绑定地址(windows默认绑到某个ip,linux默认绑到0.0.0.0)。 未指定时,如果配置了注册中心则会连注册中心获取地址,未配注册中心则从网卡里取一个 1.0.0
server port int ` 22000` 服务端绑定端口。 如果已被绑定则自动+1重试,配置为”-1”表示随机端口,不过也是从22000开始随机。 1.0.0
server contextpath string / 发布上下文。用于基于http的协议。 1.0.0
server threads int 200 最大业务线程池大小 1.0.0
server iothreads int 0 IO线程池大小,程序中默认max(8,cpu+1) 1.0.0
server threadpool string cached 业务线程池类型,参见 1.0.0
server telnet boolean true 是否允许telnet 1.0.0
server queues int 0 业务线程池队列大小。0表示无队列,-1表示无限队列,正整数表示有限队列 1.0.0
server accepts int 2147483647 允许的TCP长连接数(包括http) 1.0.0
server payload int 8388608 允许的数据包大小 1.0.0
server buffer int 8192 IO的缓冲区大小  
server dispatcher string message 事件分发类型,目前无其它选项。参考JSF用户手册#事件分发类型 1.0.0
server virtualhost string   虚拟IP地址(注册到注册中心的地址,可以和绑定地址不一样) 多用于虚拟机环境,例如绑定地址为172.17.1.1,告诉注册中心为192.168.1.1 1.0.0
server virtualhostfile string   虚拟IP地址文件,同上,只是从文件中读取。 1.0.0
server onconnect ref   连接事件监听器实例,多个用逗号分隔。List 1.0.0
server debug boolean false 是否打印请求和响应消息体信息 1.0.0
server epoll boolean false Linux下是否启动epoll特性 1.0.0
server queuetype string normal 业务线程池队列类型。普通队列normal、优先级队列priority 1.0.0
server daemon boolean true 默认为守护线程,主线程退出自动退出。配置为false则需要主动退出。 1.0.0
server acceptSerializations string msgpack,hessian,json,protobuf 支持的序列化方式,配置时用英文 “,” 隔开。List1.6.5开始默认不支持java序列化,如有需求需要自行配置例:msgpack,hessian,json,protobuf,java 1.6.5
server highWaterMark int 65536 Netty通信通道高水位值,最大值不能超过Integer.MAX_VALUE 1.6.7
server lowWaterMark int 32768 Netty通信通道低水位值,其值不能超过高水位值,最小值不能低于8192 1.6.7

1.3、<jsf:provider>

发布jsf服务Provider使用。

一级元素,下面可以有method或者 parameter 节点。对应 com.jd.jsf.gd.config.ProviderConfig

<jsf:provider id="policyCenterResourceJsf" register="true"
                  interface="com.jdd.baoxian.core.trade.merchant.export.resource.PolicyCenterResource"
                  alias="${jsf.alias.suffix}" 
              		ref="policyCenterResourceImpl"
                  registry="jsfRegistry" 
               		server="jsfServer"/>


标签 属性 类型 是否必填 默认值 描述 起始版本
provider id string   Spring的BeanId 1.0.0
provider interface string   发布的接口名称 1.0.0
provider alias string   服务别名分组信息 1.0.0
provider ref ref   接口实现类 1.0.0
provider server ref 全部server ⬤ 需要发布服务到的Server,对应上面jsf:server的id,多个用英文逗号隔开。 一个server对应一个端口一个协议,List<ServerConfig>
⬤ 如果未指定 server 属性,则默认发全部服务端。)
1.0.0
provider filter ref   过滤器实现链,多个用英文逗号隔开。 List 1.0.0
provider registry ref 全部registry ⬤ 注册中心引用,多个用英文逗号隔开。List<RegistryConfig>
⬤ 如果未指定,则默认发全部注册中心。(目前不支持,只能使用一个注册中心)
1.0.0
provider register boolean true 是否注册到注册中心 1.0.0
provider subscribe boolean true 是否从注册中心订阅 1.0.0
provider timeout int 5000 服务端调用超时时间,单位毫秒。只是打印警告,不会打断代码执行 1.2.0
provider proxy string javassist 代理类生成方式,支持javassist和jdk 1.0.0
provider mockref ref   v1.0 Mock调用实现,配合mock属性实现开启关闭。mockref是interface的本地实现,用于服务降级v1.2 Mock调用改为在管理端动态配置,使用的时候无需在本地生成实现类 1.0.0
provider cacheref ref   结果缓存实现,配合cache属性实现开启关闭。cacheref实现com.jd.jsf.filter.cache.Cache 1.0.0
provider delay int 0 延迟发布服务时间。 例如:配置0表示加载时即时发布,-1表示spring加载完毕后发布,5000表示延迟5秒后发布 1.0.0
provider weight int 100 服务提供者权重 1.0.0
provider include string * 发布的方法列表,逗号分隔 1.0.0
provider exclude string   不发布的方法列表,逗号分隔 1.0.0
provider dynamic boolean true 是否动态注册Provider,默认为true,配置为false代表不主动发布,需要到管理端进行上线操作 1.0.0
provider priority int 0 接口优先级,越大优先级越高,默认0  
provider concurrents int 200(1.0.x-1.5.x) 0(1.6.0+) 接口下每方法的最大可并行执行请求数,配置-1关闭并发过滤器,等于0表示开启过滤但是不限制 1.0.0
provider validation boolean false 是否校验参数,支持JSR303 JSF用户手册#参数校验 1.0.0
provider compress string ` ` 压缩算法(启动后是否压缩还取决于数据包大小),支持lzma/snappy 1.0.0
provider mock boolean   v1.0 是否启动Mock实现v1.2 Mock调用改为在管理端动态配置 1.0.0
provider cache boolean false 是否开启结果缓存。如果开启需要指定cachekref 1.0.0
provider providerHook string   设置服务端限流回调接口,实现com.jd.jsf.gd.config.ProviderConfig.ProviderHook接口的beanId 1.6.6
provider serialization string msgpack 1.7.2及以上版本的provider若配置了serialization,consumer端重启后会使用此序列化方式访问这个provider如:一个provider配置serialization=”hessian”,consumer重启后会使用hessian方式访问这个provider序列化优先级、注意事项 详见 JSF序列化说明 1.7.2

1.4、<jsf:consumer>

发布jsf服务 Consumer使用。

作为一级元素,下面可以有method或者parameter节点。对应 com.jd.jsf.gd.config.ConsumerConfig

作为二级元素,ConsumerGroup下的元素。

<jsf:consumer id="fxgDataSyncResource"
              interface="com.jd.merchant.base.data.export.resource.fxg.FxgDataSyncResource"
              protocol="jsf" 
              alias="${jsf.alias.merchant_base}" 
              timeout="3000">
</jsf:consumer>

标签 属性 类型 是否必填 默认值 描述 起始版本
consumer id string   Spring的BeanId 1.0.0
consumer interface string   调用的接口名称。 1.0.0
consumer alias string   服务别名分组信息 1.0.0
consumer protocol string jsf 调用的协议 1.0.0
consumer url string   直连地址,配置了此地址就不再从注册中心获取。 1.0.0
consumer filter ref   过滤器实现链,多个用英文逗号隔开。 List<AbstractFilter> 1.0.0
consumer registry ref 是1 全部registry ⬤ 注册中心引用,多个用英文逗号隔开。List<RegistryConfig>
⬤ 如果未指定,则默认全部注册中心。
1.0.0
consumer register boolean true 是否注册到注册中心 1.0.0
consumer subscribe boolean true 是否从注册中心订阅 1.0.0
consumer timeout int 5000 调用端调用超时时间,单位毫秒。超过时间客户端抛超时异常。点击查看:请求级别 timeout 配置 1.0.0
consumer proxy string javassist 代理类生成方式,支持javassist和jdk 1.0.0
consumer mockref ref   ⬤ v1.0 Mock调用实现,配合mock属性实现开启关闭。mockref是interface的本地实现,用于服务降级
⬤ v1.2 Mock调用改为在管理端动态配置,使用的时候无需在本地生成实现类
1.0.0
consumer cacheref ref   结果缓存实现,配合cache属性实现开启关闭。cacheref实现com.jd.jsf.filter.cache.Cache接口 1.0.0
consumer generic boolean false 是否泛化调用(无需服务端接口类) 1.0.0
consumer async boolean false 是否异步调用,参见JSF用户手册#异步调用 1.0.0
consumer connectTimeout int 5000 建立连接超时时间,单位毫秒 1.0.0
consumer disconnectTimeout int 10000 断开连接(等待结果)超时时间,单位毫秒 1.0.0
consumer cluster string failover 集群策略,参见JSF用户手册#集群策略 1.0.0
consumer retries int 0(0表示失败后不重试) 失败后重试次数(需要和cluster=failover结合使用,参见JSF用户手册#集群策略)async异步调用时此设置无效,不重试 1.0.0
consumer loadbalance string random 负载均衡算法,参见JSF用户手册#负载均衡 1.0.0
consumer lazy boolean false 是否延迟建立长连接(第一次调用建立) 1.0.0
consumer sticky boolean false 是否粘滞连接(除非断开连接,只调一个) 1.0.0
consumer injvm boolean true 是否走injvm调用(如果同一jvm内发布了服务,则不走远程调用)。 1.0.0
consumer check boolean false 是否强依赖服务端(无可用服务端启动失败)。 1.0.0
consumer serialization string msgpack 序列化方式。 建议用hessian 1.0.0
consumer onreturn ref   方法的返回事件监听器实例,多个用逗号分隔。需要async为true时使用。List 1.0.0
consumer onconnect ref   连接事件监听器实例,连接或者断开时触发。List 1.2.0
consumer onavailable ref   客户端状态变化监听器实例,状态可用和不可以时触发。List 1.2.0
consumer threadpool string cached 业务线程池类型  
consumer threads int 20 业务线程池大小  
consumer iothreads int 0 IO线程池大小,程序中默认max(6,cpu+1) 1.0.0
consumer heartbeat int 60000(1.0.x) 30000(1.2.0+) 客户端往服务端发心跳包间隔,单位毫秒。配置小于0代表不发送,最低5000ms 1.0.0
consumer reconnect int 5000(1.0.x) 10000(1.2.0+) 客户端重连死亡服务端的间隔,单位毫秒。配置小于0代表不重连,最低2000ms 1.0.0
consumer payload int 8388608 允许数据包大小 1.0.0
consumer epoll boolean false Linux下是否启动epoll 1.0.3删除配置,客户端采用全局配置 1.0.0
consumer router ref   路由规则引用,多个用英文逗号隔开。List,与管理端下发路由配置存在冲突,不建议使用 1.0.0
consumer concurrents int 0 接口下每方法的最大可并行执行请求数,配置-1关闭并发过滤器,等于0表示开启过滤但是不限制 1.0.0
consumer validation boolean false 是否校验参数,支持JSR303,参见JSF用户手册#参数校验 1.0.0
consumer compress string   压缩算法(启动后是否压缩还取决于数据包大小),支持lzma/snappy 1.0.0
consumer mock boolean false v1.0 是否启动Mock实现v1.2 Mock调用改为在管理端动态配置 1.0.0
consumer cache boolean false 是否开启结果缓存。如果开启需要指定cachekref 1.0.0
consumer maxConnectThreads int 10 客户端与所有服务端批量建立连接的最大线程数 1.6.1
consumer connStrategy ref   客户端连接治理策略BeanId,点击查看详细说明 1.6.6-SNAPSHOT
consumer highWaterMark int 65536 Netty通信通道高水位值,最大值不能超过Integer.MAX_VALUE 1.6.7
consumer lowWaterMark int 32768 Netty通信通道低水位值,其值不能超过高水位值,最小值不能低于8192 1.6.7
consumer backupAlias string   跨分组重试别名,多个别名用 ‘,’ 分割 ,先正常访问alias别名,只要别名有一个实例有异常,就会切到backupAlias,请慎重使用此功能(需要和cluster=failover结合使用,参见JSF用户手册#集群策略 1.7.1
consumer backupAliasConnectCount int 10 失败重试分组创建的连接数 1.7.1
consumer warmupWeightStrategy ref   consumer端预热权重策略,点击查看详细说明 1.7.5

1.5、<jsf:method>

用于配置方法级的一些属性,覆盖接口级的属性(未配置方法则取接口级的属性)。

二级元素:可以出现在providerconsumer标签下,下面可以有parameter节点。对应com.jd.jsf.gd.config.MethodConfig

标签 属性 类型 是否必填 默认值 父标签 描述 起始版本
method name string   provider/consumer 方法名称(不支持重载方法) 1.0.0
method timeout string   consumer 方法调用超时时间,单位毫秒 1.0.0
method retries int   consumer 方法重试次数(0表示失败后不重试),async异步调用时此设置无效,不重试 1.0.0
method async string   consumer 是否异步调用 1.0.0
method validation boolean   provider/consumer 是否校验参数,支持JSR303,参见JSF用户手册#参数校验 1.0.0
method onreturn ref   consumer 方法的返回事件监听器实例,多个用逗号分隔。需要async为true时使用。List 1.0.0
method concurrents int   provider/consumer 该方法的最大可并行执行请求数 1.0.0
method mock boolean   provider/consumer v1.0 是否启动Mock实现v1.2 Mock调用改为在管理端动态配置 1.0.0
method cache boolean   provider/consumer 是否开启结果缓存。如果开启需要指定cacheref 1.0.0
method compress string   provider/consumer 压缩算法(启动后是否压缩还取决于数据包大小) 1.0.0
method dstParam int   consumer 目标参数(机房/分组等)索引,从0开始计数 1.6.0

例如:

<jsf:consumer id="helloServiceExport1" server="saf" interface="com.jd.jsf.test.HelloService" alias="ZG1">
  <jsf:method name="echo" retries="2" 
              timeout="2222" onreturn="" 
              actives="" async="" cache="" 
              compress="" dstParam="" />
</jsf:consumer >

1.6、<jsf:parameter>

是一个key-value形式map。

⬤ **作为一级元素:直 接出现在springbeans标签下。 **

作为二级元素:可以出现在registry、server、provider、consumer任一标签下

或者三级元素,还可以出现在 method下

标签 属性 类型 是否必填 默认值 描述 起始版本
parameter key string   参数配置关键字 1.0.0
parameter value string   参数配置值 1.0.0
parameter hide boolean false 是否为隐藏配置。是的话,key自动加上”.”作为前缀,且业务代码不能获取到,只能从filter里取到 1.0.0

1.7、<jsf:annotation>

注解方式配置时使用

一级元素,对应com.jd.jsf.gd.config.annotation.AnnotationBean

标签 属性 类型 是否必填 默认值 描述 起始版本
annotation id string   Spring的BeanId 1.0.0
annotation basepackage string   要扫描注解的包前缀 1.0.0
annotation provider boolean true 是否扫描Provider标签 1.0.0
annotation consumer boolean true 是否扫描Consumer标签 1.0.0

目前支持三种配置方式:

名称 配置 说明
Spring+XML(推荐) 基于spring的schema校验做了扩展。推荐使用这种方式。 只需要在spring的配置文件中加入头,就可以方便的发布和调用服务。 无任何代码入侵,可扩展性强,修改配置只需要修改文件即可。 代码参见: JSF入门指南 JSF入门指南#2.DEMO下载
Spring+annotation(不推荐) 使用注解方式,代码入侵,开发比较方便。 但是上线后修改必须重新打jar包,可扩展非常差。 代码参见: JSF入门指南#2.DEMO下载
API方式 普通的javabean方式,代码入侵。 适用于需要动态发布和调用服务的场景,例如网关程序 代码参见: API方式使用说明 JSF入门指南#2.DEMO下载

1.8、<jsf:filter>

提供一个全局过滤器的入口,只针对spring配置方式(api方式没有此接口)

一级元素,对应 com.jd.jsf.gd.config.annotation.FilterBean

标签 属性 类型 是否必填 默认值 描述 起始版本
filter id string   Spring的BeanId 1.2.0
filter class string   filter类名(继承AbstractFilter),用于newInstance
⬤ ref和class二选一
1.2.0
filter ref bean   指定filter的实现类,优先与class
⬤ ref和class二选一
1.6.1
filter providers string * 值为空,表示无;多个jsf:provider的beanId用英文逗号隔开 1.2.0
filter consumers string * 值为空,表示无;多个jsf:consumer的beanId用英文逗号隔开 1.2.0

2、接口设计

1、目前JSF未支持分布式事务,所以接口的设计一般要保证事务完整性

2、写入的服务最好是幂等服务,如果不幂等要求有排重处理。

3、同一接口同一alias下的全部实例应该是对等的,即随便调到那一台效果是一样的; 如果一个接口要按业务区分的,则要求使用不同服务别名alias或者拆为两个接口。

4.方法名要求含义明确且唯一,不要使用重载方法(即同样方法名不同参数个数)。

5.自定义对象最好实现 java.io.Serializable,对象中不传递的值增加transient关键字。

6.自定义对象数据结构要求尽量简洁,尽量不要多层循环嵌套。增加字段注意保证原有顺序在最后加新的字段

3、FAQ

ContactAuthor