前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dubbo的使用场景与高级特性之引入注册中心与API配置

Dubbo的使用场景与高级特性之引入注册中心与API配置

作者头像
Tom弹架构
发布2023-11-21 17:31:44
1800
发布2023-11-21 17:31:44
举报
文章被收录于专栏:Tom弹架构Tom弹架构

3 引入注册中心

Dubbo并不仅仅只是一个RPC框架,他还是一个服务治理框架,它提供了对服务的统一管理、以及服务的路由等功能。

在上面的案例中,我们只是掩饰了Dubbo作为RPC通信的点对点服务,但是就像咱们前面在学习spring cloud的内容一样,服务多了以后,如何管理和维护,以及动态发现呢?

而且,从Dubbo的架构图中可以看到,Dubbo天然就支持服务注册与发现,官方最早推荐的服务注册中心是zookeeper,当然,目前dubbo能够支持的注册中心已经非常多了,比如consul、etcd、nacos、sofa、zookeeper、eureka、redis等等,很显然,Dubbo已经在往一个独立微服务解决方案的生态在发展。

3.1 集成Zookeeper

集成Zookeeper作为服务注册中心

  • • 添加zookeeper的jar包依赖
代码语言:javascript
复制
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-dependencies-zookeeper</artifactId>
    <version>${dubbo.version}</version>
    <type>pom</type>
</dependency>
  • • 添加注册中心配置 创建dubbo-provider.properties文件用于取代xml中的配置属性,然后用@PropertySource加载该properties配置文件即可 。dubbo-provider.properties文件内容如下:
代码语言:javascript
复制
dubbo.application.name=dubbo_provider
dubbo.registry.address=zookeeper://${zookeeper.address:127.0.0.1}:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
#dubbo.provider.token=true

3.2 配置管理

  • • 配置组件 Dubbo框架的配置项比较繁多,为了更好地管理各种配置,将其按照用途划分为不同的组件,最终所有配置项都会汇聚到URL中,传递给后续处理模块。常用配置组件如下:
    • • application: Dubbo应用配置
    • • registry: 注册中心
    • • protocol: 服务提供者RPC协议
    • • config-center: 配置中心
    • • metadata-report: 元数据中心
    • • service: 服务提供者配置
    • • reference: 远程服务引用配置
    • • provider: service的默认配置或分组配置
    • • consumer: reference的默认配置或分组配置
    • • module: 模块配置
    • • monitor: 监控配置
    • • metrics: 指标配置
    • • ssl: SSL/TLS配置
  • • 配置来源 从Dubbo支持的配置来源说起,默认有6种配置来源:
    • • JVM System Properties,JVM -D 参数
    • • System environment,JVM进程的环境变量
    • • Externalized Configuration,外部化配置,从配置中心读取
    • • Application Configuration,应用的属性配置,从Spring应用的Environment中提取"dubbo"打头的属性集
    • • API / XML /注解等编程接口采集的配置可以被理解成配置来源的一种,是直接面向用户编程的配置采集方式
    • • 从classpath读取配置文件 dubbo.properties
  • • 覆盖关系 下图展示了配置覆盖关系的优先级,从上到下优先级依次降低:

4 API配置

以API 配置的方式来配置你的 Dubbo 应用

通过API编码方式组装配置,启动Dubbo,发布及订阅服务。此方式可以支持动态创建ReferenceConfig/ServiceConfig,结合泛化调用可以满足API Gateway或测试平台的需要。

  • • 服务提供者

通过ServiceConfig暴露服务接口,发布服务接口到注册中心。

代码语言:javascript
复制
public class ProviderApi {
    public static void main(String[] args) throws IOException {
        new EmbeddedZooKeeper(2181, false).start();
        // 服务实现
        UserService demoService = new UserServiceImpl();
        // 当前应用配置
        ApplicationConfig application = new ApplicationConfig();
        application.setName("demo-provider");
        // 连接注册中心配置
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("zookeeper://127.0.0.1:2181");
        // 服务提供者协议配置
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName("dubbo");
        protocol.setPort(12345);
        protocol.setThreads(200);
        // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
        // 服务提供者暴露服务配置
        ServiceConfig<UserService> service = new ServiceConfig<UserService>(); // 此实例很
        重,封装了与注册中心的连接,请自行缓存,否则可能造成内存和连接泄漏
            service.setApplication(application);
        service.setRegistry(registry); // 多个注册中心可以用setRegistries()
        service.setProtocol(protocol); // 多个协议可以用setProtocols()
        serviceConfig.setTimeout(1200000);
        service.setInterface(UserService.class);
        service.setRef(demoService);
        service.setVersion("1.0.0");
        // 暴露及注册服务
        service.export();
        // 挂起等待(防止进程退出)
        System.in.read();
    }
}
  • • 服务消费者 通过ReferenceConfig引用远程服务,从注册中心订阅服务接口。
