Dubbo 服務配置


Dubbo 服務配置簡介

 

前言

大家好,今天開始給大家分享 — Dubbo 專題之 Dubbo 服務配置。那么怎么理解服務配置呢?我們在前面的《Dubbo 服務注冊與發現》章節中討論了服務注冊與發現,其中當我們需要對外暴露一個 Dubbo 服務時需要指定:應用名稱、端口、協議、注冊中心地址、延遲暴露等配置屬性,那么這些配置屬性就是我們所說的服務配置。通過服務配置我們可以改變一些特性,例如:使用不同的通訊協議、切換序列化方式、是否延長暴露服務、調用服務超時時間等等。這里會主要介紹下相關的配置方式具體的詳細配置屬性可以參考:配置參考手冊

 

1. Dubbo 服務 XML 配置

下面我們來使用 XML 方式來暴露和引用 Dubbo 服務。

java源碼目錄結構:

|--serviceconfig

|--api 暴露服務的接口定義

|--consumer 消費者服務

|--provider 服務提供者

idea1

resources目錄結構:

|--serviceconfig

|--consumer 消費者配置文件

|--spring

|--provider 服務提供者配置文件

| --spring

idea2

消費者配置文件dubbo-consumer-xml.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
      xmlns="http://www.springframework.org/schema/beans"
      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應用名稱-->
   <dubbo:application name="demo-consumer" logger="log4j" />
<!--配置Dubbo zookeeper注冊中心地址-->
   <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--配置引用Dubbo服務名稱-->
   <dubbo:reference id="bookFacade" check="false" interface="com.muke.dubbocourse.serviceconfig.api.BookFacade"></dubbo:reference>

</beans>

消費者啟動類:com.muke.dubbocourse.serviceconfig.consumer.XmlApplication

服務提供者配置文件dubbo-provider-xml.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
      xmlns="http://www.springframework.org/schema/beans"
      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應用名稱-->
   <dubbo:application name="demo-provider" metadata-type="remote"/>
<!--配置Dubbo zookeeper注冊中心地址-->
   <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
<!--配置Spring容器Bean-->
   <bean id="bookFacade" class="com.muke.dubbocourse.serviceconfig.provicer.BookFacadeImpl"/>
   <!--暴露本地服務為Dubbo服務-->
   <dubbo:service interface="com.muke.dubbocourse.serviceconfig.api.BookFacade" ref="bookFacade"/>

</beans>

服務提供者啟動類:com.muke.dubbocourse.serviceconfig.provider.XmlApplication

從上面的消費者和提供者配置文件可以看出我們可以通過 xml 的方式來配置服務提供者以及消費者引用遠程服務等更多詳細配置信息可以參考:配置參考手冊

 

2. Dubbo 服務屬性配置

Dubbo 中提供了dubbo.properties屬性文件來配置服務。作為一個默認的配置,他與配置文件和 JVM 配置的優先級順序為:JVM參數(-D開頭的JVM配置參數) > XML 配置(上面已經討論) >dubbo.properties默認配置。Dubbo 可以自動加載classpath根目錄下的dubbo.properties,但是你同樣可以使用 JVM 參數來指定路徑:-Ddubbo.properties.file=xxx.properties。那么下面我們做一個簡單的例子:

  • 消費者配置文件dubbo-consumer-properties.xml中我們取消了注冊中心地址配置,而是在dubbo.properties配置注冊中心地址如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
          xmlns="http://www.springframework.org/schema/beans"
          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應用名稱-->
       <dubbo:application name="demo-consumer" logger="log4j" />
       <!--引用Dubbo服務-->
       <dubbo:reference id="bookFacade" check="false" interface="com.muke.dubbocourse.serviceconfig.api.BookFacade"></dubbo:reference>

    </beans>

    消費者對應啟動類com.muke.dubbocourse.serviceconfig.consumer.PropertiesApplication主要這個啟動類:

    public class PropertiesApplication {

       public static void main(String[] args) {

    //我們指定JVM參數 dubbo.properties.file 配置Dubbo屬性配置文件地址       System.setProperty("dubbo.properties.file","/Users/liyong/work/workspace/course/src/main/resources/serviceconfig/dubbo.properties");

           ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("serviceconfig/consumer/spring/dubbo-consumer-properties.xml");

           context.start();

           BookFacade bookFacade context.getBean("bookFacade", BookFacade.class);

           System.out.println("Result=>"bookFacade.queryAll());

      }

    }
  • 提供者配置文件dubbo-provider-properties.xml中我們不做任何修改:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
          xmlns="http://www.springframework.org/schema/beans"
          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服務引用名稱-->
       <dubbo:application name="demo-provider" metadata-type="remote"/>

      <!--注冊中心地址-->
       <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

      <!--本地Spring容器bean-->
       <bean id="bookFacade" class="com.muke.dubbocourse.serviceconfig.provider.BookFacadeImpl"/>

       <!--暴露本地服務為Dubbo服務-->
       <dubbo:service interface="com.muke.dubbocourse.serviceconfig.api.BookFacade" ref="bookFacade"/>

    </beans>

    提供者對應啟動類com.muke.dubbocourse.serviceconfig.provider.PropertiesApplication

  • dubbo.properties配置如下:

    dubbo.registry.address=zookeeper://127.0.0.1:2181

