日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从0到1搞一波dubbo

發(fā)布時間:2023/12/10 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从0到1搞一波dubbo 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。