zoukankan      html  css  js  c++  java
  • SpringCloud微服务:基于Nacos组件,整合Dubbo框架

    源码地址:GitHub·点这里 || GitEE·点这里

    一、基础组件简介

    1、Dubbo框架

    Dubbo服务化治理的核心框架,之前几年在国内被广泛使用,后续由于微服务的架构的崛起,更多的公司转向微服务下成熟的技术栈,但是Dubbo本身确实是非常优秀的框架。

    常见的应用迭代和升级的过程基本如下:

    • 当应用访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
    • 随着垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
    • 伴随业务发展,服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。

    而Dubbo框架的核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。正好可以解决上述业务发展的痛点。

    2、微服务框架

    SpringCloud是一系列框架的有序集合。它利用SpringBoot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用SpringBoot的开发风格做到一键启动和部署。

    后续AliCloud微服务系列组件也不断被使用起来,其中最基础的组件Nacos注册中心,更是直接支持Dubbo框架,这样Cloud和Dubbo两大框架就成功的整合在了一起。

    3、Nacos注册中心

    Nacos注册中心主要用于发现、配置、管理微服务。并且提供一组简单易用的特性集,快速实现动态服务发现、服务配置、服务元数据及流量管理。

    如上图Nacos无缝支持一些主流的开源生态框架,例如SprinCloud,Dubbo两大框架。在AliCloud的系列组件中,还包含了Seata,RocketMQ,Sentinel等一系列组件。

    二、服务结构图解

    SpringCloud和Dubbo整合的结构示意图如下,使用的Nacos中心:

    Provider提供方:提供核心的Dubbo服务接口;

    Consumer消费方:消费注册的Dubbo服务接口;

    Nacos注册中心:配置、发现和管理Dubbo服务;

    通过上述流程不难发现,不管从架构上看,还是用法过程,基于核心Dubbo框架和微服务原生框架是十分相似,上述流程也遵循这样一个规则:dubbo-server连接自己的业务库DB,并通过dubbo-facade中接口向外提供服务,如果不同dubbo-server需要访问其他服务接口,也必须要通过其他服务的facade接口操作,dubbo-client作为接口服务消费端,可以通过facade接口访问很多业务模块的服务,整体架构层次十分明了。

    三、编码案例实现

    1、案例结构和依赖

    案例结构

    包含三个模块:server、facade、client。

    核心依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-dubbo</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    

    2、服务端配置

    配置文件

    主要是Nacos注册中心和Dubbo两个核心配置。

    server:
      port: 9010
    spring:
      application:
        name: node10-dubbo-server
      cloud:
        nacos:
          discovery:
            server-addr: http://localhost:8848
          config:
            server-addr: http://localhost:8848
            file-extension: yaml
    # Dubbo服务配置
    dubbo:
      scan:
        base-packages: com.cloud.dubbo.service
      protocol:
        name: dubbo
        port: -1
      registry:
        address: spring-cloud://localhost
    

    服务接口实现

    这里DubboService即dubbo-facade包中对外提供的接口。

    import org.apache.dubbo.config.annotation.Service;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @Service
    public class DubboServiceImpl implements DubboService {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(DubboServiceImpl.class) ;
    
        @Override
        public String getInfo() {
            LOGGER.info("node10-dubbo-server start ...");
            return "node10-dubbo-server";
        }
    }
    

    注意:@Service是Dubbo框架中的注解,不是Spring框架的注解。

    3、消费端配置

    配置文件

    主要配置是链接Nacos注册中心,订阅注册中心的node10-dubbo-server服务。

    server:
      port: 9011
    spring:
      application:
        name: node10-dubbo-client
      cloud:
        nacos:
          discovery:
            server-addr: http://localhost:8848
          config:
            server-addr: http://localhost:8848
    # Dubbo服务配置
    dubbo:
      protocol:
        name: dubbo
        port: -1
      registry:
        address: spring-cloud://localhost
      cloud:
        subscribed-services: node10-dubbo-server
    

    Dubbo接口调用

    同样,这里DubboService即dubbo-facade包中对外提供的接口。

    import com.cloud.dubbo.service.DubboService;
    import org.apache.dubbo.config.annotation.Reference;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class DubboWeb {
    
        @Reference
        private DubboService dubboService ;
    
        @GetMapping("/getInfo")
        public String getInfo () {
            return dubboService.getInfo() ;
        }
    }
    

    注意:@Reference也是Dubbo框架中的注解。

    如上流程开发完成,先后启动dubbo-server服务和dubbo-client服务,查看注册中心服务列表:

    通过上述getInfo接口请求测试,即可看到完整的案例效果。

    四、技术选型

    很少有选择SpringCloud+Dubbo框架的架构模式,这里简单说明一下为何,因为这两个框架都是相当复杂的,学习成本是一个方面,风险是最主要原因,这两个框架同时使用,就意味要面对和解决两个框架下产生的问题,在任何一个框架都可以稳定的解决业务问题时,完全没必要花里胡哨。

    五、源代码地址

    GitHub地址:知了一笑
    https://github.com/cicadasmile/spring-cloud-base
    GitEE地址:知了一笑
    https://gitee.com/cicadasmile/spring-cloud-base
    

    推荐阅读:微服务组件和应用

    序号 文章标题
    01 微服务基础:Eureka组件,管理服务注册发现
    02 微服务基础:Ribbon和Feign组件,实现请求负载均衡
    03 微服务基础:Hystrix组件,实现服务熔断
    04 微服务基础:Turbine组件,实现微服务集群监控
    05 微服务基础:Zuul组件,实现路由网关控制
    06 微服务基础:Config组件,实现配置统一管理
    07 微服务基础:Zipkin组件,实现请求链路追踪
    08 微服务基础:与Dubbo框架、Boot框架对比分析
    09 微服务基础:Nacos组件,服务和配置管理
    10 微服务基础:Sentinel组件,服务限流和降级
    11 微服务应用:分库分表模式下,数据库扩容方案
    12 微服务应用:Shard-Jdbc分库分表,扩容方案实现
  • 相关阅读:
    vue + ajax + php 接口的使用小接
    网页调用qq聊天
    基于touch.js 左滑删除功能
    touch.js——常见应用操作
    常用链接
    如何判断滚动条已到达底部
    前端如何优雅的选择字体
    纯css3打造瀑布流布局
    移动端软键盘监听(弹出,收起),及影响定位布局的问题
    jq获取图片的原始尺寸,自适应布局
  • 原文地址:https://www.cnblogs.com/cicada-smile/p/13442936.html
Copyright © 2011-2022 走看看