dubbo版本与分组
Dubbo服务中,接口并不能唯一确定一个服务,只有 接口+分组+版本号 的三元组才能唯一确定一个服务。
- 当同一个接口针对不同的业务场景、不同的使用需求或者不同的功能模块等场景,可使用服务分组来区分不同的实现方式。同时,这些不同实现所提供的服务是可并存的,也支持互相调用。
- 当接口实现需要升级又要保留原有实现的情况下,即出现不兼容升级时,我们可以使用不同版本号进行区分。
接口
public interface DevelopService {
String invoke(String param);
}
服务提供者
import com.doudou.dubbo.api.DevelopService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService(group = "group1", version = "1.0")
public class DevelopProviderServiceV11 implements DevelopService {
@Override
public String invoke(String param) {
StringBuilder s = new StringBuilder();
s.append("ServiceV1 param:").append(param);
return s.toString();
}
}
import com.doudou.dubbo.api.DevelopService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService(group = "group1", version = "2.0")
public class DevelopProviderServiceV12 implements DevelopService {
@Override
public String invoke(String param) {
StringBuilder s = new StringBuilder();
s.append("ServiceV1 param:").append(param);
return s.toString();
}
}
import com.doudou.dubbo.api.DevelopService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService(group = "group2", version = "1.0")
public class DevelopProviderServiceV21 implements DevelopService {
@Override
public String invoke(String param) {
StringBuilder s = new StringBuilder();
s.append("ServiceV2 param:").append(param);
return s.toString();
}
}
import com.doudou.dubbo.api.DevelopService;
import org.apache.dubbo.config.annotation.DubboService;
@DubboService(group = "group2", version = "2.0")
public class DevelopProviderServiceV22 implements DevelopService {
@Override
public String invoke(String param) {
StringBuilder s = new StringBuilder();
s.append("ServiceV2 param:").append(param);
return s.toString();
}
}
服务消费者
import com.doudou.dubbo.api.DevelopService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class VersionAndGroupingConsumer implements CommandLineRunner {
@DubboReference(group = "group1", version = "1.0")
private DevelopService developServiceV11;
@DubboReference(group = "group1", version = "2.0")
private DevelopService developServiceV12;
@DubboReference(group = "group2", version = "1.0")
private DevelopService developServiceV21;
@DubboReference(group = "group2", version = "2.0")
private DevelopService developServiceV22;
@Override
public void run(String... args) throws Exception {
//调用DevelopService的group1分组实现
System.out.println("Dubbo Remote Return v11 ======> " + developServiceV11.invoke("11"));
System.out.println("Dubbo Remote Return v11 ======> " + developServiceV12.invoke("12"));
//调用DevelopService的另一个实现
System.out.println("Dubbo Remote Return v22 ======> " + developServiceV21.invoke("21"));
System.out.println("Dubbo Remote Return v22 ======> " + developServiceV22.invoke("22"));
}
}
跨版本升级
按照以下的步骤进行版本迁移
- 在低压力时间段,先升级一半提供者为新版本
- 再将所有消费者升级为新版本
- 然后将剩下的一半提供者升级为新版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
服务搭建可参考dubbo服务搭建