Spring Cloud Alibaba概述
2018.10.31, Spring Cloud Alibaba 正式入驻了Spring Cloud官方孵化器,并在Maven中央仓库发布了第一个版本。
Spring Cloud Alibaba支持:
- 服务限流降级:默认支持Servlet、Feign. RestTemplate、 Dubbo 和RocketMQ限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级Metrics监控。
- 服务注册与发现:适配Spring Cloud服务注册与发现标准,默认集成了Ribbon的支持。
- 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
- 消息驱动能力:基于Spring Cloud Stream为微服务应用构建消息驱动能力.
- 阿里云对象存储:阿里云提供的海量、安全、低成本、可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
- 分布式任务调度:提供秒级、精准、可靠高可用的定时(基于Cron表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有Worker (schedulerx-client). 上执行。
Nacos概述
为什么叫Nacos:前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
是一个服务发现、配置管理和服务管理平台。可以替代eureka+config+bus
各注册中心比较
- | Nacos | Eureka | Consul | CoreDNS | ZooKeeper |
---|---|---|---|---|---|
一致性协议 | CP+AP | AP | CP | / | CP |
健康检查 | TCP/HTTP/MySQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | / | Client Beat |
负载均衡 | 权重/DSL/metadata/CMDB | Ribbon | Fabio | RR | / |
雪崩保护 | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
访问协议 | HTTP/DNS/UDP | HTTP | HTTP/DNS | DNS | TCP |
监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
跨注册中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
Dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
K8s集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
使用
Nacos server下载和运行
Nacos-server下载: https://github.com/alibaba/nacos/releases
这里选择nacos-server-1.1.4.tar.gz下载并解压:
wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.zip
tar -xvf nacos-server-1.1.4.tar.gz
启动服务器(非集群模式):
cd nacos/bin
sh startup.sh -m standalone
ubuntu可以使用:
bash startup.sh -m standalone
启动成功后,访问 http://localhost:8848/nacos 即可看到图形界面,默认账号和密码都是nacos
nacos 的docker运行
nacos-docker的github主页: https://github.com/nacos-group/nacos-docker
docker run --name nacos-standalone -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:latest
构建服务提供者模块
新建模块cloudalibaba-provider-payment9001
,依赖:
<!-- nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</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>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>
因为父工程已经引入
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
这里不再引入
yaml配置:
server:
port: 9002
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9002 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9002.class, args);
}
}
controller:
@Controller
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry, serverPort: " + serverPort+"\t id:" +id;
}
}
运行该模块,可以查看到该服务被注册到nacos上面了,再建立一个内容相同的9002模块并启动,可以看到该服务存在两个实例:

服务调用者模块搭建
新建模块cloudalibaba-consumer-nacos-order83
,依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.rhett</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</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>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>
yaml配置:
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 消费者将要去访问的微服务名称,这是自定义配置项
service-url:
nacos-user-service: http://nacos-payment-provider
启动类:
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class, args);
}
}
配置RestTemplate:
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller:
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverUrl;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id){
return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id, String.class);
}
}
访问 http://localhost:83/consumer/payment/nacos/13 即可看到9001、9002交替提供服务,是因为nacos已经继承了ribbon负载均衡:

Nacos AP和CP的切换
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性, 因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
切换方法:向 $NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
发送POST请求
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/nacos%e4%bd%9c%e4%b8%ba%e6%b3%a8%e5%86%8c%e4%b8%ad%e5%bf%83%e7%9a%84%e7%ae%80%e5%8d%95%e4%bd%bf%e7%94%a8/