Dubbo RPC-Redis协议

Redis协议

特性说明

Redis 是一个高效的 KV 存储服务器。基于 Redis 实现的 RPC 协议。

2.3.0 以上版本支持。

使用场景

缓存,限流,分布式锁等

使用方式

引入依赖

从 Dubbo 3 开始,Redis 协议已经不再内嵌在 Dubbo 中,需要单独引入独立的模块

复制代码
<dependency>
    <groupId>org.apache.dubbo.extensions</groupId>
    <artifactId>dubbo-rpc-redis</artifactId>
    <version>1.0.0</version>
</dependency>

注册 redis 服务的地址

复制代码
RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("redis://10.20.153.11/com.foo.BarService?category=providers&dynamic=false&application=foo&group=member&loadbalance=consistenthash"));

在客户端引用

不需要感知 Redis 的地址

在客户端使用:

复制代码
<dubbo:reference id="store" interface="java.util.Map" group="member" />

或者点对点直连:

复制代码
<dubbo:reference id="store" interface="java.util.Map" url="redis://10.20.153.10:6379" />

也可以使用自定义接口:

复制代码
<dubbo:reference id="store" interface="com.foo.StoreService" url="redis://10.20.153.10:6379" />

其中 "p:xxx" 为 spring 的标准 p 标签

复制代码
<dubbo:reference id="cache" interface="com.foo.CacheService" url="redis://10.20.153.10:6379" p:set="putFoo" p:get="getFoo" p:delete="removeFoo" /

spring boot + Dubbo + Redis注册中心 实现RPC调用

众所周知 dubbo推荐使用zookeeper做服务发现,但今天我们来使用另一种Redis做服务发现 这样省去了维护两种服务的经历 并且可以用作生产

POM

XML 复制代码
  <dependency>
       <groupId>com.alibaba.spring.boot</groupId>
       <artifactId>dubbo-spring-boot-starter</artifactId>
       <version>2.0.0</version>
   </dependency>
   <!--redis 依赖-->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-redis</artifactId>
   </dependency>
   
   <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
       <version>3.7</version>
   </dependency>

dubbo server

dubbo server 服务提供者 application.yml

XML 复制代码
spring:
  application:
    name: dubbo-producer
  dubbo:
    provider:
      threadpool: fixed
      threads: 2000
    application:
      id: server-producer
      name: server-producer
      qos-enable: true
      qos-port: 22222
      qos-accept-foreign-ip: false
    registry:
      # 使用redis 注册中心暴露服务地址
      address: redis://127.0.0.1:6379
    protocol:
      name: dubbo
      # 高效序列化 kryo, fst
      #用dubbo协议在20880端口暴露服务
      port: 20884
    #性能监控中心地址
    monitor:
      protocol: dubbo
      address: 127.0.0.1:7070
    scan: cn.itcast.service
server:
  port: 8888

dubbo服务提供者中创建service接口

java 复制代码
public interface IDubboDemoService {
      String helloDubbo();
  }

service接口实现

java 复制代码
import com.alibaba.dubbo.config.annotation.Service;

//@Service(version = "2.0.0")
@DubboService(version = "3.0.0", group = "dev", timeout = 5000)
public class IDubboDemoServiceImpl implements IDubboDemoService {
@Override
  public String helloDubbo() {
      return "hello dubbo, 我是提供者";
  }

}

dubbo client

dubbo client服务消费者 application.yml

XML 复制代码
spring:
application:
  name: dubbo-consumer
dubbo:
  provider:
    threadpool: fixed
    threads: 2000
  application:
    #      id: database-consumer
    name: database-consumer
  #      qos-enable: true
  #      qos-port: 33333
  #      qos-acceptforeign-ip: false
  registry:
    #使用redis注册中心暴露服务地址
    address: redis://127.0.0.1:6379
  monitor:
    #      protocol: dubbo
    address: 127.0.0.1:7070
server:
port: 9988

dubbo client 服务消费者service接口要与提供者接口名称相同

java 复制代码
public interface IDubboDemoService {
  String helloDubbo();
}    
java 复制代码
@Service
public class IDubboDemoServiceImpl implements IDubboDemoService {
  
  @Override
  //该内容随便写
  public String helloDubbo() {
      return "hello dubbo, I'm server!";
  }
  }

@Service 来自spring依赖

创建自己的接口

java 复制代码
public interface IDemoService {
  String test();
}
java 复制代码
@Service
public class DemoServiceImpl implements IDemoService {
  //调用dubbo服务
 // @Reference(version = "2.0.0")
 @DubboReference(version = "3.0.0")
  public IDubboDemoService dubboDemoService;
  @Override
  public String test() {
      return    dubboDemoService.helloDubbo();
  }
}

启动类

java 复制代码
@SpringBootApplication
@EnableDubbo
@DubboComponentScan(basePackages = "cn.itcast.service")
public class DubboServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(DubboServiceApplication.class,args);
    }
}

Spring Boot 注解默认只会扫描 main 类所在的 package,如果服务定义在其它 package 中,需要增加配置 EnableDubbo(scanBasePackages = {"org.apache.dubbo.springboot.demo.provider"})

伪代码

@Autowired(required = false)

private IDemoService demoService;

@GetMapper("/get")

demoService.test

即可返回"hello dubbo, 我是提供者"

相关推荐
珹洺21 小时前
Bootstrap-HTML(二)深入探索容器,网格系统和排版
前端·css·bootstrap·html·dubbo
量子炒饭大师3 天前
【C++入门】—— 【什么时候需要用到深拷贝】C++的类中何时需要用到深拷贝?保姆级别带你罗列所有可能!
java·c++·dubbo·深拷贝
橘颂TA5 天前
【测试】自动化测试函数介绍——web 测试
python·功能测试·selenium·测试工具·dubbo
wc885 天前
dubbo本地直连一个程序既当提供者又当消费者问题
dubbo
小信丶7 天前
@Activate 注解详解:应用场景与实战示例
java·spring boot·后端·spring·spring cloud·微服务·dubbo
不像程序员的程序媛7 天前
nacos作为dubbo服务注册中心
dubbo
BraveHeart!10 天前
@DubboService 与 @DubboReference 初始化过程
dubbo
信创天地11 天前
从 “替代” 到 “超越”:信创系统架构师如何筑牢自主可控技术底座
运维·安全·系统架构·开源·dubbo·risc-v
wniuniu_11 天前
运维运维运维
java·运维·dubbo
量子炒饭大师12 天前
【C++入门】Cyber骇客构造器的核心六元组 —— 【类的默认成员函数】明明没写构造函数也能跑?保姆级带你掌握六大类的默认成员函数(上:函数篇)
开发语言·c++·dubbo·默认成员函数