dubbo+zookeeper+springboot学习demo

dubbo+zookeeper+springboot

  微服务下有provider和consumer,消息生产者提供api,供消费者调用。

1、创建父项目

  idea创建springboot工程,作为父级工程,所以删掉无用的文件,只保留.idea和pom.xml,在pom.xml中引入项目所需的依赖:

		<!-- https://mvnrepository.com/artifact/com.gitee.reger/spring-boot-starter-dubbo -->
        <dependency>
            <groupId>com.gitee.reger</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.1.3</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.6.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.11</version>
        </dependency>

  注意:zookeeper包和zkclient包都不能少

    缺少zookeeper的pom依赖会报错:java.lang.NoClassDefFoundError: org/apache/zookeeper/Watcher E v e n t Event EventKeeperState

    缺少zkclient的pom依赖会报错:java.lang.NoClassDefFoundError: org/I0Itec/zkclient/IZkStateListener

2、创建provider模块

  在父项目下new一个maven项目provider作为生产者,并且添加两个类,一个是springboot的启动类ProviderApplication.java,另一个是提供api服务的service类MessageApiServiceImpl.java

package com.jinbin;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) throws InterruptedException {
        SpringApplication.run(ProviderApplication.class, args);
    }
}
package com.jinbin.service;

import com.alibaba.dubbo.config.annotation.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service()  //注意:这里的service是dubbo的注解com.alibaba.dubbo.config.annotation.Service
public class MessageApiServiceImpl implements MessageApiService {
    private final static Logger logger = LoggerFactory.getLogger(MessageApiServiceImpl.class);
    @Override
    public String getMessage(String message) {
        logger.info("这是服务提供者, 服务消费者远程调用了getMessage(), 参数为message={}", message);
        return "这是服务提供者, 服务消费者远程调用了getMessage(), 参数为message="+message;
    }
}

  说明:该类实现的 BookService 接口,目的是模块与模块之间解耦,单独建一个接口模块 interface,详见4
  provoder的配置文件中配置zookeeper注册中心的 ip+port

server:
  port: 8081  #tomcat 启动端口号
spring:
  dubbo:
    application:
      name: service-provider
    base-package: com.jinbin.service  	   # dubbo服务发布者实现类注解所在的包
    registry:
      address: 127.0.0.1                   # zookeeper注册中心的地址
      port: 2181                           # zookeeper注册中心的端口
    protocol:
      name: dubbo
    provider:
      retries: 0                    # 服务调用重试次数,服务发布者不给重试,让服务调用者自己重试

3、创建consumer模块

  在父项目下new一个maven项目consumer作为消费者,并且添加两个类,一个是springboot的启动类ConsumerApplication.java,另一个是接口类MessageApiController.java,调用生产者的服务。

package com.jinbin;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 实现CommandLineRunner这个接口是为了重写它的run方法,
 * 启动完成以后会自动执行run方法的内容。
 */
@SpringBootApplication
public class ConsumerApplication implements CommandLineRunner {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.err.println("服务调用者------>>启动完毕");
    }

}

package com.jinbin.controller;

import com.jinbin.service.MessageApiService;
import com.reger.dubbo.annotation.Inject;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Component
public class MessageApiController implements CommandLineRunner {

//    @Reference()   //远程调用
//    public MessageApiService service;

    // 使用兼容注入,可以使用dubbo原生注解@Reference注入
    @Inject
    public MessageApiService service;
    @Override
    public void run(String... args){
        String message="初始message";
        System.out.println(service.getMessage(message));
        System.out.println("调用完成");
    }

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String getMessage(String message){

        message = message== null ? "初始message" : message;

        return service.getMessage(message);
    }

}

  consumer的配置文件中配置zookeeper注册中心的 ip+port

server:
  port: 8082 #tomcat端口号
