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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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;@Overridepublic 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服务搭建