springboot下使用dubbo的简单demo

1.一些话

  现在java后端开发大多用springboot来简化环境搭建,现在一直使用的是springcloud和k8s有关的东西,以前用过dubbo,但那会儿的开发环境搭建流程较为繁琐,而且不支持rest调用。现在简化了不少搭了一下之后发现确实比以前要方便很多了。dubbo由于是rpc调用的,速度上来说是肯定比springcloud要快一些的,不过现在也支持rest调用了,案例中两种方式都会有。不过springcloud感觉各方面的支持来说要更友好一些,所以各有千秋吧。

2.环境准备

  2.1 搭建nacos注册中心

  教程连接  https://nacos.io/zh-cn/docs/quick-start.html 

  根据连接中的地址教程搭建即可,然后访问对应的地址http://localhost:8848/nacos/index.html#/login 

  将地址端口换为设置的即可,如果初夏如下界面代表成功,账号密码默认为nacos/nacos

  

  2.2ide直接新建maven项目 dubbo-service

   

   点击finish即可完成创建

2.3 创建common-api  provider   consumer三个模块分别为公用api接口,服务提供方,服务调用方

 点击新建module即可完成创建 具体创建过程略。。可到文末的源码地址下载查看具体项目,创建完的项目如下即可

  

3.引入依赖 

只需要在dubbo-service中引入依赖即可,下面的module模块会继承依赖,即dubbo-service的pom.xml文件如下所示

记住不能使用springboot太高的版本,因为目前是不支持tomcat9的。高版本的springboot会嵌入tomcat9进去

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <project xmlns="http://maven.apache.org/POM/4.0.0"
  3          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5     <modelVersion>4.0.0</modelVersion>
  6     <packaging>pom</packaging>
  7     <modules>
  8         <module>common-api</module>
  9         <module>provider</module>
 10         <module>consumer</module>
 11     </modules>
 12     <parent>
 13         <groupId>org.springframework.boot</groupId>
 14         <artifactId>spring-boot-starter-parent</artifactId>
 15         <version>2.0.6.RELEASE</version>
 16         <relativePath/> <!-- lookup parent from repository -->
 17     </parent>
 18     <groupId>com.dubbo</groupId>
 19     <artifactId>dubbo-service</artifactId>
 20     <version>1.0-SNAPSHOT</version>
 21 
 22     <properties>
 23         <java.version>1.8</java.version>
 24         <nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
 25         <netty-all.version>4.0.35.Final</netty-all.version>
 26     </properties>
 27 
 28     <dependencies>
 29         <!--springboot有关-->
 30         <dependency>
 31             <groupId>org.springframework.boot</groupId>
 32             <artifactId>spring-boot-starter-actuator</artifactId>
 33         </dependency>
 34         <dependency>
 35             <groupId>org.springframework.boot</groupId>
 36             <artifactId>spring-boot-starter</artifactId>
 37         </dependency>
 38         <dependency>
 39             <groupId>org.springframework.boot</groupId>
 40             <artifactId>spring-boot-starter-web</artifactId>
 41         </dependency>
 42         <dependency>
 43             <groupId>org.springframework.boot</groupId>
 44             <artifactId>spring-boot-starter-test</artifactId>
 45             <scope>test</scope>
 46         </dependency>
 47 
 48         <!--dubbo有关-->
 49         <dependency>
 50             <groupId>com.alibaba</groupId>
 51             <artifactId>dubbo-registry-nacos</artifactId>
 52             <version>2.6.6</version>
 53         </dependency>
 54         <dependency>
 55             <groupId>com.alibaba.nacos</groupId>
 56             <artifactId>nacos-client</artifactId>
 57             <version>0.6.2</version>
 58         </dependency>
 59         <dependency>
 60             <groupId>com.alibaba</groupId>
 61             <artifactId>dubbo-common</artifactId>
 62             <version>2.6.6</version>
 63         </dependency>
 64         <dependency>
 65             <groupId>com.alibaba</groupId>
 66             <artifactId>dubbo-registry-api</artifactId>
 67             <version>2.6.6</version>
 68         </dependency>
 69         <dependency>
 70             <groupId>com.alibaba</groupId>
 71             <artifactId>dubbo</artifactId>
 72             <version>2.6.6</version>
 73         </dependency>
 74         <dependency>
 75             <groupId>com.alibaba.boot</groupId>
 76             <artifactId>dubbo-spring-boot-starter</artifactId>
 77             <version>0.2.1.RELEASE</version>
 78         </dependency>
 79         <dependency>
 80             <groupId>com.alibaba.boot</groupId>
 81             <artifactId>dubbo-spring-boot-autoconfigure</artifactId>
 82             <version>0.2.1.RELEASE</version>
 83         </dependency>
 84         <dependency>
 85             <groupId>io.netty</groupId>
 86             <artifactId>netty-all</artifactId>
 87             <version>${netty-all.version}</version>
 88         </dependency>
 89         <!--公用api-->
 90         <dependency>
 91             <groupId>com.dubbo</groupId>
 92             <artifactId>common-api</artifactId>
 93             <version>1.0-SNAPSHOT</version>
 94         </dependency>
 95         <!-- rest有关 -->
 96         <dependency>
 97             <groupId>org.jboss.resteasy</groupId>
 98             <artifactId>jaxrs-api</artifactId>
 99             <version>3.0.12.Final</version>
