概念

dubbo也支持rest的方式调用服务,比如说有个服务他没有集成dubbo,但是他也想调用你的provider,那怎么办?他就可以用rest协议去调用

代码地址

https://gitee.com/zjj19941/ZJJ_Dubbo.git 下的 rest 项目

代码案例

provider配置文件

重点配置是:dubbo.protocols.p1 和 dubbo.protocols.p2

  1. spring.application.name=dubbo-provider-demo
  2. server.port=8081
  3. dubbo.scan.base-packages=com.zjj.provider.service
  4. dubbo.application.name=${spring.application.name}
  5. dubbo.registry.address=zookeeper://zjj101:2181
  6. # Dubbo 协议定义,这个是属于应用级别的 ,配置你这个应用 用什么协议
  7. dubbo.protocols.p1.id=dubbo-one
  8. dubbo.protocols.p1.name=dubbo
  9. dubbo.protocols.p1.port=20881
  10. dubbo.protocols.p1.host=0.0.0.0
  11. # 添加rest协议
  12. dubbo.protocols.p2.id=rest-two
  13. dubbo.protocols.p2.name=rest
  14. dubbo.protocols.p2.port=8082
  15. dubbo.protocols.p2.host=0.0.0.0

provider实现类

package com.zjj.provider.service;

import com.zjj.DemoService;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.config.annotation.Service;
import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.protocol.rest.support.ContentType;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

/**
 * 参数2 protocol代表用properties声明的 p1和p2这两个protocol ,
 * 当然你也可以用一个,
 */
@Service(version = "rest", protocol = {"p2","p1"})
@Path("demo")  //路径
public class RestDemoService implements DemoService {

    @GET  // get请求
    @Path("say") // 路径
    @Produces({ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
    @Override
    public String sayHello(@QueryParam("name") String name) {
        System.out.println("执行了rest服务" + name);

        URL url = RpcContext.getContext().getUrl();
        return String.format("%s: %s, Hello, %s", url.getProtocol(), url.getPort(), name);  // 正常访问
    }

}

启动项目开始测试

发现用postman也能调用成功. 用dubbo 的consumer也能调用成功,这个我就不演示了,自己去给代码下载下来跑起来运行下就知道结论了.

image.png