前言
大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo 服务配置。那么怎么理解服务配置呢?我们在前面的《Dubbo 服务注册与发现》章节中讨论了服务注册与发现,其中当我们需要对外暴露一个 Dubbo 服务时需要指定:应用名称、端口、协议、注册中心地址、延迟暴露等配置属性,那么这些配置属性就是我们所说的服务配置。通过服务配置我们可以改变一些特性,例如:使用不同的通讯协议、切换序列化方式、是否延长暴露服务、调用服务超时时间等等。这里会主要介绍下相关的配置方式具体的详细配置属性可以参考:配置参考手册。
1. Dubbo 服务 XML 配置
下面我们来使用 XML 方式来暴露和引用 Dubbo 服务。
java 源码目录结构:
|--serviceconfig
|--api 暴露服务的接口定义
|--consumer 消费者服务
|--provider 服务提供者
resources 目录结构:
|--serviceconfig
|--consumer 消费者配置文件
|--spring
|--provider 服务提供者配置文件
| --spring
消费者配置文件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
。那么下面我们做一个简单的例子:
<?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());
}
}
复制代码
<?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.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 配置的方式。什么意思呢?也就是说我们可以直接使用硬编码的形势来指定相关配置。举个例子:
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 的远程引用代理对象。
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 服务。下面我们举一个例子:
@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();
}
}
复制代码
@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 男 获取最新技术文章推送!
博客地址: http://youngitman.tech
微信公众号:
知识星球:
评论