大家好,今天開始給大家分享 — Dubbo 專題之 Dubbo 服務配置。那么怎么理解服務配置呢?我們在前面的《Dubbo 服務注冊與發現》章節中討論了服務注冊與發現,其中當我們需要對外暴露一個 Dubbo 服務時需要指定:應用名稱、端口、協議、注冊中心地址、延遲暴露等配置屬性,那么這些配置屬性就是我們所說的服務配置。通過服務配置我們可以改變一些特性,例如:使用不同的通訊協議、切換序列化方式、是否延長暴露服務、調用服務超時時間等等。這里會主要介紹下相關的配置方式具體的詳細配置屬性可以參考:
1. Dubbo 服務 XML 配置
下面我們來使用 XML 方式來暴露和引用 Dubbo 服務。
java源碼目錄結構:
|--serviceconfig
|--api 暴露服務的接口定義
|--consumer 消費者服務
|--provider 服務提供者
resources目錄結構:
|--serviceconfig
|--consumer 消費者配置文件
|--spring
|--provider 服務提供者配置文件
| --spring
消費者配置文件dubbo-consumer-xml.xml
如下:
消費者啟動類:com.muke.dubbocourse.serviceconfig.consumer.XmlApplication
服務提供者配置文件dubbo-provider-xml.xml
如下:
服務提供者啟動類: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
配置注冊中心地址如下:消費者對應啟動類
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
中我們不做任何修改:提供者對應啟動類
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<BookFacade> reference = 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<BookFacade> service = 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。
本節課程的重點如下:
-
理解 Dubbo 中4種服務配置方式
-
了解什么是 XML 配置
-
了解什么是屬性配置
-
了解什么是 API 配置
-
了解什么是注解配置
作者
個人從事金融行業,就職過易極付、思建科技、某網約車平台等重慶一流技術團隊,目前就職於某銀行負責統一支付系統建設。自身對金融行業有強烈的愛好。同時也實踐大數據、數據存儲、自動化集成和部署、分布式微服務、響應式編程、人工智能等領域。同時也熱衷於技術分享創立公眾號和博客站點對知識體系進行分享。關注公眾號:青年IT男 獲取最新技術文章推送!
博客地址:
微信公眾號: