SpringCloud Alibaba

Spring Cloud Alibaba为分布式应用程序开发提供了一站式解决方案。 它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序。
使用Spring Cloud Alibaba,您只需添加一些注释和少量配置即可将Spring Cloud应用程序连接到Alibaba的分布式解决方案,并使用Alibaba中间件构建分布式应用程序系统。

特性

流量控制和服务降级:使用Sentinel进行流量控制,断路和系统自适应保护。

服务注册和发现:实例可以在Nacos上注册,客户可以使用Spring管理的bean发现实例。支持通过Spring Cloud Netflix的客户端负载均衡器Ribbon。

分布式配置:使用Nacos作为数据存储

事件驱动:构建与Spring Cloud Stream RocketMQ Binder连接的高度可扩展的事件驱动微服务

消息总线:使用Spring Cloud Bus RocketMQ链接分布式系统的节点

分布式事务:支持高性能且易于使用的Seata分布式事务解决方案

Dubbo RPC:通过Dubbo RPC扩展Spring Cloud服务到服务调用的通信协议

阿里云对象存储:OSS的Spring资源抽象。阿里云对象存储服务(OSS)是一种加密,安全,经济高效且易于使用的对象存储服务,可让您在云中存储,备份和存档大量数据

Nacos

Nacos一个更易于构建原生应用的动态服务发现、配置管理和服务管理平台。

Nacos:Dynamic Naming and Configuration Service,前四个字母为Nameing和Configuration的前两个字母,最后的s为Service。

Nacos可以看作注册中心+配置中心的组合,等价于Nacos=Eureka+Config+Bus

Nacos提供四个主要功能:服务发现和服务运行状况检查
Nacos使服务易于注册自己并通过DNS或HTTP接口发现其他服务。 Nacos还提供服务的实时运行状况检查,以防止向不正常的主机或服务实例发送请求。动态配置管理
动态配置服务使您可以在所有环境中以集中和动态的方式管理所有服务的配置。 Nacos消除了在更新配置时重新部署应用程序和服务的需求,这使配置更改更加有效和敏捷。动态DNS服务
Nacos支持加权路由,使您可以更轻松地在数据中心内的生产环境中实施中间层负载平衡,灵活的路由策略,流控制和简单的DNS解析服务。它可以帮助您轻松实现基于DNS的服务发现,并防止应用程序耦合到特定于供应商的服务发现API。服务和元数据管理
Nacos提供了一个易于使用的服务仪表板,可帮助您管理服务元数据,配置,kubernetes DNS,服务运行状况和指标统计信息。

官方网站:https://nacos.io/zh-cn/

Nacos 地图




springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ide


  • 特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
  • 架构大图:通过清晰架构,让您快速进入 Nacos 世界
  • 业务大图:利用当前特性可以支持的业务场景,及其最佳实践
  • 生态大图:系统梳理 Nacos 和主流技术生态的关系
  • 优势大图:展示 Nacos 核心竞争力
  • 战略大图:要从战略到战术层面讲 Nacos 的宏观优势

Nacos 生态图


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ide_02


Nacos 无缝支持一些主流的开源生态,例如

  • Spring Cloud
  • Apache Dubbo and Dubbo Mesh TODO
  • Kubernetes and CNCF TODO。

搭建学习

下载安装Nocas

下载地址:https://github.com/alibaba/nacos/releases,再这里下载windows版本。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_Cloud_03


解压进入bin目录。运行startup.cmd


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_04


浏览器输入http://localhost:8848/nacos,默认的登陆账号,密码都为nacos。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_05


登陆进去后,可以看见配置管理,服务管理,集群管理,权限控制,命名空间等菜单。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_Cloud_06


Demo搭建

还是基于以前的学习springcloud的demo,


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_Cloud_07


父pom,springcloud-parent引入依赖

com.alibaba.cloud                spring-cloud-alibaba-dependencies                2.1.0.RELEASEpomimport

添加两个生产着cloudalibaba-provider-9001,cloudalibaba-provider-9002,一个消费着cloudalibaba-consumer-8001

cloudalibaba-provider-9001的配置

添加依赖

com.alibaba.cloud        spring-cloud-starter-alibaba-nacos-discovery    org.springframework.boot        spring-boot-starter-web    org.springframework.boot        spring-boot-starter-actuator

配置文件

server:  port: 9001spring:  application:    name: cloudalibaba-provider  cloud:    nacos:      discovery:        server-addr: localhost:8848 #配置Nacos地址management:  endpoints:    web:      exposure:        include: '*'

主启动类

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

controller

@RestControllerpublic class ProviderController {@Value("${server.port}")private String serverPort;@GetMapping(value = "/provider/nacos")public String test(){return "访问provider服务,端口号:"+serverPort;}}