代码语言:javascript
复制
@Test
public void api() {
    // 1、应用信息
    ApplicationConfig applicationConfig = new ApplicationConfig();
    applicationConfig.setName("dubbo_consumer");

    //2、注册信息
    RegistryConfig registry = new RegistryConfig();
    registry.setAddress("zookeeper://127.0.0.1:2181");

    //引用API
    ReferenceConfig<UserService> referenceConfig = new ReferenceConfig<>();
    referenceConfig.setApplication(applicationConfig);
    referenceConfig.setRegistry(registry);
    referenceConfig.setInterface(UserService.class);

    //服务引用  。这个引用过程非常重,如果想用api方式去引用服务,这个对象需要缓存
    UserService userService = referenceConfig.get();
    System.out.println(userService.queryUser("jingtian"));
}
  • • bootstrap 服务发布
代码语言:javascript
复制
public class BootstrapApi {
    public static void main(String[] args) {
        new EmbeddedZooKeeper(2181, false).start();
        ConfigCenterConfig configCenter = new ConfigCenterConfig();
        configCenter.setAddress("zookeeper://127.0.0.1:2181");
        // 服务提供者协议配置
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName("dubbo");
        protocol.setPort(12345);
        protocol.setThreads(200);
        // 注意:ServiceConfig为重对象,内部封装了与注册中心的连接,以及开启服务端口
        // 服务提供者暴露服务配置
        ServiceConfig<UserService> demoServiceConfig = new ServiceConfig<>();
        demoServiceConfig.setInterface(UserService.class);
        demoServiceConfig.setRef(new UserServiceImpl());
        demoServiceConfig.setVersion("1.0.0");
        // 第二个服务配置
        ServiceConfig<MockService> fooServiceConfig = new ServiceConfig<>();
        fooServiceConfig.setInterface(MockService.class);
        fooServiceConfig.setRef(new MockServiceImpl());
        fooServiceConfig.setVersion("1.0.0");
        // 通过DubboBootstrap简化配置组装,控制启动过程
        DubboBootstrap.getInstance()
            .application("demo-provider") // 应用配置
            .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) // 注册中心配置
            .protocol(protocol) // 全局默认协议配置
            .service(demoServiceConfig) // 添加ServiceConfig
            .service(fooServiceConfig)
            .start() // 启动Dubbo
            .await(); // 挂起等待(防止进程退出)
    }
}
  • • bootstrap 服务发现
代码语言:javascript
复制
public class BootstrapApi {
    public static void main(String[] args) {
        // 引用远程服务
        ReferenceConfig<UserService> demoServiceReference = new
            ReferenceConfig<UserService>();
        demoServiceReference.setInterface(UserService.class);
        demoServiceReference.setVersion("1.0.0");
        ReferenceConfig<MockService> fooServiceReference = new
            ReferenceConfig<MockService>();
        fooServiceReference.setInterface(MockService.class);
        fooServiceReference.setVersion("1.0.0");
        // 通过DubboBootstrap简化配置组装,控制启动过程
        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
        bootstrap.application("demo-consumer") // 应用配置
            .registry(new RegistryConfig("zookeeper://127.0.0.1:2181")) // 注册中心配置
            .reference(demoServiceReference) // 添加ReferenceConfig
            .reference(fooServiceReference)
            .start(); // 启动Dubbo
        // 和本地bean一样使用demoService
        // 通过Interface获取远程服务接口代理,不需要依赖ReferenceConfig对象
        UserService demoService =
            DubboBootstrap.getInstance().getCache().get(UserService.class);
        System.out.println(demoService.queryUser("jack"));
        MockService fooService =
            DubboBootstrap.getInstance().getCache().get(MockService.class);
        System.out.println(fooService.queryArea("1"));
    }
}

5 部署架构

(注册中心 配置中心 元数据中心)

了解 Dubbo 的三大中心化组件,它们各自的职责、工作方式。

作为一个微服务框架,Dubbo sdk 跟随着微服务组件被部署在分布式集群各个位置,为了在分布式环境下实现各个微服务组件间的协作, Dubbo 定义了一些中心化组件,这包括:

  • • 注册中心。协调 Consumer 与 Provider 之间的地址注册与发现
  • • 配置中心。
    • • 存储 Dubbo 启动阶段的全局配置,保证配置的跨环境共享与全局一致性
    • • 负责服务治理规则(路由规则、动态配置等)的存储与推送。
    • • 简单来说,就是把 dubbo.properties 中的属性进行集中式存储,存储在其他的服务器上
    • • 目前 Dubbo 能支持的配置中心有:apollo、nacos、zookeeper
  • • 元数据中心。
    • • 接收 Provider 上报的服务接口元数据,为 Admin 等控制台提供运维能力(如服务测试、接口文档等)
    • • 作为服务发现机制的补充,提供额外的接口/方法级别配置信息的同步能力,相当于注册中心的额外扩展
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tom弹架构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3 引入注册中心
    • 3.1 集成Zookeeper
      • 3.2 配置管理
      • 4 API配置
      • 5 部署架构
      相关产品与服务
      微服务引擎 TSE
      微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档