• SpringCloudAlibaba基础实战(Dubbo+Nacos 服务注册与发现篇)


    一、背景

    在云原生时代,微服务、容器技术、DevOps,持续交付是四大元素。而对于开发人员微服务的掌握是重中之重。Java中SpringBoot凭借优秀的特性为构造Java应用带来了极大便利。因此,微服务构建是SpringCloud利用其生态,很好地建立起来SpringCloud系列的架构解决方案。而SpringCloud Netfflix由于停更,SpringCloudAlibaba凭借对第一代的兼容性以及极好的功能拓展、便利性提升,而占据了Java微服务较大市场。微服务的整个架构和SpringCloudAlibaba生态如下,而本文将进行一些简单Demo的实战记录,相关代码放在个人github
    在这里插入图片描述
    在这里插入图片描述

    二、服务注册&发现

    我们都知道微服务将应用的粒度划分很小,便于协作开发和故障迁移。那么粒度变小之后,必然服务的数量上来了,而且服务间也存在着一定关系,需要去调用,此刻微服务一般还部署在不同机器之上,因此不能像本地调用那样去调用,而需要通过网络通信方式去调用。因此复杂度瞬间上来,我们主要就需要去考虑以下复杂度:

    • 服务调用与治理(如何保证复用的可用?对于大规模的服务如何治理、跟踪?
    • 服务的通信如何高效,通信带来的系列问题(如超时,一个服务调用失败导致其他服务雪崩式失败
    • 服务本身的健康状态(当服务本身不可用时如何处理?

    对于上面的系列问题,我定义为 的问题,相比 单体(少),我们无需协作管理,而对于 ,就犹如 人群 形成 了社会,此时我们则需要进行管理,而对于的管理在计算机中有很多体现,例如:

    • 进程\线程的,带来了进程管理,高并发的协作问题
    • 文件\数据的,带来了文件管理,数据库系统
    • 人\用户的,带来了业务的管理,软件的管理(软件的复杂,来源于需求业务的复杂,人的需求)

    所以说,解决该问题,我们也可如法炮制,采用中心机构进行管理。而微服务具体的管理方式,则是通过服务注册中心进行统一管理。有了统一的注册列表和各服务的信息,那么想去调用其他服务,检查服务状态等就更加容易,而对于常用的服务调用则是采用 REST Http通信和 RPC远程调用两种主要方式。

    • REST :采用HTTP轻量级调用方式,十分方便,快捷,但是相对于RPC方式一般速度较慢,性能较差。
    • RPC:远程调用,Java一般采用Netty通信框架,高性能的NIO底层,通信速度较快,性能较好。

    对于SpringCloudAlibaba,RPC调用框架,Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。更多特性可以参考官网

    对于SpringCloudAlibaba,服务注册与发现、配置中心,nacos具有很强的表现,随着2.0版本 gRpc的引入,通信性能极强,支撑百万实例。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

    • Kubernetes Service
    • gRPC & Dubbo RPC Service
    • Spring Cloud RESTful Service

    Dubbo+Nacos简单实战Demo

    基本依赖

        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-dependenciesartifactId>
                    <version>2.3.0.RELEASEversion>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
                <dependency>
                    <groupId>com.alibaba.cloudgroupId>
                    <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                    <version>2.2.1.RELEASEversion>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
            dependencies>
        dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    结构目录

    在这里插入图片描述

    具体过程

    1. 在cloud-demo-discovery-dubbo-api模块中定义统一接口
      在这里插入图片描述
    2. 创建cloud-demo-discovery-dubbo-provier
    • 引入依赖
        <dependencies>
            <dependency>
                <groupId>org.examplegroupId>
                <artifactId>cloud-demo-discovery-dubbo-apiartifactId>
                <version>1.0-SNAPSHOTversion>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-actuatorartifactId>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-dubboartifactId>
            dependency>
        dependencies>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 写配置(要细致)
    server:
      port: 8888
    
    spring:
      application:
        name: cloud-demo-discovery-dubbo-provider
    
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    
    #dubbo:
    #  registry:
    #    address:
    
    #dubbo:
    #  cloud:
    #    subscribed-services:
    
    dubbo:
      application:
        #
        id: cloud-demo-discovery-dubbo-provider
      scan:
        # 服务扫描基础包
        base-packages: com.lyf.dubboprovider
        # org.springframework.cloud.alibaba.dubbo.bootstrap
      protocol:
        # 协议
        name: dubbo
        # dubbo协议端口(-1自增端口,从20880开始)
        port: -1
      cloud:
        subscribed-services: '*'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 实现服务
    /**
     * @author liyunfei
     */
    // dubbo贡献给apache了
    //@Service
    @Service
    public class EchoServiceImpl implements EchoService {
        private final static Logger LOGGER = LoggerFactory.getLogger(EchoServiceImpl.class);
        // publishProvider interfaceName is empty
        @Override
        public String echo(String msg) {
            //org.apache.dubbo.rpc.service.EchoService
            LOGGER.info("[provider]"+msg);
            return "provider provide fun:receive msg:"+msg;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 启动类
    @EnableDiscoveryClient
    @SpringBootApplication
    //@EnableDubbo
    public class DemoDubboProviderApp {
        
        public static void main(String[] args) {
            SpringApplication.run(DemoDubboProviderApp.class,args);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 创建cloud-demo-discovery-dubbo-consummer
    • 引入依赖(同provider)
    • 配置文件
    server:
      port: 8900
    
    spring:
      application:
        name: cloud-demo-discovery-dubbo-consumer
    
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    # nacos registry, DEFAULT_GROUP cloud-demo-discovery-dubbo-provider 192.168.247.1:8888 register finished
    dubbo:
      application:
        id: cloud-demo-discovery-dubbo-consumer
      cloud:
        # 订阅服务提供者, * 提供所有
        subscribed-services: cloud-demo-discovery-dubbo-provider
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 服务调用
    @RestController
    public class CallController {
        private final static Logger LOGGER = LoggerFactory.getLogger(CallController.class);
        //@Reference
        @Reference(check = false)
        EchoService echoService;
        
        @GetMapping("/call/test/{msg}")
        String test(@PathVariable("msg")String msg){
            LOGGER.info("[consumer]"+msg);
            return echoService.echo(msg);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 启动类
    @EnableDiscoveryClient
    @SpringBootApplication
    @EnableDubbo
    public class DemoDubboConsumerApp {
        
        public static void main(String[] args) {
            SpringApplication.run(DemoDubboConsumerApp.class,args);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 启动nacos(单机版)

    在这里插入图片描述
    5. 依次启动provider,consumer,并进行接口调用测试

  • 相关阅读:
    数据结构与算法4-链表
    【LeetCode-中等题】208. 实现 Trie (前缀树)
    c# 逆变 / 协变
    [附源码]Python计算机毕业设计Django高校实验室仪器设备管理系统
    数据结构与算法
    Android Studio实现简单的图书馆订座系统
    SpringCloud微服务架构实践详细汇总
    【Java 进阶篇】JavaScript 与 HTML 的结合方式
    Git和GitHub(尚硅谷的视频教学)
    Gut代谢组学文献分享:小小肠道菌群决定肾的“生死”
  • 原文地址:https://blog.csdn.net/qq_44654974/article/details/127458129