前文
SpringCloud —— 服务注册进 Eureka 集群
SpringCloud —— SpringCloud Consul 实现服务注册中心
SpringCloud —— HystrixDashboard 服务监控
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 模型 | 控制台管理 | 社区活跃度 |
|---|---|---|---|
| Eureka | AP | 支持 | 低(2.X 版本闭源) |
| Zookeeper | CP | 不支持 | 中 |
| Consul | CP | 支持 | 高 |
| Nacos | AP | 支持 | 高 |
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 就默认支持了负载均衡

完整代码已上传至码云 代码下载地址

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

被折叠的 条评论
为什么被折叠?



