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調用都已經成功

 

最后項目的github地址為: https://github.com/hetutu5238/zmc-dubbo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM