dubbo rest 配置

dubbo 2.6.0 之后 支持rest访问格式

支持标准的 JAX-RS 请参阅相关文档

pom.xml 参照官方的jar版本

https://github.com/apache/incubator-dubbo/blob/master/dependencies-bom/pom.xml
    <properties>
        <resteasy_version>3.0.19.Final</resteasy_version>
        <servlet_version>3.1.0</servlet_version>
        <jetty_version>6.1.26</jetty_version>
        <validation_version>1.1.0.Final</validation_version>
        <hibernate_validator_version>5.4.1.Final</hibernate_validator_version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.11</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>${resteasy_version}</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-client</artifactId>
            <version>${resteasy_version}</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-netty4</artifactId>
            <version>${resteasy_version}</version>
            <exclusions>
                <exclusion>
                    <groupId>io.netty</groupId>
                    <artifactId>netty-all</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jdk-http</artifactId>
            <version>${resteasy_version}</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson-provider</artifactId>
            <version>${resteasy_version}</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxb-provider</artifactId>
            <version>${resteasy_version}</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet_version}</version>
        </dependency>
        <dependency>
            <groupId>org.mortbay.jetty</groupId>
            <artifactId>jetty</artifactId>
            <version>${jetty_version}</version>
        </dependency>
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>${validation_version}</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>${hibernate_validator_version}</version>
        </dependency>
    </dependencies>

User.java

package com.yiwugou.demo.dubbo.bean;

import java.io.Serializable;

import lombok.Data;

@Data
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private String username;
    private String password;
}

dubbo-demo-provider.xml

    <context:annotation-config />
    <context:component-scan base-package="com.yiwugou.demo.dubbo" />

    <dubbo:application name="dubbo-demo-provider" />
    
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
    <dubbo:protocol name="dubbo" port="-1" host="127.0.0.1" />
    <dubbo:protocol name="rest" port="8080" />
    <!-- 代表两个协议都有 dubbo 和 rest,如果只要rest dubbo 协议删掉即可 -->

    <dubbo:service interface="com.yiwugou.demo.dubbo.service.UserService" ref="userService" />

UserService.java (JAX-RS 注解推荐加载接口处)

package com.yiwugou.demo.dubbo.service;

import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import com.yiwugou.demo.dubbo.bean.User;

@Path("users")
@Produces({ MediaType.APPLICATION_JSON })
public interface UserService {
    @GET
    @Path("get/{id}")
    public User get(@PathParam("id") Long id);

    @POST
    @Path("byjson")
    @Consumes({ MediaType.APPLICATION_JSON })
    public User byJson(User user);

    @POST
    @Path("byform")
    @Consumes({ MediaType.APPLICATION_FORM_URLENCODED })
    public User byForm(@FormParam("id") Long id, @FormParam("username") String username);

    @GET
    @Path("byquery")
    public User byQuery(@QueryParam("username") String username, @QueryParam("password") String password);
}

UserServiceImpl.java

package com.yiwugou.demo.dubbo.service;

import org.springframework.stereotype.Service;

import com.yiwugou.demo.dubbo.bean.User;

@Service("userService")
public class UserServiceImpl implements UserService {

    @Override
    public User get(Long id) {
        User user = new User();
        user.setUsername(id + "-get-username");
        user.setPassword(id + "-get-password");
        System.err.print(user);
        return user;
    }

    @Override
    public User byJson(User user) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public User byForm(Long id, String username) {
        User user = new User();
        user.setUsername(id + "-byForm-" + username);
        user.setPassword(id + "-byForm-password");
        System.err.print(user);
        return user;
    }

    @Override
    public User byQuery(String username, String password) {
        User user = new User();
        user.setUsername("byQuery-" + username);
        user.setPassword("byQuery-" + password);
        System.err.print(user);
        return user;
    }
}

rest 访问的路径和方法为

get 
http://127.0.0.1:8080/users/get/1234

post with body
http://127.0.0.1:8080/users/byjson
{
    username:"abcd",
    password:"1234"
}

post with form
http://127.0.0.1:8080/users/byform
username=abcd
password=1234
(html form)

get 
http://127.0.0.1:8080/users/byquery?username=abcd&password=1234

非dubbo 如何调用 dubbo-rest 以及如何负载均衡?

官方没有提供相应的rest-client,

  1. 自己写client代码
访问zk node 节点 可以得到真实服务地址与端口信息列表 然后负载均衡
(进入zookeeper 运行命令 ls /dubbo/com.yiwugou.demo.dubbo.service.UserService/providers

rest://10.6.62.155:8080/com.yiwugou.demo.dubbo.service.UserService?anyhost=true&application=dubbo-demo-provider&dubbo=2.6.1&generic=false&interface=com.yiwugou.demo.dubbo.service.UserService&methods=get,byJson,byQuery,byForm&pid=1292&side=provider&timestamp=1523410526582,
rest://10.6.62.155:8081/com.yiwugou.demo.dubbo.service.UserService?anyhost=true&application=dubbo-demo-provider&dubbo=2.6.1&generic=false&interface=com.yiwugou.demo.dubbo.service.UserService&methods=get,byJson,byQuery,byForm&pid=5296&side=provider&timestamp=1523412396290, 
) 

2 建议使用第三方rest的负载均衡
如 nginx, yiwugou homer

dubbo 调用 dubbo-rest

照常即可 我们不需要关注里面的具体协议是 dubbo 还是 rest

dubbo 调用 非dubbo-rest

~1. 可以用java代码或者采用第三方rest-client
~2.需要根据提供的 rest服务以及返回参数 自己组装类和接口

例如,我们要调用如下的外部服务
http://api.foo.com/services/users/1001
http://api.foo.com/services/users/1002

获取不同ID的用户资料,返回格式是JSON

{
    "id": 1001,
    "name": "Larry"
}
我们可根据这些信息,编写服务接口和参数类即可:

@Path("users")
public interface UserService {
    @GET
    @Path("{id : \\d+}")
    @Produces({MediaType.APPLICATION_JSON})
    User getUser(@PathParam("id") Long id);
}
public class User implements Serializable {
    private Long id;
    private String name;
}
对于spring中的配置,因为这里的REST服务不是dubbo提供的,所以无法使用dubbo的注册中心,直接配置外部REST服务的url地址即可(如多个地址用逗号分隔):

<dubbo:reference id="userService" interface="xxx.UserService" url="rest://api.foo.com/services/"/>

参考 dubbox 帮助文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容