分析:從上面配置文件可以看出我們在消費端配置文件dubbo-consumer-properties.xml中沒有配置注冊中心地址,只有在dubbo.properties配置了注冊中心地址,也就說明我們指定的dubbo.properties配置文件生效。服務配置加載順序遵循:JVM參數(-D開頭的JVM配置參數) > XML 配置(上面已經討論) >dubbo.properties默認配置。

 

3. Dubbo 服務 API 配置

在 Dubbo 中除了使用 XML 和屬性配置外我們也可以直接使用 API 配置的方式。什么意思呢?也就是說我們可以直接使用硬編碼的形勢來指定相關配置。舉個例子:

  • 編寫消費者入口類:com.muke.dubbocourse.serviceconfig.consumer.JavaApiApplication

    public class JavaApiApplication {

       public static void main(String[] args) {

           BookFacade bookFacade ref();

           System.out.println("Result=>" bookFacade.queryAll());

      }

       private static BookFacade ref() {

           // 當前應用配置
           ApplicationConfig application new ApplicationConfig();
           application.setName("yyy");

           // 連接注冊中心配置
           RegistryConfig registry new RegistryConfig();
           registry.setAddress("zookeeper://127.0.0.1:2181");
           registry.setUsername("aaa");
           registry.setPassword("bbb");

           // 注意:ReferenceConfig為重對象,內部封裝了與注冊中心的連接,以及與服務提供方的連接

           // 引用遠程服務
           ReferenceConfig<BookFacadereference new ReferenceConfig<>(); // 此實例很重,封裝了與注冊中心的連接以及與提供者的連接,請自行緩存,否則可能造成內存和連接泄漏
           reference.setApplication(application);
           reference.setRegistry(registry); // 多個注冊中心可以用setRegistries()
           reference.setInterface(BookFacade.class);
           reference.setVersion("1.0.0");

           // 和本地bean一樣使用bookFacade
           BookFacade bookFacade reference.get(); // 注意:此代理對象內部封裝了所有通訊細節,對象較重,請緩存復用

           return bookFacade;

      }

    }

    從上面代碼我們可以看出通過Java API的方式配置注冊中心配置、Dubbo應用配置、遠程服務引用配置獲取一個BookFacade的遠程引用代理對象。

  • 服務消費者入口類:com.muke.dubbocourse.serviceconfig.provider.JavaApiApplication

    public class JavaApiApplication {

       public static void main(String[] args) throws IOException {

           export();

           //使服務Hold住
           System.in.read();

      }

       /**
        *
        * 暴露服務
        *
        * @author liyong
        * @date 10:49 PM 2020/10/24
        * @param
        * @exception
        * @return void
        **/
       private static void export() {

           BookFacadeImpl bookFacade new BookFacadeImpl();

           // 當前應用配置
           ApplicationConfig application new ApplicationConfig();
           application.setName("course");

           // 連接注冊中心配置
           RegistryConfig registry new RegistryConfig();
           registry.setAddress("zookeeper://127.0.0.1:2181");
           registry.setUsername("aaa");
           registry.setPassword("bbb");

           // 服務提供者協議配置
           ProtocolConfig protocol new ProtocolConfig();
           protocol.setName("dubbo");
           protocol.setPort(12345);
           protocol.setThreads(200);

           // 注意:ServiceConfig為重對象,內部封裝了與注冊中心的連接,以及開啟服務端口

           // 服務提供者暴露服務配置
           ServiceConfig<BookFacadeservice new ServiceConfig<>(); // 此實例很重,封裝了與注冊中心的連接,請自行緩存,否則可能造成內存和連接泄漏
           service.setApplication(application);
           service.setRegistry(registry); // 多個注冊中心可以用setRegistries()
           service.setProtocol(protocol); // 多個協議可以用setProtocols()
           service.setInterface(BookFacade.class);
           service.setRef(bookFacade);
           service.setVersion("1.0.0");

           // 暴露及注冊服務
           service.export();

      }

    }

     

