SpringCloud(3)CloudAlibaba Nacos Sentinel Seata

SpringCloud系列:

SpringCloud(1)基础 Eureka ZooKeeper Consul CAP

SpringCloud(2)Ribbon OpenFeign Hystrix 服务降级 熔断 HystrixDashboard GateWay Config Bus Stream Sleuth

1、Cloud Alibaba

1.1 背景

    Spring Cloud Netflix项目进入维护模式

https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now

什么是维护模式?

     将模块置于维护模式,意味着Spring Cloud团队将不会再向模块添加新功能。

     他们将修复block级别的 bug 以及安全问题,他们也会考虑并审查社区的小型pull request。

1.2 Cloud Alibaba简介

(1)官方简介:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

       Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

      依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。诞生:2018.10.31,Spring Cloud Alibaba 正式入驻了Spring Cloud官方孵化器,并在Maven 中央库发布了第一个版本。

官方中文学习资料:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

(2)安装方法父项目中


    
        
            com.alibaba.cloud
            spring-cloud-alibaba-dependencies
            2.2.5.RELEASE
            pom
            import
        
    

1.3 Cloud Alibaba功能

(1)服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

(2)服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

(3)分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。

(4)消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。

(5)分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。

(6)阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。

(7)分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。

(8)阿里云短信服务:覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

1.4 Cloud Alibaba技术栈

(1)Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

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

(3)RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

(4)Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。

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

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

(7)Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

(8)Alibaba Cloud SMS: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
 

2、Nacos(Dynamic Naming and Configuration Service)

2.1 Nacos简介(就是一个软件,很爽)

https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring%20cloud%20alibaba%20nacos_discovery

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

      Nacos就是注册中心+配置中心的组合 -> Nacos = Eureka+Config+Bus

      因此Nacos主要用于,替代Eureka做服务注册中心替代Config做服务配置中心

  • 各个注册中心比较
服务注册与发现框架 CAP模型 控制台管理 社区活跃度
Eureka AP 支持 低(2.x版本闭源)
Zookeeper CP 不支持
consul CP 支持
Nacos AP 支持

据说Nacos在阿里巴巴内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验。

2.2 Nacos安装

(1)安装环境准备

本地Java8+Maven环境

(2)从官网下载Nacos

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

(3)解压安装包,直接运行bin目录下的startup.cmd

(4)直接用浏览器访问http://localhost:8848/nacos,默认账号密码是nacos

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第1张图片

2.3 Nacos使用

2.3.1 Nacos服务提供者(Provider)注册

(1)新建Module - cloudalibaba-provider-payment9001/9002 支付子工程(下文消费者要使用负载均衡功能,所以建立两个)

(2)改POM

① 父POM


    
        
        
            com.alibaba.cloud
            spring-cloud-alibaba-dependencies
            2.1.0.RELEASE
            pom
            import
        
    

② 本模块POM

    
        cloud2020
        com.atguigu.springcloud
        1.0-SNAPSHOT
    
    4.0.0

    cloudalibaba-provider-payment9001

    
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

(3)改YML

server:
  port: 9001

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

management:
  endpoints:
    web:
      exposure:
        include: '*'

(4)主启动

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

(5)业务类

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

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

(6)测试

① http://localhost:9001/payment/nacos/1

② nacos控制台

③ nacos服务注册中心+服务提供者9001都OK了

2.3.2 服务消费者

(1)新建Module - cloudalibaba-consumer-nacos-order83子工程

(2)改POM

    
        LearnCloud
        com.lun.springcloud
        1.0.0-SNAPSHOT
    
    4.0.0

    cloudalibaba-consumer-nacos-order83

    
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
        
        
            com.atguigu.springcloud
            cloud-api-commons
            1.0.0-SNAPSHOT
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    


(3)改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
#provider并没写死,支持负载均衡

说明:spring-cloud-starter-alibaba-nacos-discovery内含netflix-ribbon包,所以支持负载均衡。而且前面也讲过nacos=eureka+.... eureka就就集成了ribbon

(4)主启动类

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

(5)配置类

Spring注解加入RestTemplate组件(暂时还没用上一讲的OpenFeign)

@Configuration
public class ApplicationContextConfig{
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

(6)业务类

@RestController
@Slf4j
public class OrderNacosController {
    
    @Resource
    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);
    }

}

(7)测试:

① 启动nacos控制台

② http://localhost:83/Eonsumer/payment/nacos/13

③ 83访问9001/9002,轮询负载OK

2.4 Nacos服务中心性能提升

(1)Nacos全景图

(2)Nacos和CAP

Nacos与其他注册中心特性对比

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第2张图片

(3)Nacos服务发现实例模型

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第3张图片

(4)Nacos支持AP和CP模式的切换

     C是所有节点在同一时间看到的数据是一致的(强调一致性);而A的定义是所有的请求都会收到响应(强调高可用性)。

  • 何时选择使用何种模式?

① —般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

② 如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

切换命令:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP

2.5 Nacos 服务配置中心(前文的Bus的职能,一次性配置好所有相关微服务)

2.5.1 基础配置

(1)新建cloudalibaba-config-nacos-client3377子工程(配置子工程)

