SpringCloud系列:
SpringCloud(1)基础 Eureka ZooKeeper Consul CAP
SpringCloud(2)Ribbon OpenFeign Hystrix 服务降级 熔断 HystrixDashboard GateWay Config Bus Stream Sleuth
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)官方简介: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)服务限流降级:默认支持 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)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: 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。
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万的实例运行,已经过了类似双十一等各种大型流量的考验。
(1)安装环境准备
本地Java8+Maven环境
(2)从官网下载Nacos
下载地址:https://github.com/alibaba/nacos/releases
(3)解压安装包,直接运行bin目录下的startup.cmd
(4)直接用浏览器访问http://localhost:8848/nacos,默认账号密码是nacos
(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
(1)Nacos全景图
(2)Nacos和CAP
Nacos与其他注册中心特性对比
(3)Nacos服务发现实例模型
(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
(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
一般在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 配置文件的内容
(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)新增配置文件的方法
Nacos界面配置对应 - 设置DataId
(7)测试:
① 启动前需要在nacos客户端-配置管理-配置管理栏目下有对应的yaml配置文件
② 运行cloud-config-nacos-client3377的主启动类
③ 调用接口查看配置信息 - http://localhost:3377/config/info(出现上图中的配置内容)
④ 修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。(@RefreshScope实现配置自动更新)
2.6.1 背景(问题:多环境多项目管理)
① 问题1:
实际开发中,通常一个系统会准备
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
② 问题2:
一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?
结论:就是按Namespace+Group+Data的规则设置 配置文件。微服务(SpringBoot工程)通过配置自己工程的YML来获取这里设置的配置文件。
2.6.2 Nacos图形化界面
结论:就是按Namespace+Group+Data的规则设置 配置文件。微服务(SpringBoot工程)通过配置自己工程的YML来获取这里设置的配置文件。
Namespace类似Java里面的package名和类名最外层的namespace,可以用于区分部署环境
Group和DatalD逻辑上区分两个目标对象。
默认设置: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,就是微服务的实例
前言:本小节使用默认Namespace(public)和默认Group(Default_GROUP) 来分别新建 dev 和 test 两个DatalD
思路:通过指定YML配置文件的spring.profile.active 和 配置文件名称(DatalD) 来使不同环境下读取不同的配置
(1)新建DEV配置的DataID
(2)新建 test 配置的 DataID
(3)通过spring.profile.active属性就能进行多环境下配置文件的读取
(4)测试:
① http://localhost:3377/config/info
② 配置是什么就加载什么 test/dev
通过Group实现环境区分
(1)新建Group
(2)在nacos图形界面控制台上面新建配置文件DatalD
在config下增加一条group的配置即可。可配置为DEV_GROUP或TEST GROUP
(3)回到微服务(SpringBoot子工程)
分别在bootstrap.yml (选择分组)和 application.yml (选择 环境