SpringCloud Alibaba —— Nacos 服务注册

本文详细介绍Spring Cloud Alibaba的功能,包括服务限流降级、服务注册与发现等,并深入讲解如何使用Nacos作为服务注册中心,包括下载、启动、访问及在微服务架构中的具体应用。

前文

SpringCloud 简介

SpringCloud 版本选型

SpringCloud 工程构建

SpringCloud —— Eureka 注册中心

SpringCloud —— Eureka 集群

SpringCloud —— 服务注册进 Eureka 集群

SpringCloud —— Eureka 自我保护

SpringCloud —— SpringCloud Consul 实现服务注册中心

SpringCloud —— 三个注册中心的异同点

SpringCloud —— Ribbon

SpringCloud —— Ribbon 负载均衡算法

SpringCloud —— OpenFeign

SpringCloud —— Hystrix 简介

SpringCloud —— Hystrix 断路器

SpringCloud —— HystrixDashboard 服务监控

SpringCloud —— Gateway 网关

SpringCloud —— Config 配置中心

SpringCloud —— Sleuth 分布式请求链路跟踪

简介

官网地址

https://spring.io/projects/spring-cloud-alibaba
在这里插入图片描述

SpringCloud Alibaba 能干嘛?

  • 服务限流降级:默认支持 Servlet、Feign、RESTTemplates、Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控
  • 服务注册与发现:适配 SpringCloud 服务注册与发现标准,默认集成了 Ribbon 的支持
  • 分布式配置管理:基于 SpringCloud Stream 为微服务应用构建消息驱动能力
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行

添加依赖

在工程中添加以下依赖即可引入 SpringCloud Alibaba

<!--Spring Cloud alibaba 2.1.0.RELEASE-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>
	<version>2.1.0.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

SpringCloud Alibaba 怎么用?

Sentinel

阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负责保护多个维度保护服务的稳定性

Nacos

阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

RocketMQ

Apache RocketMQ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台

Dubbo

Apache Dubbo 是一款高性能 Java RPC 框架

Seata

阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案

Alibaba Cloud OSS

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务,可以在任何应用、任何时间、任何地点存储和访问任意类型的数据

Alibaba Cloud SchedulerX

阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务

各种注册中心比较

服务注册发现框架CAP 模型控制台管理社区活跃度
EurekaAP支持低(2.X 版本闭源)
ZookeeperCP不支持
ConsulCP支持
NacosAP支持

Nacos 下载启动

Nacos 的下载地址 https://github.com/alibaba/nacos/releases

下载之后解压打开 bin 目录,双击 startup.cmd 即可启动 Nacos
在这里插入图片描述
启动之后会出现 Nacos 的字样
在这里插入图片描述

Nacos 访问

启动之后访问 http://localhost:8848/nacos 即可访问 Nacos 控制台,但是需要先登录,用户名和密码默认都为 nacos
在这里插入图片描述
登录之后即可跳转到控制台
在这里插入图片描述

Nacos 作为服务注册中心演示

官方文档

官方文档地址 https://spring.io/projects/spring-cloud-alibaba#learn ,目前当前最新的版本是 2.1.0
在这里插入图片描述
这是 SpringCloud Alibaba 的一个依赖

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.1.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

在这里插入图片描述

基于 Nacos 的服务提供者

新建 Module

在这里插入图片描述

POM

这里需要添加两个 POM ,一个是父 POM ,一个是本 POM(当然,如果你只有一个微服务的话那就都添加到一个 POM 就行了)


父 POM 中需要添加以下依赖

<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-alibaba-dependencies</artifactId>
	<version>2.1.0.RELEASE</version>
	<type>pom</type>
	<scope>import</scope>
</dependency>

本 POM(如果你只是想测试 Nacos 服务注册的话直接添加 Nacos 的依赖就行了)

<dependencies>

    <!-- SpringCloud Alibaba Nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- SpringBoot整合Web组件 -->
    <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>
    <!--日常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
</dependencies>

主要是这个依赖
在这里插入图片描述

application.yml

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置地址

# 监控端点全部打开
management:
  endpoints:
    web:
      exposure:
        include: '*'

