溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何快速上手Dubbo

發(fā)布時(shí)間:2021-09-29 14:43:55 來源:億速云 閱讀:140 作者:柒染 欄目:編程語言

如何快速上手Dubbo,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

最近項(xiàng)目中需要用到dubbo,雖然我知道dubbo是一個(gè)RPC框架,但是沒有去詳細(xì)了解這個(gè)框架。既然項(xiàng)目要用,那就先把Dubbo的應(yīng)用給學(xué)會(huì),等熟練使用之后,再去了解Dubbo內(nèi)部的原理。

目前來說,Dubbo是最有名的RPC服務(wù)調(diào)用框架,他是阿里開源的一個(gè)SOA服務(wù)治理框架,功能較為完善,支持多種傳輸和序列化方案。Dubbo最常用的應(yīng)用就是遠(yuǎn)程調(diào)用。

Dubbo中服務(wù)端最核心的對(duì)象有四個(gè):

ApplicationConfig:配置當(dāng)前應(yīng)用信息

ProtocolConfig:配置提供服務(wù)的協(xié)議信息

RegistryConfig:配置注冊(cè)相關(guān)信息

ServiceConfig:配置暴露的服務(wù)信息

Dubbo客戶端中核心的對(duì)象有兩個(gè):

ApplicationConfig:配置當(dāng)前應(yīng)用信息

ReferenceConfig:配置引用的服務(wù)信息

(二)Dubbo實(shí)戰(zhàn)

接下來通過三種方式入門Dubbo。首先會(huì)通過代碼直接展示dubbo的直連和注冊(cè)中心實(shí)現(xiàn)方式,接著使用Spring和SpringBoot的方式分別展示如何使用Dubbo。

在寫dubbo相關(guān)代碼前,我們首先要定義一個(gè)公共的客戶端服務(wù),這個(gè)服務(wù)里存放的是service接口。服務(wù)提供者引入這個(gè)工程,寫實(shí)現(xiàn)類,提供dubbo接口;服務(wù)消費(fèi)者引入這個(gè)工程,通過這個(gè)工程的service接口調(diào)用。

因此新建這樣一個(gè)模塊,命名為dubbo-client,整體代碼結(jié)構(gòu)如下,只需要寫一個(gè)service接口即可:

如何快速上手Dubbo

User類:

@Data
public class User implements Serializable {
    private static final long serialVersionUID = -9206514891359830486L;
    private Long id;
    private String name;
    private String sex;
}

UserService:

public interface UserService {
    User getUser(Long id);
}

2.1 直接代碼

接下來通過直接代碼的方式生成一個(gè)dubbo服務(wù),并且用另外一個(gè)類去調(diào)用這個(gè)dubbo服務(wù):

2.1.1 引入依賴

核心依賴就兩個(gè),一個(gè)dubbo的依賴,另外一個(gè)上面的公共接口方法

<dependencies>
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>2.7.4.1</version>
    </dependency>
    <dependency>
        <artifactId>dubbo-client</artifactId>
        <groupId>com.javayz</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

2.1.2 編寫服務(wù)提供者

服務(wù)提供者主要配置以下幾個(gè)屬性:

1、application:設(shè)置應(yīng)用的名稱等信息

2、protocol :設(shè)置服務(wù)的協(xié)議

3、register:設(shè)置服務(wù)的連接方式

4、service:將需要暴露的服務(wù)注冊(cè)出來

public class DubboProvider {
    public static void main(String[] args) throws IOException {
        //暴露UserService服務(wù)
        //1、application
        ApplicationConfig applicationConfig=new ApplicationConfig("sample-provider");
        //2、protocol -dubbo協(xié)議
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20880);
        //3、register
        //直連的方式,不暴露到注冊(cè)中心
        RegistryConfig registryConfig=new RegistryConfig(RegistryConfig.NO_AVAILABLE);
        //4、service
        ServiceConfig serviceConfig=new ServiceConfig();
        serviceConfig.setInterface(UserService.class);
        serviceConfig.setRef(new UserServiceImpl());
        //5、將application、protocol、register注冊(cè)到service
        serviceConfig.setRegistry(registryConfig);
        serviceConfig.setProtocol(protocolConfig);
        serviceConfig.setApplication(applicationConfig);
        serviceConfig.export();

        System.out.println("服務(wù)已經(jīng)暴露");
        System.in.read();
    }
}

