1. 程式人生 > >SpringBoot系列之整合Dubbo的方式

SpringBoot系列之整合Dubbo的方式

SpringBoot系列之整合Dubbo的方式

本部落格介紹Springboot框架整合Dubbo實現微服務的3種常用方式,對於Dubbo知識不是很熟悉的,請先學習我上一篇部落格:SpringBoot系列之整合Dubbo實現微服務教程,本部落格只是對上篇部落格的補充,上篇部落格已經介紹過的就不重複介紹

還是使用上篇部落格的例子,業務場景:

某個電商系統,訂單服務需要呼叫使用者服務獲取某個使用者的所有地址;
我們現在 需要建立兩個服務模組進行測試

模組 功能
訂單服務模組 建立訂單等
使用者服務模組 查詢使用者地址等
  • 測試預期結果:
    訂單服務web模組在A伺服器,使用者服務模組在B伺服器,A可以遠端呼叫B的功能

例子具體細節,請參考SpringBoot系列之整合Dubbo實現微服務教程,然後所謂的方式不同,其實主要就是對於配置檔案使用的不同,按照這種差異,進行分類描述:

  • application.properties方式
    這種方式,同樣需要匯入dubbo-starter,然後配置application即可

比如我的服務端配置:

#server.port=7010
        
dubbo.application.name=user-service-provider
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper

dubbo.protocol.name=dubbo
dubbo.protocol.port=20882

dubbo.monitor.protocol=registry
#dubbo.scan.base-packages=com.example.springboot.dubbo

然後對於暴露服務和引用服務,還是使用@Service【暴露服務】使用@Reference【引用服務】

  • xml配置檔案方式
    在Springboot官方建議的還是使用application或者其它方式,不過只是建議,Springboot還是可以支援xml的

以服務提供者配置為例,新建一個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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 1、指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名) -->
    <dubbo:application name="user-service-provider"></dubbo:application>
    
    <!-- 2、指定註冊中心的位置 -->
    <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
    
    <!-- 3、指定通訊規則(通訊協議 通訊埠) -->
    <dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
    
    <!-- 4、暴露服務   ref:指向服務的真正的實現物件 -->
    <dubbo:service interface="com.test.dubbo.service.UserService" 
        ref="userServiceImpl01" timeout="1000" version="1.0.0">
        <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
    </dubbo:service>

    <!--統一設定服務提供方的規則  -->
    <dubbo:provider timeout="1000"></dubbo:provider>

    <!-- 服務的實現 -->
    <bean id="userServiceImpl01" class="com.test.dubbo.service.impl.UserServiceImpl"></bean>

    <!-- 連線監控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
    
</beans>

然後在application類或者其它自定義配置類裡引用@ImportResource(locations="classpath:provider.xml")

對於xml方式進行使用的,可以參考我之前部落格:Dubbo系列之服務註冊與發現

  • 全註解API的方式
    接著介紹全註解方式來實現,也即不使用application進行配置,也不使用xml配置檔案,然後一些自定義配置總是要,那要怎麼實現?這裡可以通過寫一個Config類來實現
package com.example.springboot.dubbo.service.impl;

import org.apache.dubbo.config.*;
import com.example.spring.dubbo.service.UserService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class MyDubboConfig {
    
    @Bean
    public ApplicationConfig applicationConfig() {
        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("user-service-provider");
        return applicationConfig;
    }
    
    //<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
    @Bean
    public RegistryConfig registryConfig() {
        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setProtocol("zookeeper");
        registryConfig.setAddress("127.0.0.1:2181");
        return registryConfig;
    }
    
    //<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
    @Bean
    public ProtocolConfig protocolConfig() {
        ProtocolConfig protocolConfig = new ProtocolConfig();
        protocolConfig.setName("dubbo");
        protocolConfig.setPort(20882);
        return protocolConfig;
    }
    
    /**
     *<dubbo:service interface="com.test.dubbo.service.UserService"
     ref="userServiceImpl01" timeout="1000" version="1.0.0">
     <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
     </dubbo:service>
     */
    @Bean
    public ServiceConfig<UserService> userServiceConfig(UserService userService){
        ServiceConfig<UserService> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(UserService.class);
        serviceConfig.setRef(userService);
        serviceConfig.setVersion("1.0.0");
        
        //配置每一個method的資訊
        MethodConfig methodConfig = new MethodConfig();
        methodConfig.setName("getUserAddressList");
        methodConfig.setTimeout(1000);
        
        //將method的設定關聯到service配置中
        List<MethodConfig> methods = new ArrayList<>();
        methods.add(methodConfig);
        serviceConfig.setMethods(methods);
        
        return serviceConfig;
    }

    /**
     * <dubbo:provider timeout="1000"></dubbo:provider>
     */
    @Bean
    public ProviderConfig providerConfig(){
        ProviderConfig providerConfig = new ProviderConfig();
        providerConfig.setTimeout(1000);
        return providerConfig;
    }

    /**
     * <dubbo:monitor protocol="registry"></dubbo:monitor>
     */
    @Bean
    public MonitorConfig monitorConfig(){
        MonitorConfig monitorConfig = new MonitorConfig();
        monitorConfig.setProtocol("registry");
        return monitorConfig;
    }

}

每一個元件手動建立到容器中,讓dubbo來掃描其他的組