spring:
  dubbo:
    application:
      name: service-consumer
    base-package: com.jinbin  # dubbo服务发布者实现类注解所在的包
    registry:
      address: 127.0.0.1                   # zookeeper注册中心的地址
      port: 2181                           # zookeeper注册中心的端口
    protocol:
      name: dubbo           
    provider:
      retries: 0                 # 服务调用重试次数,服务发布者不给重试,让服务调用者自己重试

4、interface模块

  该模块只用于解耦,定义一些接口,由provider模块实现,例如

package com.jinbin.service;

public interface MessageApiService {
    String getMessage(String message);
}

5、zookeeper下载启动

在这里插入图片描述

  下载bin的压缩包并解压,在bin目录下有zkServer.cmd和zkServer.sh,分别是win和linux下的启动脚本,启动

  -启动闪退:打开启动脚本,左后一行添加pause即可

  -报错:zookeeper需要读取conf下的配置文件zoo.cfg

在这里插入图片描述

    解决:将conf/zoo_sammple.cfg复制为zoo.cfg,修改其中的配置,一般仅需修改dataDir,例如修改为dataDir=E:\JAVA\zookeeper\apache-zookeeper-3.5.8-bin\data

  -启动成功

在这里插入图片描述

6、项目启动

  依次启动provider模块和consumer模块

在这里插入图片描述

在这里插入图片描述

  在浏览器访问 http://127.0.0.1:8082?name=hello dubbo

在这里插入图片描述

7、负载均衡

  借助zookeeper实现的负载均衡,只需启动多个服务生产者即可

在这里插入图片描述

在这里插入图片描述

  启动两个ProviderApplication,一个端口为8081,另一个为8083,启动一个ConsumerApplication,端口为8082

  为了验证负载均衡是否成功,对ProviderApplication中的service修改为:

package com.jinbin.service;

import com.alibaba.dubbo.config.annotation.Service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

@Service()  //注意:这里的service是dubbo的注解com.alibaba.dubbo.config.annotation.Service
public class MessageApiServiceImpl implements MessageApiService {
    private final static Logger logger = LoggerFactory.getLogger(MessageApiServiceImpl.class);

    @Value("${server.port}")
    private String port;
    @Override
    public String getMessage(String message) {
        logger.info("这是服务提供者, port={}, 服务消费者远程调用了getMessage(), 参数为message={}", port, message);
        return "这是服务提供者, port=" + port + ", 服务消费者远程调用了getMessage(), 参数为message="+message;
    }
}

  在浏览器访问 http://127.0.0.1:8082

在这里插入图片描述

  关闭8081端口对应的服务之后再访问,port变为8083
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot是一个开源的Java框架,用于快速构建独立的、基于Spring的应用程序。它简化了Spring应用程序的配置和部署过程,并提供了许多嵌入式服务器,如Tomcat、Jetty等。Spring Boot还提供了自动配置的特性,可以根据类路径中的依赖自动配置Spring应用程序。 Dubbo是一款高性能的分布式服务框架,也是阿里巴巴开源的项目。它提供了服务治理、远程通讯和分布式调用等功能,帮助开发人员轻松构建分布式服务化的应用。 Zookeeper是一个开源的分布式协调服务,可以用于实现分布式应用程序的一致性和可靠性。它提供了一个类似于文件系统的层次化的命名空间,并允许开发人员注册、协调和共享各种资源,如配置信息、服务注册和发现等。 当使用Spring Boot结合DubboZookeeper时,可以构建一个高性能、可扩展和可靠的微服务架构。Spring Boot提供了便利的开发和部署方式,Dubbo提供了分布式服务框架的支持,而Zookeeper则提供了分布式协调服务。开发人员可以使用Spring Boot快速构建独立的微服务应用程序,使用Dubbo进行服务间的通信和管理,同时通过Zookeeper进行服务的注册和发现。这样的架构可以方便地实现微服务架构中的资源共享和服务治理等功能,大大简化了开发人员的负担。 综上所述,Spring Boot结合DubboZookeeper可以构建高效、可靠的微服务架构,并提供了便利的开发和部署方式,帮助开发人员构建高性能的分布式应用程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值