从0到1搞一波dubbo
1、為什么需要dubbo?(為了解決什么問題?)
| ? ? ? 架構(gòu)演變 | 1 單一應(yīng)用架構(gòu) 2 應(yīng)用和數(shù)據(jù)庫單獨部署 3 應(yīng)用和數(shù)據(jù)庫集群部署 4 數(shù)據(jù)庫壓力變大,讀寫分離 5 使用緩存技術(shù)加快速度 6 數(shù)據(jù)庫分庫分表 7 應(yīng)用分為不同的類型拆分 |
應(yīng)用之間的關(guān)系已經(jīng)十分復(fù)雜,產(chǎn)生了以下問題:
- 當(dāng)服務(wù)越來越多,服務(wù) URL 配置管理變得非常困難,F5硬件負載均衡器的單點壓力也越來越大。
- 服務(wù)間依賴關(guān)系復(fù)雜,應(yīng)用的啟動順序復(fù)雜、應(yīng)用的架構(gòu)關(guān)系復(fù)雜
- 服務(wù)的調(diào)用量越來越大,服務(wù)的容量問題就暴露出來,這個服務(wù)需要多少機器支撐?什么時候該加機器?
?
2、Dubbo是什么?(dubbo技術(shù)架構(gòu))
?
節(jié)點角色:
| 節(jié)點 | 角色說明 |
| Provider | 暴露服務(wù)的服務(wù)提供方 |
| Consumer | 調(diào)用遠程服務(wù)的服務(wù)消費方 |
| Registry | 服務(wù)注冊與發(fā)現(xiàn)的注冊中心 |
| Monitor | 統(tǒng)計服務(wù)的調(diào)用次數(shù)和調(diào)用時間的監(jiān)控中心 |
| Container | 服務(wù)運行容器 |
Dubbo架構(gòu)簡單來說其實是生產(chǎn)者-消費者模型。進一步在這種模型上,加上了注冊中心和監(jiān)控中心,用于管理提供方提供的url,以及管理整個過程。
發(fā)布訂閱過程:
- 啟動容器,加載,運行服務(wù)提供者。
- 服務(wù)提供者在啟動時,在注冊中心發(fā)布注冊自己提供的服務(wù)。
- 服務(wù)消費者在啟動時,在注冊中心訂閱自己所需的服務(wù)。
如果考慮失敗或變更的情況,就需要考慮下面的過程。
- 注冊中心返回服務(wù)提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。
- 服務(wù)消費者,從提供者地址列表中,基于軟負載均衡算法,選一臺提供者進行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。
- 服務(wù)消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。
3、Dubbo如何使用?
3.1 定義服務(wù)提供者
新建provider提供者模塊,定義如下接口:
| /** ?* xml方式服務(wù)提供者接口 ?*/ public interface ProviderService { ? ??? String SayHello(String word); } |
實現(xiàn)類
| /** ?* xml方式服務(wù)提供者實現(xiàn)類 ?*/ public class ProviderServiceImpl implements ProviderService{ ? ??? public String SayHello(String word) { ??????? return word; ??? } } |
3.2 服務(wù)暴露
導(dǎo)入maven依賴
| <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" ???????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ???????? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ??? <modelVersion>4.0.0</modelVersion> ? ??? <groupId>com.test</groupId> ??? <artifactId>dubbo-provider</artifactId> ??? <version>1.0-SNAPSHOT</version> ? ??? <dependencies> ??????? <dependency> ??????????? <groupId>junit</groupId> ??????????? <artifactId>junit</artifactId> ??????????? <version>3.8.1</version> ??????????? <scope>test</scope> ??????? </dependency> ??????? <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --> ????? ??<dependency> ??????????? <groupId>com.alibaba</groupId> ??????????? <artifactId>dubbo</artifactId> ??????????? <version>2.6.6</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>org.apache.zookeeper</groupId> ??????????? <artifactId>zookeeper</artifactId> ??????????? <version>3.4.10</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>com.101tec</groupId> ??????????? <artifactId>zkclient</artifactId> ??????????? <version>0.5</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>io.netty</groupId> ??????????? <artifactId>netty-all</artifactId> ??????????? <version>4.1.32.Final</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>org.apache.curator</groupId> ??????????? <artifactId>curator-framework</artifactId> ??????????? <version>2.8.0</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>org.apache.curator</groupId> ??????????? <artifactId>curator-recipes</artifactId> ??????????? <version>2.8.0</version> ??????? </dependency> ? ??? </dependencies> </project> |
進行服務(wù)暴露:暴露接口(xml 配置方法)
首先,在項目 resource 目錄下創(chuàng)建 META-INF.spring 包,然后再創(chuàng)建 provider.xml 文件,
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?????? xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans??????? http://www.springframework.org/schema/beans/spring-beans.xsd??????? http://code.alibabatech.com/schema/dubbo??????? http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> ? ??? <!--當(dāng)前項目在整個分布式架構(gòu)里面的唯一名稱,計算依賴關(guān)系的標(biāo)簽--> ??? <dubbo:application name="provider" owner="cp"> ??????? <dubbo:parameter key="qos.enable" value="true"/> ??????? <dubbo:parameter key="qos.accept.foreign.ip" value="false"/> ??????? <dubbo:parameter key="qos.port" value="55555"/> ??? </dubbo:application> ? ??? <dubbo:monitor protocol="registry"/> ? ??? <!--dubbo這個服務(wù)所要暴露的服務(wù)地址所對應(yīng)的注冊中心--> ??? <!--<dubbo:registry address="N/A"/>--> ??? <dubbo:registry address="N/A" /> ? ??? <!--當(dāng)前服務(wù)發(fā)布所依賴的協(xié)議;webserovice、Thrift、Hessain、http--> ??? <dubbo:protocol name="dubbo" port="20880"/> ? ??? <!--服務(wù)發(fā)布的配置,需要暴露的服務(wù)接口--> ?? ?<dubbo:service ??????????? interface="com.dubbo.provider.service.ProviderService" ??????????? ref="providerService"/> ? ??? <!--Bean bean定義--> ??? <bean id="providerService" class="com.dubbo.provider.service.ProviderServiceImpl"/> </beans> |
發(fā)布接口:通過 ClassPathXmlApplicationContext 拿到我們剛剛配置好的 xml ,然后調(diào)用 context.start() 方法啟動
?
| package com.dubbo.provider; ? import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ProtocolConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.ServiceConfig; import com.alibaba.dubbo.container.Main; import com.dubbo.provider.service.ProviderService; import com.dubbo.provider.service.ProviderServiceImpl; import org.springframework.context.support.ClassPathXmlApplicationContext; ? import java.io.IOException; ? /** ?* xml方式啟動 ?* ?*/ public class App { ??? public static void main( String[] args ) throws IOException { ??????? //加載xml配置文件啟動 ??????? ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/provider.xml"); ??????? context.start(); ??????? System.in.read(); // 按任意鍵退出 ??? } } |
3.2 定義消費消費者
新建消費者consumer模塊,先通過點對點方式:
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?????? xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans??????? http://www.springframework.org/schema/beans/spring-beans.xsd??????? http://code.alibabatech.com/schema/dubbo??????? http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> ? ??? <!--當(dāng)前項目在整個分布式架構(gòu)里面的唯一名稱,計算依賴關(guān)系的標(biāo)簽--> ??? <dubbo:application name="consumer" owner="cp"/> ? ??? <!--dubbo這個服務(wù)所要暴露的服務(wù)地址所對應(yīng)的注冊中心--> ??? <!--點對點的方式--> ??? <dubbo:registry address="N/A" /> ??? <!--<dubbo:registry address="zookeeper://localhost:2181" check="false"/>--> ? ??? <!--生成一個遠程服務(wù)的調(diào)用代理--> ??? <!--點對點方式--> ?? ?<dubbo:reference id="providerService" ????????? ???????????interface="com.dubbo.provider.service.ProviderService" ???????????????????? url="dubbo://localhost:20880/com.dubbo.provider.service.ProviderService"/> ? ??? <!--<dubbo:reference id="providerService" ????????? ???????????interface="com.dubbo.provider.service.ProviderService"/>--> ? </beans> |
導(dǎo)入maven依賴(同服務(wù)端類似)
| <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" ???????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ???????? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ??? <modelVersion>4.0.0</modelVersion> ? ??? <groupId>com.test</groupId> ??? <artifactId>dubbo-consumer</artifactId> ??? <version>1.0-SNAPSHOT</version> ? ??? <dependencies> ??????? <dependency> ??????????? <groupId>com.test</groupId> ??????????? <artifactId>dubbo-provider</artifactId> ??????????? <version>1.0-SNAPSHOT</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>junit</groupId> ??????????? <artifactId>junit</artifactId> ??????????? <version>3.8.1</version> ??????????? <scope>test</scope> ??????? </dependency> ??????? <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo --> ??????? <dependency> ??????????? <groupId>com.alibaba</groupId> ??????????? <artifactId>dubbo</artifactId> ??????????? <version>2.6.6</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>org.apache.zookeeper</groupId> ??????????? <artifactId>zookeeper</artifactId> ??????????? <version>3.4.10</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>com.101tec</groupId> ??????????? <artifactId>zkclient</artifactId> ??????????? <version>0.5</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>io.netty</groupId> ??????????? <artifactId>netty-all</artifactId> ??????????? <version>4.1.32.Final</version> ??????? </dependency> ??????? <dependency> ??????????? <groupId>org.apache.curator</groupId> ??????????? <artifactId>curator-framework</artifactId> ??????????? <version>2.8.0</version> ??????? </dependency> ???? ???<dependency> ??????????? <groupId>org.apache.curator</groupId> ??????????? <artifactId>curator-recipes</artifactId> ??????????? <version>2.8.0</version> ??????? </dependency> ??? </dependencies> </project> |
調(diào)用服務(wù)
| package com.dubbo.consumer; ? import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ReferenceConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.dubbo.provider.service.ProviderService; import org.springframework.context.support.ClassPathXmlApplicationContext; ? import java.io.IOException; ? /** ?* xml的方式調(diào)用 ?* ?*/ public class App { ??? public static void main( String[] args ) throws IOException { ? ??????? ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("consumer.xml"); ??????? context.start(); ??????? ProviderService providerService = (ProviderService) context.getBean("providerService"); ??????? String str = providerService.SayHello("hello"); ??????? System.out.println(str); ??????? System.in.read(); ? ??? } } |
3.4 加入zookeeper作為注冊中心
在前面的操作中沒有使用任何注冊中心,用一種直連的方式進行。實際都是使用 dubbo + zookeeper 的方式,使用 zookeeper 作為注冊中心,這里介紹 zookeeper 作為注冊中心的使用方法。對前面的案例進行改造:
3.4.1 服務(wù)提供者修改
修改provider.xml文件
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?????? xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans??????? http://www.springframework.org/schema/beans/spring-beans.xsd??????? http://code.alibabatech.com/schema/dubbo??????? http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> ? ??? <!--當(dāng)前項目在整個分布式架構(gòu)里面的唯一名稱,計算依賴關(guān)系的標(biāo)簽--> ??? <dubbo:application name="provider" owner="cp"> ??????? <dubbo:parameter key="qos.enable" value="true"/> ??????? <dubbo:parameter key="qos.accept.foreign.ip" value="false"/> ??????? <dubbo:parameter key="qos.port" value="55555"/> ??? </dubbo:application> ? ??? <dubbo:monitor protocol="registry"/> ? ??? <!--dubbo這個服務(wù)所要暴露的服務(wù)地址所對應(yīng)的注冊中心--> ??? <!--<dubbo:registry address="N/A"/>--> ?? ?<dubbo:registry address="zookeeper://localhost:2181" check="false"/> ? ??? <!--當(dāng)前服務(wù)發(fā)布所依賴的協(xié)議;webserovice、Thrift、Hessain、http--> ??? <dubbo:protocol name="dubbo" port="20880"/> ? ??? <!--服務(wù)發(fā)布的配置,需要暴露的服務(wù)接口--> ??? <dubbo:service ??????????? interface="com.dubbo.provider.service.ProviderService" ?????? ?????ref="providerService"/> ? ??? <!--Bean bean定義--> ??? <bean id="providerService" class="com.dubbo.provider.service.ProviderServiceImpl"/> ? </beans> |
3.4.2 服務(wù)消費者修改
修改 consumer.xml
| <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" ?????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?????? xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" ?????? xsi:schemaLocation="http://www.springframework.org/schema/beans??????? http://www.springframework.org/schema/beans/spring-beans.xsd??????? http://code.alibabatech.com/schema/dubbo??????? http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> ? ??? <!--當(dāng)前項目在整個分布式架構(gòu)里面的唯一名稱,計算依賴關(guān)系的標(biāo)簽--> ??? <dubbo:application name="consumer" owner="cp"/> ? ??? <!--dubbo這個服務(wù)所要暴露的服務(wù)地址所對應(yīng)的注冊中心--> ??? <!--點對點的方式--> ??? <!--<dubbo:registry address="N/A" />--> ? ??<dubbo:registry address="zookeeper://localhost:2181" check="false"/> ? ??? <!--生成一個遠程服務(wù)的調(diào)用代理--> ??? <!--點對點方式--> ??? <!--<dubbo:reference id="providerService" ???????????????????? interface="com.dubbo.provider.service.ProviderService" ???????????????????? url="dubbo://192.168.234.1:20880/com.dubbo.provider.service.ProviderService"/>--> ? ??? <dubbo:reference id="providerService" ??? ?????????????????interface="com.dubbo.provider.service.ProviderService"/> ? </beans> |
總結(jié):加入zookeeper和直接點對點方式的區(qū)別就是:將 dubbo 發(fā)布的 url 注冊到了 zookeeper,消費端從 zookeeper 消費,zookeeper 相當(dāng)于一個中介,給消費者提供服務(wù)。
3.5注解配置方式
前面使用xml文件配置方式,這里使用注解配置方式,現(xiàn)在微服務(wù)都傾向于這種方式,這也是以后發(fā)展的趨勢, 0配置是以后的趨勢。那么如何對 dubbo 使用注解的方式呢?
3.5.1 服務(wù)提供者注解配置
接口:
| package com.dubbo.provider.service.annotation; ? /** ?* 注解方式接口 ?*/ public interface ProviderServiceAnnotation { ??? String SayHelloAnnotation(String word); } |
實現(xiàn)類
| package com.dubbo.provider.service.annotation; ? import com.alibaba.dubbo.config.annotation.Service; ? /** ?* 注解方式實現(xiàn)類 ?*/ @Service(timeout = 5000) public class ProviderServiceImplAnnotation implements ProviderServiceAnnotation{ ? ??? public String SayHelloAnnotation(String word) { ??????? return word; ??? } } |
1、@Service?用來配置 Dubbo 的服務(wù)提供方。
2、通過 Spring 中?Java Config?的技術(shù)(@Configuration)和 annotation 掃描(@EnableDubbo)來發(fā)現(xiàn)、組裝、并向外提供 Dubbo 的服務(wù)。
| package com.dubbo.provider.configuration; ? import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ProtocolConfig; import com.alibaba.dubbo.config.ProviderConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; ? /** ?* 注解方式配置 ?*/ @Configuration @EnableDubbo(scanBasePackages = "com.dubbo.provider.service.annotation") public class DubboConfiguration { ? ??? @Bean // #1 服務(wù)提供者信息配置 ??? public ProviderConfig providerConfig() { ??????? ProviderConfig providerConfig = new ProviderConfig(); ??????? providerConfig.setTimeout(1000); ??????? return providerConfig; ??? } ? ?? ?@Bean // #2 分布式應(yīng)用信息配置 ?? ?public ApplicationConfig applicationConfig() { ??????? ApplicationConfig applicationConfig = new ApplicationConfig(); ??????? applicationConfig.setName("dubbo-annotation-provider"); ??????? return applicationConfig; ??? } ? ?? ?@Bean // #3 注冊中心信息配置 ??? public RegistryConfig registryConfig() { ??????? RegistryConfig registryConfig = new RegistryConfig(); ??????? registryConfig.setProtocol("zookeeper"); ??????? registryConfig.setAddress("localhost"); ??????? registryConfig.setPort(2181); ??????? return registryConfig; ??? } ? ??? @Bean // #4 使用協(xié)議配置,這里使用 dubbo ??? public ProtocolConfig protocolConfig() { ??????? ProtocolConfig protocolConfig = new ProtocolConfig(); ??????? protocolConfig.setName("dubbo"); ??????? protocolConfig.setPort(20880); ??????? return protocolConfig; ??? } } |
?
分析:通過 @EnableDubbo 指定在com.dubbo.provider.service.annotation 下掃描所有標(biāo)注有 @Service 的類。
通過 @Configuration 將 DubboConfiguration 中所有的 @Bean 通過 Java Config 的方式組裝出來并注入給 Dubbo 服務(wù),也就是標(biāo)注有 @Service 的類。這其中就包括了:
ProviderConfig:服務(wù)提供方配置
ApplicationConfig:應(yīng)用配置
RegistryConfig:注冊中心配置
ProtocolConfig:協(xié)議配置
啟動服務(wù):
| package com.dubbo.provider; ? import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan; import com.dubbo.provider.configuration.DubboConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import sun.applet.Main; ? import java.io.IOException; ? /** ?* 注解啟動方式 ?*/ public class AppAnnotation { ? ??? public static void main(String[] args) throws IOException { ??????? AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DubboConfiguration.class); ??????? context.start(); ??????? System.in.read(); ??? } } |
3.5.2 服務(wù)消費者注解配置
引用服務(wù)
| package com.dubbo.consumer.Annotation; ? import com.alibaba.dubbo.config.annotation.Reference; import com.dubbo.provider.service.annotation.ProviderServiceAnnotation; import org.springframework.stereotype.Component; ? /** ?* 注解方式的service ?*/ @Component("annotatedConsumer") public class ConsumerAnnotationService { ? ??? @Reference ??? private ProviderServiceAnnotation providerServiceAnnotation; ? ??? public String doSayHello(String name) { ??????? return providerServiceAnnotation.SayHelloAnnotation(name); ??? } } |
引入依賴
| <dependency> ????????? <groupId>com.test</groupId> ??????????? <artifactId>dubbo-provider</artifactId> ??????????? <version>1.0-SNAPSHOT</version> ??????? </dependency> |
組裝服務(wù)端消費者
| package com.dubbo.consumer.configuration; ? import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.ConsumerConfig; import com.alibaba.dubbo.config.RegistryConfig; import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; ? import java.util.HashMap; import java.util.Map; ? /** ?* 注解配置類 ?*/ @Configuration @EnableDubbo(scanBasePackages = "com.dubbo.consumer.Annotation") @ComponentScan(value = {"com.dubbo.consumer.Annotation"}) public class ConsumerConfiguration { ??? @Bean // 應(yīng)用配置 ??? public ApplicationConfig applicationConfig() { ??????? ApplicationConfig applicationConfig = new ApplicationConfig(); ??????? applicationConfig.setName("dubbo-annotation-consumer"); ??????? Map<String, String> stringStringMap = new HashMap<String, String>(); ??????? stringStringMap.put("qos.enable","true"); ??????? stringStringMap.put("qos.accept.foreign.ip","false"); ??????? stringStringMap.put("qos.port","33333"); ??????? applicationConfig.setParameters(stringStringMap); ??????? return applicationConfig; ??? } ? ??? @Bean // 服務(wù)消費者配置 ??? public ConsumerConfig consumerConfig() { ??????? ConsumerConfig consumerConfig = new ConsumerConfig(); ??????? consumerConfig.setTimeout(3000); ??????? return consumerConfig; ??? } ? ??? @Bean // 配置注冊中心 ??? public RegistryConfig registryConfig() { ??????? RegistryConfig registryConfig = new RegistryConfig(); ??????? registryConfig.setProtocol("zookeeper"); ??????? registryConfig.setAddress("localhost"); ??????? registryConfig.setPort(2181); ??????? return registryConfig; ??? } } |
發(fā)起調(diào)用
| package com.dubbo.consumer; ? import com.dubbo.consumer.Annotation.ConsumerAnnotationService; import com.dubbo.consumer.configuration.ConsumerConfiguration; import com.dubbo.provider.service.ProviderService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; ? import java.io.IOException; ? /** ?* 注解方式啟動 ?* ?*/ public class AppAnnotation { ??? public static void main( String[] args ) throws IOException { ? ??????? AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class); ??????? context.start(); // 啟動 ??????? ConsumerAnnotationService consumerAnnotationService = context.getBean(ConsumerAnnotationService.class); ??????? String hello = consumerAnnotationService.doSayHello("annotation"); // 調(diào)用方法 ??????? System.out.println("result: " + hello); // 輸出結(jié)果 ? ??? } } |
3.6 主要使用場景:
3.6.1 啟動時檢查
Dubbo 缺省會在啟動時檢查依賴的服務(wù)是否可用,不可用時會拋出異常,阻止 Spring 初始化完成,以便上線時,能及早發(fā)現(xiàn)問題,默認(rèn) `check="true"。
3.6.2 集群容錯
| 集群模式 | 說明 | 使用方法 |
| Failover Cluster | 失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。通常用于讀操作,但重試會帶來更長延遲。可通過 retries="2" 來設(shè)置重試次數(shù)(不含第一次)。 | cluster="xxx" xxx:集群模式名稱 ,例如cluster="failover" |
| Failfast Cluster | 快速失敗,只發(fā)起一次調(diào)用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。 | ? |
| Failsafe Cluster | 失敗安全,出現(xiàn)異常時,直接忽略。 | ? |
| Failback Cluster | 失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。 | ? |
| Forking Cluster | 并行調(diào)用多個服務(wù)器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務(wù)資源。可通過 forks="2" 來設(shè)置最大并行數(shù)。 | ? |
| Broadcast Cluster | 廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯。通常用于通知所有提供者更新緩存或日志等本地資源信息。 | ? |
3.6.3 直連服務(wù)提供者
直連就是點對點方式,繞過注冊中心。在開發(fā)及測試環(huán)境下,只測試指定服務(wù)提供者,只需要直接連接服務(wù)端的地即可,這種方式簡單。
總結(jié)
以上是生活随笔為你收集整理的从0到1搞一波dubbo的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电信sdn虚拟服务器,数据中心SDN网络
- 下一篇: 微信小程序——车牌键盘js+css