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

Posted adventure.Li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

结构目录

具体过程

  1. 在cloud-demo-discovery-dubbo-api模块中定义统一接口
  2. 创建cloud-demo-discovery-dubbo-provier
  • 引入依赖
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>cloud-demo-discovery-dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
    </dependencies>

  • 写配置(要细致)
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: '*'
  • 实现服务
/**
 * @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;
    

  • 启动类
@EnableDiscoveryClient
@SpringBootApplication
//@EnableDubbo
public class DemoDubboProviderApp 
    
    public static void main(String[] args) 
        SpringApplication.run(DemoDubboProviderApp.class,args);
    


  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
  • 服务调用
@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);
    


  • 启动类
@EnableDiscoveryClient
@SpringBootApplication
@EnableDubbo
public class DemoDubboConsumerApp 
    
    public static void main(String[] args) 
        SpringApplication.run(DemoDubboConsumerApp.class,args);
    


  1. 启动nacos(单机版)


5. 依次启动provider,consumer,并进行接口调用测试

以上是关于SpringCloudAlibaba基础实战(Dubbo+Nacos 服务注册与发现篇)的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud alibaba实战系列文章汇总

SpringCloudAlibaba商城实战项目(day01)

Dubbo 系列(07-5)集群容错 - Mock

Spring Cloud Alibaba商城实战项目基础篇(day02)

SpringCloudAlibaba 实战

Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵进阶实战