(2)改POM

    
        cloud2020
        com.atguigu.springcloud
        1.0-SNAPSHOT
    
    4.0.0

    cloudalibaba-config-nacos-client3377

    
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

(3)改YML

    Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

说明:这个YML就是按照规范格式指定好 要从nacos端读取的 配置文件 的名称,并不涉及配置文件内容

① bootstrap.yml

# nacos配置
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
      config:
        server-addr: localhost:8848 #Nacos作为配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: DEV_GROUP
        namespace: 7d8f0f5a-6a53-4785-9686-dd460158e5d4


# ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
# nacos-config-client-dev.yaml

# nacos-config-client-test.yaml   ----> config.info

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第4张图片

一般在bootstrap.yml 配置好 名称 和 格式。 在application.yml 配置各种开发环境

②  application.yml(配置各种开发环境)

spring:
  profiles:
    active: dev # 表示开发环境
    #active: test # 表示测试环境
    #active: info

(4)主启动

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

(5)业务类

@RestController
@RefreshScope //支持Nacos的动态刷新功能。
public class ConfigClientController{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

 说明:

原生注解@RefreshScope实现配置自动更新。(比前文的Bus刷新舒服太多了)

执行这个业务,就是读取 nacos-config-client-dev.yaml 配置文件的内容

2.5.2 在Nacos中添加配置信息的方法

(6)在Nacos中添加配置信息  https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

注意:区别前文讲的Bus消息总线(在github中添加配置信息)

(6.1)配置文件名称(DataID)格式:

 在 Nacos Spring Cloud中,配置文件名称(dataId)的完整格式如下:

${prefix}-${spring-profile.active}.${file-extension}

① prefix默认为spring.application.name(yml配置文件里)的值,也可以通过配置项spring.cloud.nacos.config.prefix来配置。

② spring.profile.active即为当前环境对应的 profile,详情可以参考 Spring Boot文档。注意:当spring.profile.active为空时,对应的连接符 - 也将不存在,datald 的拼接格式变成${prefix}.${file-extension}

③ file-exetension为配置内容的数据格式,可以通过配置项spring .cloud.nacos.config.file-extension来配置。目前只支持properties和yaml类型。

④ 通过Spring Cloud 原生注解@RefreshScope实现配置自动更新。

最后公式:

${spring.application.name)}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

(6.2)新增配置文件的方法

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第5张图片

Nacos界面配置对应 - 设置DataId

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第6张图片

(7)测试:

① 启动前需要在nacos客户端-配置管理-配置管理栏目下有对应的yaml配置文件

② 运行cloud-config-nacos-client3377的主启动类

③ 调用接口查看配置信息 - http://localhost:3377/config/info(出现上图中的配置内容)

④ 修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。(@RefreshScope实现配置自动更新)

2.6 Nacos之命名空间分组和DataID三者关系

2.6.1 背景(问题:多环境多项目管理)

① 问题1:

    实际开发中,通常一个系统会准备

  • dev开发环境
  • test测试环境
  • prod生产环境。

    如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

② 问题2:

      一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?
结论:就是按Namespace+Group+Data的规则设置 配置文件。微服务(SpringBoot工程)通过配置自己工程的YML来获取这里设置的配置文件。

2.6.2 Nacos图形化界面

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第7张图片

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第8张图片

2.6.3 Namespace+Group+Data lD三者关系?为什么这么设计?

结论:就是按Namespace+Group+Data的规则设置 配置文件。微服务(SpringBoot工程)通过配置自己工程的YML来获取这里设置的配置文件。

Namespace类似Java里面的package名和类名最外层的namespace,可以用于区分部署环境

GroupDatalD逻辑上区分两个目标对象。

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第9张图片

默认设置:Namespace=public,Group=DEFAULT_GROUP,默认Cluster是DEFAULT

(1)Namespace默认的是public,Namespace主要用来实现隔离

        比如说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。

(2)Group默认的是DEFAULT_GROUP

      Group可以把不同的微服务划分到同一个分组里面去(避免消息重复消费)

(3)Service就是微服务实例的集合:一个Service可以包含多个Cluster (集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。

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

(4)最后是Instance,就是微服务的实例

2.6.4 DataID配置

前言:本小节使用默认Namespace(public)和默认Group(Default_GROUP) 来分别新建  devtest 两个DatalD

思路:通过指定YML配置文件的spring.profile.active 和 配置文件名称(DatalD)  来使不同环境下读取不同的配置

(1)新建DEV配置的DataID

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第10张图片

(2)新建 test 配置的 DataID

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第11张图片

(3)通过spring.profile.active属性就能进行多环境下配置文件的读取

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第12张图片

(4)测试:

① http://localhost:3377/config/info

② 配置是什么就加载什么 test/dev

2.6.5 Group分组方案

通过Group实现环境区分  

(1)新建Group

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第13张图片

(2)在nacos图形界面控制台上面新建配置文件DatalD

SpringCloud(3)CloudAlibaba Nacos Sentinel Seata_第14张图片

在config下增加一条group的配置即可。可配置为DEV_GROUP或TEST GROUP

(3)回到微服务(SpringBoot子工程)

分别在bootstrap.yml (选择分组)和 application.yml (选择 环境

你可能感兴趣的:(SpringCloud,SpringCloud)