Dubbo入门直接上手,结合微服务详解

Dubbo

高性能、轻量级的 Java RPC 框架

RPC : Remote Procedure Call 远程过程调用,简单来说就是它允许一个计算机程序通过网络请求调用另一个计算机上的程序,就像本地调用一样。有非常多的协议和技术来都实现了RPC的过程,比如:HTTP REST风格,Java RMI规范、WebService SOAP协议、Hession等等。

Dubbo架构

节点角色说明:

Provider:暴露服务的服务提供者 (就是你每个大功能类单独一个模块)

Container:服务运行容器

Consumer:调用远程服务的服务消费者 (这里一般是web或者网关gateway)

Registry:服务注册与发现的注册中心

Monitor:统计服务的调用次数和调用时间的监控中心

调用流程:
  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。(你可以在自己的注册中心中,看到对应的配置)
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo实用

你需要有服务提供者模块和服务消费者模块

1.首先需要一个可用的注册中心 Zookeeper,Nacos,Redis 均可。(这里使用Nacos)

2.新建一个maven工程,添加如下依赖

xml 复制代码
		<!-- registry dependency -->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>${nacos.version}</version>
        </dependency>

        <!-- dubbo dependency-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

3.你需要给服务提供者模块和服务消费者模块提供对应的配置,这样才能实现去注册中心注册和调用服务。对应着每个模块来设置,不过记得注册中心地址要填同一个;要不然怎么去找服务。

yaml 复制代码
# 提供者
dubbo:
  application:
    name: provider
  protocol:
    name: dubbo
    port: -1
  # 注册中心  
  registry:
    address: nacos://your.nacos.address:8848
    username: nacos
    password: nacos

其实,可以这样理解:

  • 网关 = 服务消费者
  • 其他的功能模块 = 服务提供者

消费者调用提供者的服务,比如登录功能:

网关(消费者)写一个登录接口,然后使用 @DubboReference 就可以实现远程注入,即可像调用本地方法一样调用远程服务了。代替以前的@autowired

java 复制代码
@DubboReference(interfaceClass = UserService.class)
    private UserService userService;

登录模块UserCenter(提供者)写一个UserServiceImpl类,来进行登陆的逻辑代码编写。实现类可以通过@DubboService(interfaceClass = UserService.class) :使用@DubboService 注解,Dubbo会将对应的服务注册到spring, 在spring启动后调用对应的服务导出方法,将服务注册到注册中心, 这样Consumer端才能发现我们发布的服务并调用。其实也就等同于以前的@Service

java 复制代码
@DubboService(interfaceClass = UserService.class)
public class UserServiceImpl implements UserService { 
}

​ 而因为会有很多个功能模块,这样子大家可能也注意到了一个问题。就是需要在两个模块都写一个service接口类,这样子的话,以后假如进行功能的添加或者修改啥的,两边都需要进行更改;很多时候不一定能统一,毕竟以后出去工作可能是一个团队一个模块。所以这个时候,我们可以添加一个公共的模块,专门用来存放服务接口的。

这里通过Maven导入即可:在消费者和提供者的POM中都导入公共模块;这样就可以解决这个问题了。

与之类似的还有一个是Java对象的传输,定义一个公共的对象模块;然后让提供者和消费者都去导入其模块即可。当然这个可以利用到Maven的传递性;你让公共服务模块导入公共对象模块,这样就可以无缝衔接了。不过对象的传输需要多注意一点,对象需要实现序列化接口 implements Serializable。dubbo 内部已经将序列化和反序列化的过程内部封装了。

这样的模块还有很多,工具模块也是;这些看你怎么搭建底层了。

这里提醒一下:

记得启动模块的时候,先启动提供者(提供者无先后顺序要求),最后在启动消费者 。毕竟服务提供者在启动时,要向注册中心注册自己提供的服务。服务消费者在启动时,向注册中心订阅自己所需的服务。然后是会有缓存机制的,就是它会将提供者的服务缓存 在消费者的本地;所以你也可以不用每次都运行提供者。但是代码改动时,就需要启动,再次进行注册。

相关推荐
书源丶8 分钟前
四十三、网络编程(下)——TCP 编程与 HTTP 入门
java·网络·tcp/ip·http
木井巳10 分钟前
【递归算法】单词搜索
java·算法·leetcode·决策树·深度优先
幸运的大号暖贴31 分钟前
解决Vibe Coding时Idea经常不自动git add问题
java·人工智能·git·intellij-idea·claudecode·opencode
m0_7162550039 分钟前
第一部分 数据开发 面试全题 模拟口述版(自问自答)
java·数据库·面试
阿里云云原生1 小时前
OpenClaw、Hermes合用?来自500+社区互动的真实看法
云原生
SuperherRo1 小时前
服务攻防-Java组件安全&FastJson&高版本JNDI&不出网C3P0&编码绕WAF&写入文件CI链
java·安全·fastjson·waf·不出网·高版本·写入文件
丑八怪大丑1 小时前
SQL数据类型
java·数据库·sql
heimeiyingwang1 小时前
【架构实战】设计一个日志分析平台(ELK架构)
elk·架构·linq
Nyarlathotep01131 小时前
并发集合类(3):LinkedBlockingQueue
java·后端
李温候1 小时前
互联网大厂Java求职者面试全攻略
java·数据库·面试·orm·构建工具·web框架·互联网大厂