cloudalibaba-provider-9002和cloudalibaba-provider-9001配置大多相同,只是端口不一致。

配置cloudalibaba-consumer-8001

添加依赖

com.alibaba.cloud   spring-cloud-starter-alibaba-nacos-discoveryorg.springframework.boot   spring-boot-starter-weborg.springframework.boot   spring-boot-starter-actuator

配置文件

server:  port: 8001spring:  application:    name: cloudalibaba-consumer  cloud:    nacos:      discovery:        server-addr: localhost:8848#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)service-url:  nacos-user-service: http://cloudalibaba-provider

主启动类

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

controller

@RestControllerpublic class ConsumerController{@Resourceprivate RestTemplate restTemplate;@Value("${service-url.nacos-user-service}")private String serverURL;@GetMapping(value = "/consumer/nacos")public String getProviderInfo(){return restTemplate.getForObject(serverURL+"/provider/nacos",String.class);}}

restTemplate的配置

@Configurationpublic class RestTemplateConfig{@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}}

启动nacos,consumer,provider

打开nacos,服务管理,服务列表,服务已注册


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ide_08


访问测试请求,nacos支持负载均衡,nacos-discovercy包依赖ribbon


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_09


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_Cloud_10


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_Cloud_11


刚才用Nacos做了注册中心的一个例子,现在用Nacos做配置中心。

新增一个模块cloudalibaba-nacos-3377

添加依赖

com.alibaba.cloud        spring-cloud-starter-alibaba-nacos-discovery    com.alibaba.cloud        spring-cloud-starter-alibaba-nacos-config    org.springframework.boot        spring-boot-starter-web    org.springframework.boot        spring-boot-starter-actuator

添加配置文件bootstrap.yml

# nacos配置server:  port: 3377spring:  application:    name: nacos-config-client  cloud:    nacos:      discovery:        server-addr: localhost:8848 #Nacos服务注册中心地址      config:        server-addr: localhost:8848 #Nacos作为配置中心地址        file-extension: yaml #指定yaml格式的配置

application.yml

spring:  profiles:    active: dev # 表示开发环境

主启动类

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

controller

@RestController@RefreshScope //支持Nacos的动态刷新功能。public class ConfigClientController{    @Value("${message.data.name}")    private String name;    @GetMapping("/message/data/name")    public String getMessgaeDataName() {        return name;    }}

配置文件的定义可以参照官网

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

prefix默认为spring.application.name配置为nacos-config-client,spring.profile.active配置为dev,file-extension配置为yaml。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_12


在nacos配置nacos-config-client-dev.yaml。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ide_13


启动项目,访问/message/data/name,访问成功。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_14


在nacos中修改配置文件。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_15


刷新请求,发现访问到已做修改的配置文件


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ide_16


在配置列表加了一个dataId为nacos-config-client-dev.yaml,但是Group修改为DEV_GROUP。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ribbon 配置 动态更新_17


配置文件添加group配置


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ide_18


重启服务,访问


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ide_19


这时匹配到了dataId为nacos-config-client-dev.yaml,Group为DEV_GROUP的配置文件。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_ide_20


在命名空间我添加一个dev的命令空间。这时在配置列表处会有个dev的栏目,


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_21


切换至dev,建立了一个这样的配置


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_Cloud_22


修改配置文件


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_23


其中namespace配置项来自于:


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_Cloud_24


重启服务,访问,匹配到了刚才设置的配置


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_Cloud_25


namespace,dataId,group

namespace,dataId,group类似java里面的package名和类名,最外层的Namesapce是可以用于区分部署环境,Group和DataID逻辑上区分两个目标对象。


springcloudconfig和Spring Cloud Bus实现动态刷新 springcloud动态更新配置_spring_26


默认情况下,Namespace为public,Group为DEFAULT_GROUP,Cluster为DEFAULT。

Namespace主要用来实现隔离,比方说我们有三个环境:开发,测试,生产。我们就可以创建三个Namespace,不同的Namesapce是隔离的。

Group可以把不同的微服务划分到一个分组中去。

Service就是微服务,一个Service可以包含多个Cluster(集群)。

Cluster是对指定的微服务的一个虚拟划分。比如为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州的机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。

总结

Nacos 是阿里巴巴于2018年7月份新开源的项目,Nacos的主要愿景是期望通过提供易用的 动态服务发现、服务配置管理、服务共享与管理 的基础设施,帮助用户在云原生时代更好的构建、交付、管理自己的微服务平台。

现在越来越多的企业开始用Nacos,所以学习Nacos还是很有必要的。后续继续介绍Nacos的其他内容。