美文网首页
nacos结合dubbo2.7.12、springboot分析

nacos结合dubbo2.7.12、springboot分析

作者: 灿烂的GL | 来源:发表于2021-07-15 17:07 被阅读0次

    一、dubbo原理简介

    问题:并发很多的时候Tomcat处理并发请求有限,多模块进行通信
    解决:dubbo是一个RPC和SOA的框架,提供远程通信和服务治理功能。
    原理图如下:

    原理图.png
    image.png

    container就是springboot里的container,初始化启动provider,将服务端接口注册到注册中心,registry实现服务的url地址注册和地址调度,最终访问通过地址找实际服务,consumer消费者会轮训订阅想订阅的服务,monitor提供监控。


    二、nacos简介

    1、主要应用

    主要应用-引自阿里云微服务课程.png

    2、nacos注册中心
    服务的注册:包括服务所在的ip、端口、版本和协议
    服务发现:从注册中心获取注册的服务实例

    nacos注册中心作用-引自阿里云微服务课程.png
    其他组件对比-引自阿里云微服务课程.png
    数据模型-引自阿里云微服务课程.png

    3、nacos注册中心原理
    注册:
    如下实例,注册中心存在一个类似于服务容器(serviceHolder)进行服务管理,两个提供者provider1/2提供服务1service1的实例instance1/2

    注册实例-引自参考链接3.png
    服务发现:
    如下实例:左侧为订阅服务,本地维护一个服务列表,获取实例从本地获取,实例变更后从注册中心重新获取;右侧为直接从注册中心获取实例
    服务发现实例-引自参考链接3.jpg

    4、windows安装nacos
    进入git下载地址下载nacos-server的zip包,本地解压,运行startup文件
    报错如下:

    image.png
    解决:https://www.freesion.com/article/87611162023/,默认集群改成单机即可。
    启动成功后可访问:http://localhost:8848/nacos/#
    image.png
    集群部署参考链接
    主要是两步:
    1、conf目录下修改cluster.conf文件添加节点地址
    2、conf目录下修改application.properties添加数据库信息
    然后验证集群状态即可。
    4、nacos配置中心
    Nacos配置管理,通过Namespace(命名空间)、group、 Data ID(配置中心)能够定位到一个配置集。
    如下:nacos的注册中心和配置中心在可视化界面里的关系如下:
    模型.png
    这里说下另一个功能作为配置中心
    主流配置中心对比.png
    nacos的读写性能还是很高的。
    理解配置中心要先理解几个名词
    namespace:命名空间,用作环境隔离,默认是public,可以自定义命名空间(如test)
    添加自定义命名空间.png
    不同空间切换.png
    public空间之外的空间,标识该空间的是namespace_id(dev后边的一串字符串)的,对应的是springboot里spring.cloud.nacos.discovery.namespace配置项。
    Group:实现服务注册信息或者DataId的分组管理机制
    DateId:我们定义一个配置文件可能是一群配置的结合,配置集合的ID即Data ID,Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性(官方标注非强制)
    新建配置.png
    新建配置.png
    默认的group是DEFAULT_ GROUP也可以自定义
    添加后在springboot通过@Value来拉取配置信息@RefreshScope实现自动刷新。

    5、项目使用
    使用环境:dubbo+nacos注册中心
    测试项目结构如下

    测试项目结构.png

    总pom依赖

            <!-- Spring Cloud Nacos Service Discovery -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
                <version>2.0.0</version>
            </dependency>
    
           <!-- Dubbo Spring Cloud Starter -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-dubbo</artifactId>
            </dependency>
    

    provider配置文件

    server.port=8087
    spring.application.name=nacos-provider
    
    dubbo.application.name=annotation-provider-TEST
    dubbo.scan.base-packages=nacos.service
    dubbo.protocol.name=dubbo
    dubbo.protocol.port=-1
    dubbo.provider.validation=true
    dubbo.cloud.subscribed-services= ''
    dubbo.registry.address=nacos://localhost:8848
    #spring.cloud.nacos.registry.namespace=c16585d6-eea4-4a86-8ee7-602f787eb32e
    #spring.cloud.nacos.registry.server-addr=192.168.140.1:8848
    spring.profiles.active=dev
    spring.main.allow-bean-definition-overriding=true
    

    provider提供的服务,只需要添加@DubboService就可以注册到nacos上

    package nacos.service.impl;
    
    import nacos.service.TestService;
    import org.apache.dubbo.config.annotation.DubboService;
    
    @DubboService
    public class TestServiceImpl implements TestService {
        @Override
        public String getStatus(Integer stats) {
            if (stats==1){
                return "对";
            } else {
                return "错";
            }
        }
    }
    

    再看下consumer的配置,需要注意的是subscribed-services需要明确添加哪些provider,否则会报找不到服务的错(dubbo.rpc.RpcException: Failed to invoke the method)

    server.port=8080
    spring.application.name=nacos-consumer
    
    dubbo.application.name=annotation-consumer-TEST
    dubbo.scan.base-packages=nacos.service
    dubbo.protocol.name=dubbo
    dubbo.protocol.port=-1
    dubbo.provider.validation=true
    #comsumer订阅的服务配置很重要,否则会报找不到服务的错
    dubbo.cloud.subscribed-services= 'nacos-provider'
    dubbo.consumer.check=false
    dubbo.consumer.validation=true
    dubbo.consumer.retries=-1
    dubbo.registry.address=nacos://localhost:8848
    #spring.cloud.nacos.registry.namespace=c16585d6-eea4-4a86-8ee7-602f787eb32e
    #spring.cloud.nacos.registry.server-addr=192.168.140.1:8848
    spring.profiles.active=dev
    spring.main.allow-bean-definition-overriding=true
    

    comsumer的pom依赖需要引入provider,调用服务通过@DubboReference注解

    package nacos.controller;
    
    import nacos.service.TestService;
    import org.apache.dubbo.config.annotation.DubboReference;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class TestController {
    
        @DubboReference
        TestService testService;
    
    
        @GetMapping("/getStr")
        public String getStr(Integer stats){
            String testStr = testService.getStatus(stats);
            return testStr;
        }
    }
    

    启动的时候先启动provider在启动comsumer,否则因为注册为完成获取服务失败


    image.png

    点进详情可以看见具体的服务信息


    image.png
    浏览器/postman上请求comsumer的接口可返回具体数据。
    此外还需要注意的是:

    1、实体类传输需要序列化
    2、使用hutool工具做时间传输
    3、dubbo传输数据大小上限为8M


    6、dubbo调用流程
    更新中.....
    服务暴露:


    一个限流的组件
    三、sentinel限流

    image.png
    image.png
    image.png
    image.png
    通过页面即可进行接口级别流量控制,更深入的可以自行了解下

    参考链接
    1、dubbo注解
    2、dubbo官方文档
    3、官方文档
    4、nacos注册与发现原理
    5、nacos+springboot实现注册和发现
    6、OpenFeign

    相关文章

      网友评论

          本文标题:nacos结合dubbo2.7.12、springboot分析

          本文链接:https://www.haomeiwen.com/subject/ezendltx.html