2.1.3 編寫服務(wù)消費(fèi)者

消費(fèi)者的實(shí)現(xiàn)主要就三步:

1、配置application:設(shè)置應(yīng)用的名稱等信息

2、配置reference:主要配置要引用的信息

3、獲取到接口,調(diào)用服務(wù)。

public class DubboConsumer {
    public static void main(String[] args) {
        //1、application
        ApplicationConfig applicationConfig=new ApplicationConfig("sample-consumer");
        //2、配置reference
        ReferenceConfig referenceConfig=new ReferenceConfig();
        referenceConfig.setApplication(applicationConfig);
        referenceConfig.setInterface(UserService.class);
        referenceConfig.setUrl("dubbo://172.18.2.49:20880/com.javayz.client.service.UserService?anyhost=true&application=sample&bind.ip=172.18.2.49&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.javayz.client.service.UserService&methods=getUser&pid=5936&release=2.7.4.1&side=provider&timestamp=1618036935244");
        UserService userService = (UserService) referenceConfig.get();
        User user = userService.getUser(1L);
        System.out.println(user);
    }
}

先啟動(dòng)提供者,再啟動(dòng)消費(fèi)者,如果user信息打印出來了就說明調(diào)用成功。

這里的Register使用的是直連的方式,我們也可以使用注冊(cè)中心,這里以zookeeper為例。首先在項(xiàng)目中引入zookeeper相關(guān)依賴:

<!-- zk客戶端依賴:curator -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>2.13.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.13.0</version>
</dependency>

服務(wù)提供者修改一處地方,將RegistryConfig修改為zookeeper的連接方式

//register
//直連的方式,不暴露到注冊(cè)中心
//RegistryConfig registryConfig=new RegistryConfig(RegistryConfig.NO_AVAILABLE);
//通過注冊(cè)中心暴露dubbo
RegistryConfig registryConfig=new RegistryConfig("zookeeper://192.168.78.128:2181");

消費(fèi)者同樣修改一處位置,將referenceConfig中的setUrl方法替換為zookeeper:

RegistryConfig registryConfig=new RegistryConfig("zookeeper://192.168.78.128:2181");
ReferenceConfig referenceConfig=new ReferenceConfig();
referenceConfig.setRegistry(registryConfig);
referenceConfig.setApplication(applicationConfig);
referenceConfig.setInterface(UserService.class);
//referenceConfig.setUrl("dubbo://172.18.2.49:20880/com.javayz.client.service.UserService?anyhost=true&application=sample&bind.ip=172.18.2.49&bind.port=20880&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.javayz.client.service.UserService&methods=getUser&pid=5936&release=2.7.4.1&side=provider&timestamp=1618036935244");

2.2 通過Spring

通過Spring的方式只不過是把上面寫在Java中的代碼拿到配置文件中去,并把接口注入到Bean容器中,在resource文件夾下新建兩個(gè)配置文件: 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://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系 -->
    <dubbo:application name="sample-provider"  />

    <!-- 使用zookeeper廣播注冊(cè)中心暴露服務(wù)地址 -->
    <dubbo:registry address="zookeeper://192.168.78.128:2181" />

    <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) -->
    <dubbo:protocol name="dubbo" port="20880" />

    <!-- 聲明需要暴露的服務(wù)接口 -->
    <dubbo:service interface="com.javayz.client.service.UserService" ref="userService" />

    <!-- 和本地bean一樣實(shí)現(xiàn)服務(wù) -->
    <bean id="userService" class="com.javayz.example1.service.impl.UserServiceImpl" />
</beans>

consumer.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <dubbo:application name="sample-consumer"  />
    <dubbo:registry address="zookeeper://192.168.78.128:2181" />
    <dubbo:reference id="userService" interface="com.javayz.client.service.UserService" />
</beans>

這里的配置文件和上方的代碼均一一對(duì)應(yīng)。接著是服務(wù)的提供者和消費(fèi)者: SpringDubboProvider

public class SpringDubboProvider {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("provider.xml");
        System.out.println("服務(wù)已經(jīng)暴露");
        System.in.read();
    }
}

SpringDubboConsumer

public class SpringDubboConsumer {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("consumer.xml");
        UserService bean = context.getBean(UserService.class);
        System.out.println(bean.getUser(1L));
    }
}

2.3 通過SpringBoot的方式

