SpringBoot2整合dubbo2.7

1 篇文章 0 订阅
1 篇文章 0 订阅

背景:微服务项目中整合dubbo框架,实现PRC与Rest的方式调用,本文是针对dubbo接口的rest方式调用实例。参考开源项目spring-cloud-alibaba。

step 1、添加依赖

    <properties>
        <nacos.version>2.0.2</nacos.version>
        <dubbo.version>2.7.12</dubbo.version>
        <jw.rs.version>2.0</jw.rs.version>
    </properties>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
        </dependency>
       <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-rpc-rest</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>jboss-jaxrs-api_2.0_spec</artifactId>
                    <groupId>org.jboss.spec.javax.ws.rs</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
        </dependency>
               <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>
        <!--服务注册-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

step 2、dubbo配置

dubbo:
  registry:
    address: nacos://192.168.40.121:8848
    #address: spring-cloud://localhost
  application:
    name: dubbo-server
  config:
    multiple: true
  protocols:
    dubbo:
      name: dubbo
      port: 20805
      #server: netty4
    rest:
      name: rest
      server: tomcat
      port: 20866

step 3、定义接口

public interface RpcService {
    String sayHello(String name);
    
    TestObj getTestObj();

    TestObj getTestObjByForm(String code, String message);
    
    TestObj getTestObjByFormBean(TestObj test);
    
    String param(String param);

    String params(int a, String b);

    String headers(String header, String header2, Integer param);

    String pathVariables(String path1, String path2, String param);

    String form(String form);

    User requestBodyMap(Map<String, Object> data, String param);

    Map<String, Object> requestBodyUser(User user);

}

step 4、实现接口

@DubboService(version = "1.8")
@Slf4j
@Path("/rpc")
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
public class RpcServiceImpl implements RpcService {
    @Override
    @Path("/hello")
    @GET
    @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
    public String sayHello(@QueryParam("name") String name) {
        return name + "";
    }

    @Override
    @Path("/test")
    @GET
    @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
    public TestObj getTestObj() {
        return null;
    }

    @Override
    @Path("/form")
    @POST
    @Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
    public TestObj getTestObjByForm(@FormParam("code") String code, @FormParam("message") String message
    ) {
        return new TestObj();
    }
    @Override

    @Path("/formBean")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public TestObj getTestObjByFormBean(TestObj testObj) {
        TestObj test=new TestObj();
        return null;
    }   

    @Override
    @Path("/formPost")
    @POST
    public String formPost(String name) {
        return name;
    }

        @Override
    @Path("/param")
    @GET
    public String param(@QueryParam("param") String param) {
        log.info("/param", param);
        return param;
    }

    @Override
    @Path("/params")
    @POST
    public String params(@QueryParam("a") int a, @QueryParam("b") String b) {
        log.info("/params", a + b);
        return a + b;
    }

    @Override
    @Path("/headers")
    @GET
    public String headers(@HeaderParam("h") String header,
                          @HeaderParam("h2") String header2, @QueryParam("v") Integer param) {
        String result = header + " , " + header2 + " , " + param;
        log.info("/headers", result);
        return result;
    }

    @Override
    @Path("/path-variables/{p1}/{p2}")
    @GET
    public String pathVariables(@PathParam("p1") String path1,
                                @PathParam("p2") String path2, @QueryParam("v") String param) {
        String result = path1 + " , " + path2 + " , " + param;
        log.info("/path-variables", result);
        return result;
    }

    @Override
    @Path("/request/body/map")
    @POST
    @Produces(APPLICATION_JSON_VALUE)
    public User requestBodyMap(Map<String, Object> data,
                               @QueryParam("param") String param) {
        User user = new User();
        user.setId(((Integer) data.get("id")).longValue());
        user.setName((String) data.get("name"));
        user.setAge((Integer) data.get("age"));
        log.info("/request/body/map", param);
        return user;
    }

    @Path("request/body/user")
    @POST
    @Override
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Map<String, Object> requestBodyUser(User user) {
        Map<String, Object> map = new HashMap<>();
        map.put("id", user.getId());
        map.put("name", user.getName());
        map.put("age", user.getAge());
        return map;
    }
}


step 5、编写启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableDubbo(scanBasePackages = {"com.test.core","com.test.service.impl"})
public class DubboApplication{
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DubboApplication.class, args);

    }
}

测试时遇到的问题与注意事项:
1、服务返回值为NULL,请求状态码为204。
2、注意GET、POST注解是否为ws包下的注解。
3、注意@Produces、@Consumes的使用场景。可能会出现Could not find MessageBodyWriter for response object of type: com.test.service.impl.Test of media type: application/octet-stream
4、object is not an instance of declaring class
5、No resource method found for POST, return 405 with Allow header

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值