100         </dependency>
101         <dependency>
102             <groupId>org.jboss.resteasy</groupId>
103             <artifactId>resteasy-client</artifactId>
104             <version>3.0.12.Final</version>
105         </dependency>
106 
107     </dependencies>
108 
109     <build>
110         <plugins>
111             <plugin>
112                 <groupId>org.springframework.boot</groupId>
113                 <artifactId>spring-boot-maven-plugin</artifactId>
114             </plugin>
115         </plugins>
116     </build>
117 
118 </project>

  这儿注意在dubbo-service中引入了自己创建的common-api 这样的话provider和consumer项目都可以直接调用

4. common-api添加公用接口

 

  UserDTO为测试传输类

public class UserDTO implements Serializable {

    private String username;

    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "UserDTO{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

  UserService为公用api接口

public interface UserService {

    UserDTO getUserById( String id);
}

5.provider模块

该模块为服务提供方,因此需要实现公用api中的类,服务结构如下

   application.yml配置文件如下 注册中心地址根据自己配置的进行配置(使用zookeeper的同学不要直接copy着用。。) 这儿配置的支持dubbo协议与rest协议两种主流的用法
dubbo:
  application:
    name: user-provider
    id: user-provider
  registry:
    address: nacos://127.0.0.1:8848
  protocols:
    dubbo:
      name: dubbo
      port: -1
      server: tomcat
    rest:
      name: rest
      port: 8888
      server: tomcat
spring:
  application:
    name: provider-demo
  main:
    allow-bean-definition-overriding: true
server:
  port: 8085
  springboot的启动类 ProviderApplication.java类代码如下  @EnableDubbo记得开启
@SpringBootApplication
@EnableDubbo
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class,args);
    }
}
  服务实现类UserServicImpl  此处实现的是公用api里面的接口 (仔细看好每个注解在哪个包下 不要瞎引 尤其是@Service)
package com.dubbo.provider.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import dubbo.api.UserService;
import dubbo.entity.UserDTO;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

/**
 * @Description:
 * @author: zhoum
 * @Date: 2019-06-26
 * @Time: 9:50
 */
@Path("/user")
@Service(protocol = {"rest","dubbo"})
public class UserServiceImpl implements UserService {
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    @GET
    @Override
    public UserDTO getUserById(@PathParam("id") String id) {
        UserDTO u= new UserDTO();
        u.setUsername("用户名:"+id);
        u.setPassword("12346");
        return u;
    }
}
  然后启动服务 ,即可在注册中心看到对应的服务已提供

  点击详情查看即可看到分别提供了dubbo协议和rest协议的服务,到此服务发布成功

6.服务消费模块 consumer

  项目结构如下

   application.yml配置如下 记住端口不要与provider重复
dubbo:
  application:
    name: user-consumer
    id: user-consumer
  registry:
    address: nacos://127.0.0.1:8848
  protocols:
    dubbo:
      name: dubbo
      port: -2
      server: tomcat
    rest:
      name: rest
      port: 8889
      server: tomcat
spring:
  application:
    name: consumer-demo
  main:
    allow-bean-definition-overriding: true
server:
  port: 8090
  ConsumerApplication.java为springboot的启动类  也记得要加@EnableDubbo注解
@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {

    public static void main(String[] args) {

        SpringApplication.run(ConsumerApplication.class,args);
    }
}
  WebConfig则用来增加配置下RestTemplate 方便等会儿的rest调用
@Configuration
public class WebConfig {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
  ConsumerContrller则是测试调用服务的类 UserService是引用的common-api里面的接口
package com.dubbo.consumer.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import dubbo.api.UserService;
import dubbo.entity.UserDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;

/**
 * @Description:
 * @author: zhoum
 * @Date: 2019-06-26
 * @Time: 9:55
 */
@RestController
@RequestMapping("/consumer")
public class ConsumerContoller {

    @Autowired
    private RestTemplate restTemplate;

    @Reference
    private UserService userService;

    @GetMapping("/user")
    public UserDTO getUser(){
     //rest方式调用 UserDTO user
= restTemplate.getForObject("http://localhost:8888/user/123" , UserDTO.class , new HashMap<>()); System.out.println(user);
     //传统方式调用 UserDTO wo
= userService.getUserById("wo"); return wo; } }
 启动consumer模块后,在注册中心查看

  到此服务提供者与消费者均正常发布

7.启动测试

  上面步骤中 两个模块都启动后调用consumer中的ConsumerController中的接口

  在浏览器中访问  http://localhost:8090/consumer/user

  

  同时控制台也打印出了

  

  到此,服务正常注册与发现,通过dubbo协议进行调用和rest调用都已经成功

猜你喜欢

转载自www.cnblogs.com/hetutu-5238/p/11089577.html