新建兩個(gè)SpringBoot項(xiàng)目,一個(gè)是服務(wù)提供者,一個(gè)是服務(wù)消費(fèi)者,引入dubbo的核心依賴

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>2.7.4.1</version>
</dependency>

這里的配置都寫在application.properties中,首先是服務(wù)提供者:

dubbo.application.name=dubbo-provider
dubbo.registry.address=zookeeper://192.168.78.128:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

服務(wù)提供者需要寫服務(wù)的實(shí)現(xiàn)類,這里需要注意@Service注解采用的是dubbo包下:

import com.javayz.client.entity.User;
import com.javayz.client.service.UserService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;

@Service
@Component
public class UserServiceImpl implements UserService {
    @Override
    public User getUser(Long id) {
        User user=new User();
        user.setId(id);
        user.setName("javayz");
        user.setSex("man");
        return user;
    }
}

接著在啟動(dòng)類上添加一個(gè)@EnableDubbo注解即可。

服務(wù)的消費(fèi)者同樣是先寫一下配置文件:

server.port=8081
dubbo.application.name=dubbo-consumer
dubbo.registry.address=zookeeper://192.168.78.128:2181

接著通過@Reference注解將service對(duì)象引進(jìn)來

@SpringBootApplication
public class SpringbootconsumerApplication {

    @Reference
    UserService userService;

    public static void main(String[] args) {
        SpringApplication.run(SpringbootconsumerApplication.class, args);
    }

    @Bean
    public ApplicationRunner getBean(){
        return args -> {
            System.out.println(userService.getUser(1L));
        };
    }
}

(三)dubbo的常用配置

<dubbo:application/> 用于配置當(dāng)前應(yīng)用信息
<dubbo:register/> 用于配置連接注冊(cè)相關(guān)信息
<dubbo:protocol/> 用于配置提供服務(wù)的協(xié)議信息,提供者指定協(xié)議,消費(fèi)者被動(dòng)接受
<dubbo:service/> 用于暴露一個(gè)服務(wù),一個(gè)服務(wù)可以用多個(gè)協(xié)議暴露,一個(gè)服務(wù)也可以注冊(cè)到多個(gè)注冊(cè)中心
<dubbo:provider/> 當(dāng)ProtocolConfig和ServiceConfig某屬性沒有配置時(shí),采用此缺省值
<dubbo:consumer/> 當(dāng)ReferenceConfig某屬性沒有配置時(shí),采用此缺省值
<dubbo:reference/> 用于創(chuàng)建一個(gè)遠(yuǎn)程服務(wù)代理

更加具體的配置信息我在官網(wǎng)中找到了,大家可參考:

https://dubbo.apache.org/zh/docs/v2.7/user/references/xml/

(四)企業(yè)中如何通過dubbo實(shí)現(xiàn)分布式調(diào)用

在企業(yè)中,如果消費(fèi)者直接通過RPC去調(diào)用提供者,理論上需要把提供者的整個(gè)Jar包引入到項(xiàng)目中。但是這樣的話服務(wù)提供這種的其他無關(guān)代碼也會(huì)被引入其中,導(dǎo)致代碼污染。

因此實(shí)際開發(fā)過程中,服務(wù)提供者和調(diào)用者之間會(huì)增加一層Client模塊。這個(gè)Client中主要寫的是Service的接口定義,接口的返回實(shí)例對(duì)象以及接口的請(qǐng)求實(shí)例對(duì)象。簡(jiǎn)單來講,所有的定義都在Client中完成

使用時(shí),服務(wù)提供者引入這個(gè)Client,然后寫實(shí)現(xiàn)方法,服務(wù)消費(fèi)者引入這個(gè)Client,然后通過dubbo直接調(diào)用即可。

另外企業(yè)開發(fā)中,可能會(huì)出現(xiàn)多個(gè)接口實(shí)現(xiàn),這種情況下可以給Service設(shè)定group、version等進(jìn)行區(qū)分。

(五)總結(jié)

Dubbo的基本使用就這些,Dubbo畢竟只是一個(gè)RPC的工具,我們可以用它很方便地暴露、消費(fèi)服務(wù)。但是兩個(gè)小時(shí)也只是會(huì)上手使用,它內(nèi)部的一些配置,一些理念以及最重要的原理都是需要我們自己去深耕的。

關(guān)于如何快速上手Dubbo問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI