Dubbo基本用法-Dubbo Provider配置
Dubbo基本用法-Dubbo Provider配置
</div>
<ul class="tag-group">
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_512/" class="label-item"><span>Apache</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_698/" class="label-item"><span>配置</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_1383/" class="label-item"><span>Annotation</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_1536/" class="label-item"><span>EDAS</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_1861/" class="label-item"><span>Registry</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_1955/" class="label-item"><span>schema</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_2437/" class="label-item"><span>alibaba</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_2614/" class="label-item"><span>service</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_4134/" class="label-item"><span>dubbo</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_7062/" class="label-item"><span>Provider</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_10507/" class="label-item"><span>XML配置</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_13623/" class="label-item"><span>企业级分布式应用服务</span></a>
</li>
<li class="tag tag-item">
<a href="/tags/type_blog-tagid_28912/" class="label-item"><span>dubbo.properties</span></a>
</li>
</ul>
<p class="blog-summary">
<em>摘要:</em>
本章节主要讲述如何配置dubbo,按照配置方式上分,可以分为:XML配置,properties方式配置,注解方式配置,API调用方式配置。
按照功能角度进行划分,可以分为Dubbo Provider和Dubbo Consumer。
<div class="content-detail markdown-body">
Dubbo基本用法
本章节主要讲述如何配置dubbo,按照配置方式上分,可以分为:XML配置,properties方式配置,注解方式配置,API调用方式配置。
按照功能角度进行划分,可以分为Dubbo Provider和Dubbo Consumer。接下来章节中,分别对dubbo provider和Dubbo consumer进行讲解。
Dubbo Provider配置
Provider 配置详解
配置Dubbo Provider有4种方式:XML配置,properties方式配置,API调用方式配置,注解方式配置。
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">
<dubbo:application name="hello-world-app" />
<dubbo:registry address="multicast://224.5.6.7:1234" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoServiceLocal" />
<dubbo:reference id="demoServiceRemote" interface="com.alibaba.dubbo.demo.DemoService" />
</beans>
上面样例中,注意下dubbo schema的写法:
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/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://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
支持的配置标签
标签 | 用途 | 解释 |
---|---|---|
<dubbo:service/> | 服务配置 | 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 |
<dubbo:reference/> | 引用配置 | 用于创建一个远程服务代理,一个引用可以指向多个注册中心 |
<dubbo:protocol/> | 协议配置 | 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受 |
<dubbo:application/> | 应用配置 | 用于配置当前应用信息,不管该应用是提供者还是消费者 |
<dubbo:module/> | 模块配置 | 用于配置当前模块信息,可选 |
<dubbo:registry/> | 注册中心配置 | 用于配置连接注册中心相关信息 |
<dubbo:monitor/> | 监控中心配置 | 用于配置连接监控中心相关信息,可选 |
<dubbo:provider/> | 提供方配置 | 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采用此缺省值,可选 |
<dubbo:consumer/> | 消费方配置 | 当 ReferenceConfig 某属性没有配置时,采用此缺省值,可选 |
<dubbo:method/> | 方法配置 | 用于 ServiceConfig 和 ReferenceConfig 指定方法级的配置信息 |
<dubbo:argument/> | 参数配置 | 用于指定方法参数配置 |
配置项详解
- <dubbo:application name="hello-world-app" />
用于指定应用名,这里需要保证应用名唯一,这个应用名在后续的console admin中可以在列表中显示,方便管理。 - <dubbo:registry address="multicast://224.5.6.7:1234" />
注册中心配置,和服务发现的具体机制有关系。可以是zookeeper地质,也可以eureka地质。上面这个是广播地址,在本地服务调用的测试过程中非常方便。 - <dubbo:protocol name="dubbo" port="20880" />
这里是传输的协议和默认端口,一般不需要更改。
接下来重点讲解下<dubbo:service/>的配置。
- <dubbo:service/>支持的主要属性列表:
| 属性名 | 说明 |
version | 版本号 |
scope | 服务可见性, 值为:local 或者 remote,默认为remote |
actives | 最大的**的请求数 |
async | 方法调用是否异步,默认为false |
cache | 服务缓存,可选值:lru/threadlocal/jcache |
callbacks | callback实例的限制 |
generic | 泛化调用,可以绕过 |
class | Service的实现的类名 |
connections | 这个服务里的连接数 |
delay | 发布服务延迟的毫秒数 |
executes | 服务执行的请求上限 |
retries | 超时重试次数 |
timeout | 调用超时时间 |
其他配置属性请参考xsd:http://dubbo.apache.org/schema/dubbo/dubbo.xsd
- <dubbo:method/>作为<dubbo:service/>的子元素,它可以针对方法进行配置。比较常用的属性有:
属性名 | 说明 |
---|---|
executes | 服务执行的请求上限 |
retries | 超时重试次数 |
timeout | 调用超时时间 |
其他属性,可以参考上面的xsd。
配置的覆盖关系
这里的覆盖关系包含了Provider和Consumer两端的配置,如果对consumer有疑问,可以参考后一章节的consumer章节之后再来理解。
dubbo.properties方式配置
如果公共配置很简单,没有多注册中心,多协议等情况,或者想多个 Spring 容器想共享配置,可以使用 dubbo.properties 作为缺省配置。
Dubbo 将自动加载 classpath 根目录下的 dubbo.properties,可以通过JVM启动参数 -Ddubbo.properties.file=xxx.properties 改变缺省配置位置。
dubbo.properties配置样例
# 应用名
dubbo.application.name=dubbodemo-provider
# 注册中心地址
dubbo.registry.address=zookeeper://localhost:2181
# 广播的注册中心样例
#dubbo.registry.address=multicast://224.5.6.7:1234
# 调用协议地址
dubbo.protocol.name=dubbo
dubbo.protocol.port=28080
映射规则
将 XML 配置的标签名,加属性名,用点分隔,多个属性拆成多行
- 比如:dubbo.application.name=foo等价于
- 比如:dubbo.registry.address=10.20.153.10:9090等价于
如果 XML 有多行同名标签配置,可用 id 号区分,如果没有 id 号将对所有同名标签生效
- 比如:dubbo.protocol.rmi.port=1234等价于 2
- 比如:dubbo.registry.china.address=10.20.153.10:9090等价于
覆盖策略
- JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
- XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
- Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。
注意:
- 如果 classpath 根目录下存在多个 dubbo.properties,比如多个 jar 包中有 dubbo.properties,Dubbo 会任意加载,并打印 Error 日志,后续可能改为抛异常。 ↩
- 协议的 id 没配时,缺省使用协议名作为 id
annotation
Service注解暴露服务
import com.alibaba.dubbo.config.annotation.Service;
@Service(timeout = 5000)
public class AnnotateServiceImpl implements AnnotateService {
// …
}
javaconfig形式配置公共模块
@Configuration
public class DubboConfiguration {
<span class="hljs-meta">@Bean</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> ApplicationConfig <span class="hljs-title">applicationConfig</span><span class="hljs-params">()</span> </span>{
ApplicationConfig applicationConfig = <span class="hljs-keyword">new</span> ApplicationConfig();
applicationConfig.setName(<span class="hljs-string">"provider-test"</span>);
<span class="hljs-keyword">return</span> applicationConfig;
}
<span class="hljs-meta">@Bean</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> RegistryConfig <span class="hljs-title">registryConfig</span><span class="hljs-params">()</span> </span>{
RegistryConfig registryConfig = <span class="hljs-keyword">new</span> RegistryConfig();
registryConfig.setAddress(<span class="hljs-string">"zookeeper://127.0.0.1:2181"</span>);
registryConfig.setClient(<span class="hljs-string">"curator"</span>);
<span class="hljs-keyword">return</span> registryConfig;
}
}
这种方式的配置和前面用xml配置的方式是一样的效果。
指定dubbo扫描路径
@SpringBootApplication
@DubboComponentScan(basePackages = "com.alibaba.dubbo.test.service.impl")
public class ProviderTestApp {
// ...
}
或者使用spring bean xml配置方式:
<dubbo:annotation package="com.chanshuyi.service.impl" />
api直接触发
import com.alibaba.dubbo.rpc.config.ApplicationConfig;
import com.alibaba.dubbo.rpc.config.RegistryConfig;
import com.alibaba.dubbo.rpc.config.ProviderConfig;
import com.alibaba.dubbo.rpc.config.ServiceConfig;
import com.xxx.XxxService;
import com.xxx.XxxServiceImpl;
// 服务实现
XxxService xxxService = new XxxServiceImpl();
// 当前应用配置
ApplicationConfig application = new ApplicationConfig();
application.setName(“xxx”);
// 连接注册中心配置
RegistryConfig registry = new RegistryConfig();
registry.setAddress(“10.20.130.230:9090”);
registry.setUsername(“aaa”);
registry.setPassword(“bbb”);
// 服务提供者协议配置
ProtocolConfig protocol = new ProtocolConfig();
protocol.setName(“dubbo”);
protocol.setPort(12345);
protocol.setThreads(200);
// 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
// 服务提供者暴露服务配置
ServiceConfig<XxxService> service = new ServiceConfig<XxxService>(); // 此实例很重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
service.setApplication(application);
service.setRegistry(registry); // 多个注册中心可以用setRegistries()
service.setProtocol(protocol); // 多个协议可以用setProtocols()
service.setInterface(XxxService.class);
service.setRef(xxxService);
service.setVersion(“1.0.0”);
// 暴露及注册服务
service.export();
一般在spring应用中,不推荐使用这种方式。 具体的含义这里不做解释,可以通过github查看源码。
Provider 接口和实现
上面章节更多从配置角度出发,接下来通过一个完整的例子,来讲解下dubbo provider的完整使用。
这个例子中只有一个服务UserReadService,有一个方法 getUserById。 需要将这个服务通过Dubbo暴露给远程的服务。具体的步骤如下:
1.创建工程
如果本来已经有工程,可以忽略。创建一个spring boot工程,可以通过 https://start.spring.io/ 创建。
2.定义接口
定义接口:UserReadService
public interface UserReadService{
public User getUserById(Long userId);
}
这个接口一般来说会放到独立的jar包里,作为client包。 其他应用要消费这个服务的时候,一般来说需要应用引用这个client包。(除了泛化调用)
3.实现接口
实现UserReadService, 当前实现部署在Provider的应用中。
public UserReadServiceImpl implements UserReadService{
public User getUserById(Long userId){
return xxx;
}
}
4.Dubbo配置
<?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">
<dubbo:application name="hello-world-app" />
<dubbo:registry address="multicast://224.5.6.7:1234" />
<dubbo:protocol name="dubbo" port="20880" />
<bean id="userReadService" class="com.package.UserReadServiceImpl"/>
<dubbo:service interface="com.package.UserReadService" ref="userReadService" />
</beans>
Dubbo配置的其他方式可以参考上一章节的相关配置,或者使用集成dubbo spring boot starter方式。
<!-- 登录查看 begin -->
<!-- 登录查看 end -->
</div>
<div class="copyright-outer-line yq-blog-sem-remove">
<div class="yq-blog-sem-remove copyright-notice">
本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至[email protected];如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:[email protected] 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
</div>
</div>
<div class="yq-blog-sem-remove" style="text-align:center; margin-top:10px"><img src="//img.alicdn.com/tfs/TB1lKbLGb9YBuNjy0FgXXcxcXXa-512-512.png" style="width: 144px; height:144px"><p>用云栖社区APP,舒服~</p></div>
<div class="yq-blog-sem-remove" style="margin-top: 20px;font-size: 12px;line-height: 1.8;color:#373d41;font-family:PingFangSC-Regular;word-break: break-all;">
【云栖快讯】诚邀你用自己的技术能力来用心回答每一个问题,通过回答传承技术知识、经验、心得,问答专家期待你加入! <a href="https://yq.aliyun.com/ask/133867" target="_blank" rel="nofollow">详情请点击</a>
</div>
<div class="footer-detail yq-blog-sem-remove yq-blog-interaction clearfix">
<a href="#comment" class="icon-pinglun comment_btn">评论 (<i>0</i>)</a>
<span id="vote_btn" has_voted="" data-aid="601751" data-islogin="false" title="点赞" class="icon-zan opt-btn vote_btn ">点赞 (<span id="vote_num">1</span>)</span>
<span id="mark_btn" has_marked="" data-aid="601751" data-islogin="false" title="收藏" class="icon-love opt-btn mark_btn ">收藏 (<span id="mark_num">1</span>)</span>
<dl class="share-to">
<dt>分享到:</dt>
<dd>
<a href="http://service.weibo.com/share/share.php?title=Dubbo%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95-Dubbo+Provider%E9%85%8D%E7%BD%AE+%E6%9C%AC%E7%AB%A0%E8%8A%82%E4%B8%BB%E8%A6%81%E8%AE%B2%E8%BF%B0%E5%A6%82%E4%BD%95%E9%85%8D%E7%BD%AEdubbo%EF%BC%8C%E6%8C%89%E7%85%A7%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F%E4%B8%8A%E5%88%86%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%88%86%E4%B8%BA%EF%BC%9AXML%E9%85%8D%E7%BD%AE%EF%BC%8Cproperties%E6%96%B9%E5%BC%8F%E9%85%8D%E7%BD%AE%EF%BC%8C%E6%B3%A8%E8%A7%A3%E6%96%B9%E5%BC%8F%E9%85%8D%E7%BD%AE%EF%BC%8CAPI%E8%B0%83%E7%94%A8%E6%96%B9%E5%BC%8F%E9%85%8D%E7%BD%AE%E3%80%82%0D%0A%E6%8C%89%E7%85%A7%E5%8A%9F%E8%83%BD%E8%A7%92%E5%BA%A6%E8%BF%9B%E8%A1%8C%E5%88%92%E5%88%86%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%88%86%E4%B8%BADubbo+Provider%E5%92%8CDubbo+Consumer%E3%80%82&url=https%3A%2F%2Fyq.aliyun.com%2Farticles%2F601751" target="_blank" class="icon-weibo"></a>
<div class="wechat">
<i class="icon-weixin"></i>
<img src="/api/qrcode?size=140&key=36bed36de15cad4662edce7329ba29b6d70cdc28&text=https%3A%2F%2Fyq.aliyun.com%2Farticles%2F601751" alt="">
</div>
</dd>
</dl>
</div>
<div class="yq-blog-pre-next yq-blog-sem-remove">
<ul class="about-c-list">
<li><a href="/articles/601748">上一篇:第一个 Dubbo 应用</a></li>
<li><a href="/articles/601752">下一篇:阿里云ACM英文版上线,论“全局配置”在电商国际化微服务平台建设中的妙用</a></li>
</ul>
</div>
<div class="yq-blog-related-articles yq-blog-sem-remove">
<h3 class="title-info">相关文章</h3>
<ul class="about-c-list">
<li>
<a href="/articles/625847">
服务化改造实践(一)| Dubbo + ZooKeepe…
</a>
</li>
<li>
<a href="/articles/601748">
第一个 Dubbo 应用
</a>
</li>
<li>
<a href="/articles/142902">
Dubbo协议与连接控制
</a>
</li>
<li>
<a href="/articles/224649">
架构师之路-在Dubbo中开发REST风格的远程调用
</a>
</li>
<li>
<a href="/articles/222629">
架构师之路-在Dubbo中开发REST风格的远程调用
</a>
</li>
<li>
<a href="/articles/610737">
Dubbo学习1-Hello world
</a>
</li>
<li>
<a href="/articles/27895">
基于Dubbo框架构建分布式服务
</a>
</li>
<li>
<a href="/articles/58510">
Great Dubbo(上)
</a>
</li>
<li>
<a href="/articles/646848">
线下Springboot+dubbo应用迁kuberne…
</a>
</li>
<li>
<a href="/articles/636943">
Dubbo源码分析1:生产者启动分析
</a>
</li>
</ul>
</div>
<div class="yq-blog-comment yq-blog-sem-remove">
<h3 class="title-info">网友评论</h3>
<section class="comments-box clearfix">
<div class="media-list comments" id="comments">
<form accept-charset="UTF-8" action="/comments" method="POST" data-remote="true" data-target="#comments" class="js-comment-create js-active-on-valid css-unlogin">
<input type="hidden" name="type" value="article">
<input type="hidden" name="yunqi_csrf" value="YBSY8BAUYM">
<input type="hidden" name="isCheck" value="1">
<input type="hidden" name="pid" value="601751">
<div class="form-group">
<div class="editor">
<div class="login_tips" id="comment">登录后可评论,请 <a id="fast_login" href="https://account.aliyun.com/login/login.htm?from_type=yqclub&oauth_callback=https%3A%2F%2Fyq.aliyun.com%2Farticles%2F601751%3Fdo%3Dlogin" class="s4" hidefocus="true" rel="nofollow">登录</a> 或 <a href="https://account.aliyun.com/register/register.htm?from_type=yqclub&oauth_callback=https%3A%2F%2Fyq.aliyun.com%2Farticles%2F601751%3Fdo%3Dlogin" target="_blank" class="s4" hidefocus="true" rel="nofollow">注册</a></div>
</div><!-- /.editor -->
</div>
<div class="form-group text-right">
<a href="#modal-login" class="comment_button" data-toggle="modal">评论</a>
</div>
</form>
</section>
</div>