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服務搭建