Dubbo分布式开发之HelloWorld

本篇将介绍创建一个zookeeper+dubbo+springboot的基础项目,以演示分布式应用开发的一个过程。

这里共有三个子项目:

  1. 服务接口项目
  2. 服务提供者项目
  3. 服务消费者项目

dubbo项目的github地址;
dubbo示例项目的github地址
Dubbo分布式开发之HelloWorld_第1张图片
在开始之前,请确保您的zookeeper集群已经部署完成,这里,笔者采用docker-compose的方式进行部署,三个zookeeper服务器的地址分别为192.168.137.118:2181、192.168.137.118:2182和192.168.137.118:2183。

1.创建服务接口项目

创建一个普通的Maven项目,定义用户服务的API接口。这里项目的GroupId为com.funt,ArtifactId为hello-dubbo-service-user-api

接着,根据命名规范,创建一个包com.funt.hello.dubbo.service.user.api,并创建UserService接口。

package com.funt.hello.dubbo.service.user.api;

public interface UserService {
    String sayHi();
}

为了让服务提供者项目找到该项目,需要将该项目安装到本地仓库,即执行mvn clean install
Dubbo分布式开发之HelloWorld_第2张图片

2.创建服务提供者项目

通过Spring初始化器创建一个SpringBoot项目。实现用户服务的接口。这里项目的GroupId为com.funt,ArtifactId为hello-dubbo-service-user-provider。这是一个简单的JavaSE项目,因此不需要引入web依赖。



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.1.RELEASE
         
    
    com.funt
    hello-dubbo-service-user-provider
    1.0.0-SNAPSHOT
    hello-dubbo-service-user-provider
    Demo project for Spring Boot

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        

        
        
            org.springframework.boot
            spring-boot-starter-actuator
            1.3.2.RELEASE
        
        
		
        
            org.apache.curator
            curator-framework
            2.12.0
        


        
        
            org.apache.dubbo
            dubbo-spring-boot-starter
            2.7.5
        

        
        
            com.funt
            hello-dubbo-service-user-api
            1.0.0-SNAPSHOT
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

    
        
            apache.snapshots.https
            Apache Development Snapshot Repository
            https://repository.apache.org/content/repositories/snapshots
            
                false
            
            
                true
            
        
    

提供接口实现类

package com.funt.hellodubboserviceuserprovider.api.impl;

import com.funt.hello.dubbo.service.user.api.UserService;
import org.apache.dubbo.config.annotation.Service;

@Service(version = "1.0.0")
public class UserServiceImpl implements UserService {
    @Override
    public String sayHi() {
        return "hello dubbo";
    }
}

在Application类的Main入口中加入代码Main.man(args);,在dubbo容器中启动一个服务提供者。
Dubbo分布式开发之HelloWorld_第3张图片
这里使用yaml的方式配置springboot和dubbo。

spring:
  application:
    name: hello-dubbo-service-user-provider

user:
  service:
    version: 1.0.0

# dubbo组件默认不会被springboot扫描,因此,这里需要配置dubbo的组件扫描
dubbo:
  scan:
    basePackages: com.funt.hello.dubbo.service.user.provider.api
  application:
    id: hello-dubbo-service-user-provider
    name: hello-dubbo-service-user-provider
    qos-port: 22222
    qos-enable: true
  protocol:
    id: dubbo
    name: dubbo
    port: 12345
    status: server
  registry:
    id: zookeeper
    address: zookeeper://192.168.137.118:2181?backup=192.168.137.118:2182,192.168.137.118:2183
    timeout: 10000
  config-center:
  	# dubbo的config-center配置中心,默认的获取配置的超时时间是3秒钟。在项目的配置文件中修改一下这个时间为10秒。
    timeout: 10000
management:
  endpoint:
    dubbo:
      enabled: true
    dubbo-shutdown:
      enabled: true
    dubbo-config:
      enabled: true
    dubbo-services:
      enabled: true
    dubbo-references:
      enabled: true
    dubbo-properties:
      enabled: true
  health:
    dubbo:
      status:
        defaults: memory
        extras: load,threadpool

此时,管理后台可以看到已经启动的服务,代表服务已经上线。
Dubbo分布式开发之HelloWorld_第4张图片
服务关闭后,过一段时间,可以看到管理后台中的服务已经下线。

3.创建服务消费者项目

创建一个SpringBoot Web项目,除了starter改为spring-boot-starter-web,其他的依赖和服务提供者一样。



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.3.1.RELEASE
         
    
    com.funt
    hello-dubbo-service-user-consumer
    1.0.0-SNAPSHOT
    hello-dubbo-service-user-consumer
    Demo project for Spring Boot

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-web
            2.2.6.RELEASE
        


        
        
            org.springframework.boot
            spring-boot-starter-actuator
            1.3.2.RELEASE
        

        
        
            org.apache.curator
            curator-recipes
            2.12.0
        

        
        
            org.apache.dubbo
            dubbo-spring-boot-starter
            2.7.5
        

        
        
            com.funt
            hello-dubbo-service-user-api
            1.0.0-SNAPSHOT
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


dubbo扫描的basePackage需要改为com.funt.hello.dubbo.service.user.consumer.controller,另外,因为8080端口已经被占用,这里端口也需要做一下更改。其他yaml配置文件也是类似的。

spring:
  application:
    name: hello-dubbo-service-user-consumer

user:
  service:
    version: 1.0.0

# dubbo组件默认不会被springboot扫描,因此,这里需要配置dubbo的组件扫描
dubbo:
  scan:
    basePackages: com.funt.hello.dubbo.service.user.consumer.controller
  application:
    id: hello-dubbo-service-user-consumer
    name: hello-dubbo-service-user-consumer
    qos-port: 22223
    qos-enable: true
  protocol:
    id: dubbo
    name: dubbo
    port: 12345
    status: server
  registry:
    id: zookeeper
    address: zookeeper://192.168.137.118:2181?backup=192.168.137.118:2182,192.168.137.118:2183
    timeout: 10000
  config-center:
    timeout: 10000
management:
  endpoint:
    dubbo:
      enabled: true
    dubbo-shutdown:
      enabled: true
    dubbo-config:
      enabled: true
    dubbo-services:
      enabled: true
    dubbo-references:
      enabled: true
    dubbo-properties:
      enabled: true
  health:
    dubbo:
      status:
        defaults: memory
        extras: load,threadpool
server:
  port: 9090

创建UserController,通过@Reference(version = "1.0.0")注解引入依赖。

package com.funt.hello.dubbo.service.user.consumer.Controller;

import com.funt.hello.dubbo.service.user.api.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Reference(version = "1.0.0")
    private UserService userService;

    @GetMapping("/hi")
    public String sayHi(){
        return userService.sayHi();
    }
}

Dubbo分布式开发之HelloWorld_第5张图片
启动项目,可以看到服务的消费者已经注册。
Dubbo分布式开发之HelloWorld_第6张图片
这里,您可能会好奇,我好像什么都没做,为什么就可以调用服务提供者中的方法了。因为我们已经将接口定义安装到Maven本地仓库中了,因此,我们这里就已经告诉了dubbo要调用的是Userservice的sayHi方法,dubbo就会找到服务提供者实现的UserService的sayHi方法,并帮我们调用,最终将结果同步返回给我们。
Dubbo分布式开发之HelloWorld_第7张图片

你可能感兴趣的:(分布式技术)