Dubbo基本用法-Dubbo Provider配置

Dubbo基本用法-Dubbo Provider配置

中间件小哥 2018-06-12 20:44:41 浏览939 评论0
</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/>参数配置用于指定方法参数配置

undefined

配置之间关系图
配置项详解
  • <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
callbackscallback实例的限制
generic泛化调用,可以绕过
classService的实现的类名
connections这个服务里的连接数
delay发布服务延迟的毫秒数
executes服务执行的请求上限
retries超时重试次数
timeout调用超时时间

其他配置属性请参考xsd:http://dubbo.apache.org/schema/dubbo/dubbo.xsd

  • <dubbo:method/>作为<dubbo:service/>的子元素,它可以针对方法进行配置。比较常用的属性有:
属性名说明
executes服务执行的请求上限
retries超时重试次数
timeout调用超时时间

其他属性,可以参考上面的xsd。

配置的覆盖关系

undefined

配置的覆盖关系图

这里的覆盖关系包含了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等价于
覆盖策略

undefined

  • JVM 启动 -D 参数优先,这样可以使用户在部署和启动时进行参数重写,比如在启动时需改变协议的端口。
  • XML 次之,如果在 XML 中有配置,则 dubbo.properties 中的相应配置项无效。
  • Properties 最后,相当于缺省值,只有 XML 没有配置时,dubbo.properties 的相应配置项才会生效,通常用于共享公共配置,比如应用名。

注意:

  1. 如果 classpath 根目录下存在多个 dubbo.properties,比如多个 jar 包中有 dubbo.properties,Dubbo 会任意加载,并打印 Error 日志,后续可能改为抛异常。 ↩
  2. 协议的 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">
            本文为云栖社区原创内容,未经允许不得转载,如需转载请发送邮件至yqeditor@list.alibaba-inc.com;如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
        </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;">
            【云栖快讯】诚邀你用自己的技术能力来用心回答每一个问题,通过回答传承技术知识、经验、心得,问答专家期待你加入!&nbsp;&nbsp;<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&amp;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&amp;key=36bed36de15cad4662edce7329ba29b6d70cdc28&amp;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&amp;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&amp;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>
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您想在实体类中的serviceName字段中存储列表中的appName字段值,可以使用字符串类型的字段,并在字段上使用逗号等分隔符将不同的appName字段值分隔开。具体的实现步骤如下: 1. 在实体类中定义一个字符串类型的字段,用于存储多个appName字段值,如下所示: ``` private String serviceName; ``` 2. 在保存实体对象之前,遍历列表中的每个元素,将appName字段值拼接成一个字符串,并赋值给serviceName字段,如下所示: ``` List<Map<String, String>> list = // 获取包含appName字段的列表 StringBuilder sb = new StringBuilder(); for (Map<String, String> map : list) { String appName = map.get("appName"); sb.append(appName).append(","); } String serviceNames = sb.substring(0, sb.length() - 1); YourEntity entity = new YourEntity(); entity.setServiceName(serviceNames); // 保存实体对象到数据库中 ``` 在这个例子中,我们首先获取包含appName字段的列表,然后遍历列表中的每个元素,将它们的appName字段值拼接成一个字符串,最后将这个字符串赋值给实体对象的serviceName字段。 3. 在获取实体对象时,将serviceName字段的值分隔开,并将每个appName字段值存储到相应的字段中,如下所示: ``` YourEntity entity = // 从数据库中获取实体对象 String[] serviceNames = entity.getServiceName().split(","); List<String> appNames = Arrays.asList(serviceNames); ``` 在这个例子中,我们首先从数据库中获取实体对象,然后使用split()方法将serviceName字段的值按照逗号分隔开,得到一个字符串数组。最后,我们可以将数组中的每个元素赋值给一个列表,其中每个元素为一个appName字段值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值