Dubbo是阿里巴巴开源的分布式服务框架,具有高性能、自动发现、动态均衡等特性,是RPC技术方案的上佳选择。Strato框架内置了对dubbo的支持,通过@DubboService和@DubboReference注解来声明和注入dubbo服务。 Strato采用dubbo-2.8.4-release分发包,dubbo因其使用的SPI体系,classloader与OSGi有冲突,故Strato修改了其中的部分ClassLoader机制代码并重新编译。

使用dubbo开发的方法和OSGi十分一致,大概包含几步:

  1. 声明接口
  2. 开发实现类
  3. 添加@DubboService注解
  4. 客户端通过@DubboReference引用

关于dubbo的基本原理和使用方法请移步http://dubbo.io了解。

@DubboService#

@DubboService的注解定义如下:
package com.strato.dubbo.annotation.v1_0_0;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DubboService {

	String AUTO="(AUTO)";
	
	String version() default "0.0.0";
	
	String group() default AUTO;
	
	String path() default AUTO;
	
	int delay() default 0;
	
	int timeout() default 1000;
	
	int retries() default 2;
	
	int connections() default 100;
	
	String loadbalance() default "random";
	
	boolean async() default false;
	
	String stub() default "false";
	
	String mock() default "false";
	
	String token() default "false";
	
	String registry() default AUTO;
	
	String provider() default AUTO;
	
	boolean deprecated() default false;
	
	boolean dynamic() default true;
	
	String accesslog() default "false";
	
	String owner() default AUTO;
	
	String document() default AUTO;
	
	int weight() default 1;
	
	int executes() default 0;
	
	int actives() default 0;
	
	String proxy() default "javassist";
	
	String cluster() default "failover";
	
	String filter() default "default";
	
	String listener() default "default";
	
	String protocol() default AUTO;
	
	String layer() default AUTO;
	
	boolean register() default true;
}

熟悉dubbo的人可以发现,@DubboService的属性就是com.alibaba.dubbo.config.ProviderConfig的复制。因此,对于各属性的含义,可以参考dubbo的官方配置参考手册

@DubboReference#

@DubboReference的注解定义如下:
package com.strato.dubbo.annotation.v1_0_0;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DubboReference {

	String AUTO="(AUTO)";
	
	String id();
	
	String version() default AUTO;
	
	String group() default AUTO;
	
	long timeout() default 30000;
	
	int retries() default 0;
	
	int connections() default 100;
	
	String loadbalance() default "random";
	
	boolean async() default false;
	
	boolean generic() default false;
	
	boolean check() default false;
	
	String url() default AUTO;
	
	String stub() default "false";
	
	String mock() default "false";
	
	String cache() default "false";
	
	boolean validation() default false;
	
	String proxy() default "javassist";
	
	String client() default AUTO;
	
	String registry() default AUTO;
	
	String owner() default AUTO;
	
	int actives() default 0;
	
	String cluster() default "failover";
	
	String filter() default "default";
	
	String layer() default AUTO;
	
	boolean init() default false;
	
	String protocol() default AUTO;
	
}

相应的,@DubboReference就是com.alibaba.dubbo.config.ConsumerConfig的属性复制。 下面通过一个简单例子来说明dubbo在Strato中的用法。

例子#

下面的例子介绍了一个Hello world的应用,提供一个页面,通过传入"who"参数来生成欢迎信息,欢迎信息文本由dubbo服务提供。
  • 服务接口定义
public interface HelloService {

	String helloMessage(String who);
}
  • 服务实现
@DubboService //<--声明为服务提供者
public class HelloServiceImpl implements HelloService {

	@Override
	public String helloMessage(String who) {
		return "Hello "+who;
	}

}
  • 客户端Controller
@Controller
public class HelloController {

	@DubboReference(id="helloService")
	private HelloService helloService;
	
	@RequestMapping("/hello")
	public void hello(HttpServletRequest request,HttpServletResponse response) throws IOException{
		String who=request.getParameter("who");
		if(who==null) {
			who="Guest";
		}
		String message=helloService.helloMessage(who);
		response.getWriter().write(message);
		response.flushBuffer();
	}
}

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-1) was last changed on 02-Jul-2017 17:37 by Jarez