從上面代碼我們可以看出通過Java API 的方式配置注冊中心配置、服務協議、Dubbo 應用配置、暴露和注冊bean服務。

 

4. Dubbo 服務注解配置

注解配置也是我們最常用的一種方式,它是通過使用@DubboService(@Service)暴露服務、@DubboReference(@Reference)引用遠程 Dubbo 服務。下面我們舉一個例子:

  • 消費者服務入口類:com.muke.dubbocourse.serviceconfig.consumer.AnnotationApplication

    @EnableDubbo(scanBasePackages = "com.muke.dubbocourse.serviceconfig.provider")//激活Dubbo功能並且掃描com.muke.dubbocourse.serviceconfig.provider理解中Dubbo自己的注解
    @PropertySource("classpath:/serviceconfig/consumer/spring/dubbo-consumer.properties")//加載dubbo-consumer.properties配置文件
    @ComponentScan(value = {"com.muke.dubbocourse.serviceconfig.consumer"})//掃描Spring容器中的bean
    public class AnnotationApplication {

    public static void main(String[] args){

    // 創建 BeanFactory 容器
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    // 注冊 Configuration Class(配置類) -> Spring Bean
    applicationContext.register(AnnotationApplication.class);

    // 啟動 Spring 應用上下文
    applicationContext.refresh();

    //從容器中獲取引用
    BookFacade bookFacade = applicationContext.getBean(BookFacade.class);

    System.out.println("AnnotationApplication Result is =>" + bookFacade.queryAll());
    //關閉容器
    applicationContext.close();

    }
    }
  • 服務提供者入口類:com.muke.dubbocourse.serviceconfig.provider.AnnotationApplication

    @EnableDubbo(scanBasePackages = "com.muke.dubbocourse.serviceconfig.provider")//開啟Dubbo功能且掃描com.muke.dubbocourse.serviceconfig.provider包路徑中Dubbo相關注解
    @PropertySource("classpath:/serviceconfig/provider/spring/dubbo-provider.properties")
    public class AnnotationApplication {

    public static void main(String[] args) throws IOException {

    // 創建 BeanFactory 容器
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    // 注冊 Configuration Class(配置類) -> Spring Bean
    applicationContext.register(AnnotationApplication.class);

    // 啟動 Spring 應用上下文
    applicationContext.refresh();

    //Hold住進程
    System.in.read();

    }
    }

從上面的例子中可以看到我們使用 Dubbo 提供的注解大大減少了我們的配置工作量。同時我們在選擇服務配置方式時,需要根據我們的業務場景去綜合考慮使用哪一種配置方式更適合我們團隊開發。

 

5. 小結

在本小節中我們主要學習了 Dubbo 中的4種服務配置方式,分別從 XML 配置、屬性配置、API 配置、注解配置中可以看出 Dubbo 在不斷的簡化和優化 Dubbo 的復雜的配置,使我們更容易去集成和使用 Dubbo。

本節課程的重點如下:

  1. 理解 Dubbo 中4種服務配置方式

  2. 了解什么是 XML 配置

  3. 了解什么是屬性配置

  4. 了解什么是 API 配置

  5. 了解什么是注解配置

作者

個人從事金融行業,就職過易極付、思建科技、某網約車平台等重慶一流技術團隊,目前就職於某銀行負責統一支付系統建設。自身對金融行業有強烈的愛好。同時也實踐大數據、數據存儲、自動化集成和部署、分布式微服務、響應式編程、人工智能等領域。同時也熱衷於技術分享創立公眾號和博客站點對知識體系進行分享。關注公眾號:青年IT男 獲取最新技術文章推送!

博客地址: http://youngitman.tech

微信公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM