【SpringBoot学习笔记 十四】SpringBoot+Dubbo+Zookeeper集成开发(下)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 【SpringBoot学习笔记 十四】SpringBoot+Dubbo+Zookeeper集成开发(下)

执行命令:mvn clean package -Dmaven.test.skip=true,可能会遇到标签报错问题,调整下即可

然后在控制中心执行如下命令:

cd dubbo-admin-distribution/target
//因为我们生成的版本为0.3.0,所以命令如下
java -jar dubbo-admin-0.3.0.jar

命令执行后dubbo服务启动,我们再将zookeeper服务启动后注册中心才可用:

我们访问地址http://localhost:7001/,结果如下:

输入配置文件中的账号密码即可登录:

3 创建服务提供者模块

首先我们创建一个服务提供者,也就是服务生产者模块。

选择如下依赖即可:

1 pom.xml依赖

在pom.xml文件中配置坐标如下:

<dependencies>
        <!--导入Dubbo依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--导入zookeeper依赖-->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!--引入zookeeper-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <!--解决 java.lang.NoClassDefFoundError: org/apache/curator/framework/recipes/cache/TreeCacheListener-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-common</artifactId>
            <version>2.7.12</version>
        </dependency>
    </dependencies>

2 生产者Dubbo配置

在配置文件中进行Dubbo的配置

application.yml

server:
  port: 8081 # 服务端口
dubbo:
  application:
    name: provider-server # 注册服务应用名字
  scan:
    base-packages: com.example.providerserver.service # dubbo服务发布者所在的包
  registry:
    address: 127.0.0.1:2181 # zookeeper注册中心的地址
    protocol: zookeeper
  protocol:
      name: dubbo
      port: 20880

3 接口服务代码配置

BookService

package com.example.providerserver.service;
public interface BookService {
    String getBookByUserId(Integer id);
}

BookServiceImpl

package com.example.providerserver.service;
import org.springframework.stereotype.Component;
import org.apache.dubbo.config.annotation.Service;
@Service // dubbo的注解,可以被扫描到,在项目一启动就自动注册到注册中心
@Component
public class BookServiceImpl implements BookService {
    @Override
    public String getBookByUserId(Integer id) {
        if(id==1){
            return "tml很帅,他喜欢《围城》";
        }
        return "查无此人";
    }
}

创建完成后整体布局如下:

4 创建服务消费者模块

首先我们创建一个服务消费者模块:

选择如下依赖即可:

1 pom.xml

在pom.xml中配置坐标如下,和生产者的依赖一样:

<dependencies>
        <!--导入依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--zkclient-->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!--解决日志冲突-->
        <!--引入zookeeper-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <!--解决 java.lang.NoClassDefFoundError: org/apache/curator/framework/recipes/cache/TreeCacheListener-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>provider-server</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

2 消费者Dubbo配置

在配置文件中进行Dubbo的配置

server:
  port: 8082
dubbo:
  application:
     name: consumer-server
  registry:
    address: 127.0.0.1:2181 # zookeeper注册中心的地址
    protocol: zookeeper
  protocol:
    name: dubbo
    port: 20880

3 消费者接口代码配置

本来正常步骤是需要将服务提供者的接口打包,然后用pom文件导入,我们这里使用简单的方式,直接将服务的接口拿过来,路径必须保证正确,即和服务提供者相同

UserInfoService

package com.example.consumerserver.service;
public interface UserInfoService {
    String getBook();
}

UserInfoServiceImpl

package com.example.consumerserver.service;
import com.example.providerserver.service.BookService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
@Service
public class UserInfoServiceImpl implements UserInfoService {
    @Reference
    BookService bookService; //远程引用指定的服务,按照全类名进行匹配,看谁给注册中心注册了这个全类名
    @Override
    public String getBook() {
        String bookName = bookService.getBookByUserId(1);
        System.out.println("在注册中心买到"+bookName);
        return bookName;
    }
}

UserController

package com.example.consumerserver.controller;
import com.example.consumerserver.service.UserInfoService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class UserController {
    @Resource
    UserInfoService userInfoService;
    @GetMapping("/userinfo")
    public String userinfo(){
       String book= userInfoService.getBook();
       return book;
    }
}

创建完成后整体布局如下:

5 测试Dubbo远程RPC调用

按照如下步骤进行测试,首先我们整体看下模块划分如下:整体模块划分如下

1 开启zookeeper

直接双击zkServer.cmd即可

2 打开dubbo-admin实现监控

我们先启动监控服务:

然后访问网址:http://localhost:7001/

3 启动服务者

然后我们启动服务者:

4 启动消费者

启动完服务者后,我们再启动下消费者:

5 页面请求测试

我们访问消费者的Controller,间接的调用远程服务:

同时观察dubbo-admin也体现出了注册信息:

服务关系:

总结一下

花了很长的篇幅和时间来学习关于分布式架构、集群、分布式理论,再到RPC调用方式,具体到Dubbo如何实现分布式的RPC调用。然后又以SpringBoot为核心,zookeeper为注册中心,Dubbo为RPC框架实践了一把Dubbo的调用方式,总算搞清楚了Dubbo的作用机制和使用方式,说白了RPC就是大家把服务都注册到一个注册中心,然后通过注册中心远程调用自己想要调用的资源,Dubbo让这看起来就像你在本地调用一样。其实Dubbo这种RPC调用和HTTP调用实现目的是类似的,但是Dubbo因为使用的是 TCP/IP是传输层协议,所以要比 HTTP协议包装一层一般而言要快些。有个比较形象的例子:

  • HTTP,讲普通话,好处就是谁都听得懂,谁都会讲。
  • RPC,讲黑话,好处是可以更精简、更加保密、更加可定制,坏处就是要求“说”黑话的那一方(client端)也要懂,而且一旦大家都说一种黑话了,换黑话就困难了

目前对于分布式的架构来说,用RPC方式的Dubbo比HTTP的会多一些,HTTP通常用作对外提供服务。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
24天前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
40 2
|
10天前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
26 1
|
1月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
79 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
30天前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
48 0
|
1月前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
115 0
|
2月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
150 0
|
3月前
|
开发者 存储 API
Xamarin 云服务集成竟然如此强大,简化后端开发不再是梦,数据存储、用户认证、推送通知全搞定!
【8月更文挑战第31天】Xamarin 是一款强大的跨平台移动应用开发工具,通过与云服务集成,显著简化了后端开发。开发者无需自行搭建服务器,即可利用云服务提供的数据存储、用户认证、推送通知等功能,大幅减少数据库设计、服务器配置及 API 开发的时间成本。借助 Azure Mobile Apps 等云服务,Xamarin 可轻松实现数据存取操作,同时增强应用安全性与用户参与度,使开发者更专注于业务逻辑和用户体验,提升开发效率并降低成本。这种方式在快速发展的移动应用领域极具价值。
58 0
|
3月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
194 0
|
3月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
45 0
|
3月前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
62 0