启动类

记得加上 @EnableDiscoveryClient 注解

package com.java.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author Woo_home
 * @create 2020/5/20 11:28
 */

@EnableDiscoveryClient 
@SpringBootApplication
public class PaymentMain9001 {
    public static void main(String[] args){
        SpringApplication.run(PaymentMain9001.class, args);
    }
}

业务类

简单返回字符串就行

package com.java.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Woo_home
 * @create 2020/5/20 11:29
 */

@RestController
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "Nacos register, serverPort: " + serverPort + "\t id: " + id;
    }
}

测试

运行启动类
在这里插入图片描述
在这里插入图片描述
刷新一下 Nacos 的控制台界面,点击服务列表选项,可以发现我们的服务已经注册进来了(这跟 Eureka 是类似的,这里也不多说了),集群数量为 1,实例数为 1 等等
在这里插入图片描述
我们点击一下详情
在这里插入图片描述
点击详情选项可以详细地查看服务信息
在这里插入图片描述
更多操作这里就不一一展示了,感兴趣的朋友可以自己玩下


如果你想拒绝这个服务注册,你还可以点击删除操作
在这里插入图片描述

新建模块 9002(与 9001 一样的服务提供者)

与模块 9001 一样即可(依赖,配置,代码都是一样即可)


启动 9001 和 9002
在这里插入图片描述

刷新一下 Nacos 控制台,可以发现,现在已经有两个服务了,实例数为 2
在这里插入图片描述
也可以点击详情进去看下
在这里插入图片描述

基于 Nacos 的服务消费者

新建 Module

在这里插入图片描述

POM

老规矩,主要是 nacos 的依赖,其它根据需要添加

<dependencies>

    <!-- SpringCloud Alibaba Nacos-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- SpringBoot整合Web组件 -->
    <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>
    <!--日常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>RELEASE</version>
        <scope>test</scope>
    </dependency>
</dependencies>

application.yml

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置地址

# 消费者将要去访问的微服务名称(注册成功进 Nacos 的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

启动类

跟前两个模块的启动类是一样的

package com.java.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author Woo_home
 * @create 2020/5/20 12:26
 */

@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
    public static void main(String[] args){
        SpringApplication.run(OrderNacosMain83.class, args);
    }
}

配置类

配置类很简单,只需要声明一个 bean 就行了,为什么要这个 bean,等会儿会说

package com.java.springcloud.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author Woo_home
 * @create 2020/5/20 12:28
 */

@Configuration
public class ApplicationContextConfig {

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

业务类

package com.java.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;

/**
 * @author Woo_home
 * @create 2020/5/20 12:29
 */

@RestController
@Slf4j
public class OrderNacosController {

    @Resource // 写成 @Autowrie 也行,随你喜欢
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
    }

}

测试

启动三个微服务
在这里插入图片描述
刷新一下 Nacos 控制台,现在已经成功注册三个服务了(两个服务提供者,一个服务消费者)
在这里插入图片描述
访问 http://localhost:83/consumer/payment/nacos/13 测试一下,报错了。。。
在这里插入图片描述
原因是我们没有在 RestTemplate 加上 @LoadBalanced 注解,加上就行了
在这里插入图片描述
添加 @LoadBalanced 注解之后启动服务,再次访问 http://localhost:83/consumer/payment/nacos/13 测试下,现在返回的是 9002 端口的服务
在这里插入图片描述
再次刷新一下,现在返回的是 9001 端口的微服务
在这里插入图片描述

为什么 Nacos 自带负载均衡?

学过 Ribbon 的朋友会发现(没学过也没关系,这里有文章可以看下 SpringCloud —— Ribbon),这不是负载均衡么?是的,这是 Nacos 自带的负载均衡,为什么 Nacos 会自带负载均衡呢?因为 spring-cloud-starter-alibaba-nacos-discovery 依赖里面添加了 Ribbon 的依赖,也可以说 Nacos 整合了 Ribbon,所以 Nacos 就默认支持了负载均衡
在这里插入图片描述

完整代码已上传至码云 代码下载地址
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值