Spring Cloud Alibaba入门篇
学习条件
- 了解web三层架构
- 熟练应用SSM架构
- 了解Maven管理工具的使用
- 熟练使用SpringBoot,以及了解SpringBoot基本原理。
- 了解部分术语:应用、工具、耦合、负载等
温馨提示:注意版本问题,不复杂,就是呀呀的版本选不好,Game Over.....
没有从入门开始写,这点应该能入门,装x用的文章,首次编写,有疑问留言(看到也不想回你),没疑问,谢谢惠顾!喜欢就点个赞!!!
什么是微服务?谈谈个人理解....
引文:单体架构是微服务架构出现之前,最经典的软件架构类型,许多早期的项目采用的也都是单体架构。单体架构将应用程序中所有业务逻辑都编写在同一个工程中,最终经过编译、打包,部署在一台服务器上运行。
微:体积小,简单
服务:功能实现。
微服务 = 体量小,复杂程度低的功能实现模块
微服务架构:微服务是一种全新的系统架构设计风格,每个服务只专注于做好一件事(三十六行,行行出状元)“专业的人做专业的事”。简单来说:就是把单体服务,拆了再拆,构建成体量小的模块,每个模块构成一个服务,多个服务的集合就是微服务架构。SpringCloud的诞生,就是来管理这些微小服务之间沟通的(不止于SpringCloud、Dubbo等)。
面试题:见附录
SpringCloud
引文:“工具”指一些列功能的集合体,泛指工作时所需用的器具。
Spring Cloud 被称为构建分布式微服务系统的“全家桶”,它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。更有效的实现开发应用管理的“工具”。
Spring Cloud 将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装,屏蔽调其中复杂的配置和实现原理,最终为开发人员提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。
SpringCloud集成核心功能官网
- Distributed/versioned configuration 分布式/版本化的配置管理
- Service registration and discovery 服务注册与服务发现
- Routing 路由
- Service-to-service calls 端到端的调用
- Load balancing 负载均衡
- Circuit Breakers 断路器
- Global locks 全局锁
- Leadership election and cluster state 选举与集群状态管理
- Distributed messaging 分布式消息
SpringCloud与SprigBoot版本关系见附录(官网)
Spring Cloud 本身并不是一个拿来即可用的框架,它是一套微服务规范,这套规范共有两代实现。重要转折点
- 第一代实现: Spring Cloud Netflix,
- 第二代实现: Spring Cloud Alibaba
2018 年 12 月12 日,Netflix 公司宣布 Spring Cloud Netflix 系列大部分组件都进入维护模式,不再添加新特性。这严重地限制了 Spring Cloud 的高速发展,于是各大互联网公司和组织开始把目光转向 Spring Cloud 的第二代实现:Spring Cloud Alibaba。
Spring Cloud Alibaba 组件
Spring Cloud Alibaba 包含了多种开发分布式微服务系统的必需组件
- Nacos:阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。
- Sentinel:阿里巴巴开源产品,把流量作为切入点,从流量控制,熔断降级,系统负载保护等多个维度保护服务的稳定性。
- RocketMQ:Apache RocketMQ 是一款基于Java 的高性能、高吞吐量的分布式消息和流计算平台。
- Dubbo:Apache Dubbo 是一款高性能的 Java RPC 框架。
- Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。
- Alibaba Cloud OSS:阿里云对象存储服务器(Object Storage Service,简称OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。
- Alibaba Cloud Schedulerx:阿里中间件团队开发的一款分布式调度产品,支持周期性的任务与固定时间点触发任务。
【学习内容】
Nacos 即 Dynamic Naming and Configuration Service(动态命名与配置服务)。由 Naming 前两个字母,Configuration 前两个字母,以及 Service 首字母组成。
Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理 以及 服务管理平台。
简单的理解:
Nacos 就是 注册中心 + 配置中心。即 Nacos = Eureka + Config + Bus。
学习条件:
为什么要学习注册中心?
微服务架构,就是很多小服务的集合体,对多个服务进行单独管理是比较麻烦。服务之间调用,A调用B,如果B因特殊需要(比如他很开心),想要频繁更换端口或IP地址,那么A服务中的代码怎么办?跟着重复更新....维护比较麻烦。注册中心可以解决这一问题。
注册中心能干什么?
服务注册,服务发现是什么东东?怎么理解?
简单理解,服务提供方把自己的服务名+端口告诉了注册中心,注册中心,统一定义,统一管理。这一过程就是服务注册。反之服务发现,自己能理解吧!不能就百度...
主要功能
-
服务发现和服务健康监测
-
动态配置服务
-
动态DNS服务
-
服务及其元数据管理
【项目简介】
1. 新建Maven父工程springcloud-alibaba-parent
2. 新建子模块nacos-provider-8000
- 提供Ctroller、Service、Mapper(略,暂定使用集合数据充当DB)
- 提供对外接口,http://ip+端口/URI/entityInfo
3. 新建子模块nacos-consumer_9000
- 提供Ctroller,实现远程调用nacos-provider-8000工程对外提供数据接口
实现远程调用,需要了解Http协议,请求头,请求行,请求体,数据传输方式等(WEB阶段Tomcat、Servlet学习)。
远程调用方式繁多(更多远程操作方式见附录)
为什么要学习并使用远程调?演示远程调用
例如:开发一款名为:智尚专属的APP,需求定时发送你的定位...那么定位系统如何实现?不清楚,但是百度、高德可支持(软件+硬件),此时我们就需要通过远程调用的方式,调用第三方系统暴露的接口实现
新建父工程
- 创建Maven父工程:springcloud-nacose(不使用快捷创建-看个人习惯)
- 父工程:pom依赖如下
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>org.example</groupId> 8 <artifactId>spingcloud-nacos</artifactId> 9 <packaging>pom</packaging> 10 <version>1.0-SNAPSHOT</version> 11 <!-- 引入子模块,子模块新建后IDEA默认自动构建 --> 12 <modules> 13 <module>nacos-provider-8000</module> 14 </modules> 15 16 <!-- 版本管理 --> 17 <properties> 18 <maven.compiler.source>8</maven.compiler.source> 19 <maven.compiler.target>8</maven.compiler.target> 20 <springbootstart.version>2.4.2</springbootstart.version> 21 </properties> 22 <!-- 依赖管理,仅管理,非导入,子模块:按需手动导入相关依赖,可以省略版本version --> 23 <dependencyManagement> 24 <!-- springboot 提供了N个start依赖 ,spring-boot-dependencies可以帮我们统一依赖 --> 25 <dependencies> 26 <dependency> 27 <groupId>org.springframework.boot</groupId> 28 <artifactId>spring-boot-dependencies</artifactId> 29 <version>${springbootstart.version}</version> 30 <type>pom</type> 31 <scope>import</scope> 32 </dependency> 33 <!-- lombok组件-简化POJO开发 --> 34 <dependency> 35 <groupId>org.projectlombok</groupId> 36 <artifactId>lombok</artifactId> 37 <version>1.18.22</version> 38 </dependency> 39 </dependencies> 40 </dependencyManagement> 41 </project>
新建子模块nacos-provider-8000
- 创建子模块:nacos-provider-8000
- nacos-provider-8000子模块:pom依赖如下
1 <properties> 2 <maven.compiler.source>8</maven.compiler.source> 3 <maven.compiler.target>8</maven.compiler.target> 4 </properties> 5 <dependencies> 6 <!-- web依赖,用以可用Sring/MVC相关注解 --> 7 <dependency> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-web</artifactId> 10 </dependency> 11 <!-- lombok组件模块-便于开发POJO --> 12 <dependency> 13 <groupId>org.projectlombok</groupId> 14 <artifactId>lombok</artifactId> 15 </dependency> 16 </dependencies>
注意事项:
- 父工程pom中需使用<modules>标签指向子模块(IDEA默认新建子模块时自动构建)
- 子模块需使用<parent>标签引入父工程
- src/main/java下新建包:com.nacosprovider
- com.nacosprovider下新建SpringBoot启动类:NacosProviderApp
1 @SpringBootApplication 2 public class NacosProviderApp { 3 public static void main(String[] args) { 4 SpringApplication.run(NacosProviderApp.class); 5 } 6 }
- src/main/resources下新建配置文件:application.properties ,并设置服务端口
1 #当前模nacos-provider-8000块服务端口 2 server.port=8000 3 #当前服务应用上下文路径:项目路径 4 #server.servlet.context-path=/provider
- com.nacosprovider下新建包:entity,并新增实体类EntityInfo
1 @Data 2 public class EntityInfo { 3 private String entityId; 4 private String entityInfo; 5 private String sendTime; 6 }
- com.nacosprovider下新建包:service,并新增EntityInfoService
1 @Service 2 public class EntityInfoService { 3 public EntityInfo queryEntityInfo(String entityId){ 4 EntityInfo entityInfo = new EntityInfo(); 5 entityInfo.setEntityId(entityId); 6 // return mapper.queryEntityInfo(entityInfo); 7 entityInfo.setSendTime("xxxx年xx月xx日 HH:mm:ss"); 8 entityInfo.setEntityInfo("Hello Nacos!"); 9 return entityInfo; 10 } 11 }
- com.nacosprovider下新建包:controller,并新增NacosProviderController
1 @RestController 2 @RequestMapping("/provider") 3 public class NacosProviderController { 4 5 @Autowired 6 private EntityInfoService entityInfoService; 7 8 @GetMapping("/entityInfo/{entityId}") 9 public EntityInfo queryEntityInfo(@PathVariable("entityId") String entityId){ 10 return entityInfoService.queryEntityInfo(entityId); 11 } 12 13 }
- 启动服务测试访问/postman测试均可:http://localhost:8000/provider/entityInfo/11
实际开发中:服务提供这将编写接口文档(API文档),说明接口调用规则,入参,返参等。
新建子模块:nacos-consumer-9000
- 新建子模块过程、配置文件、启动类、pom依赖(可移除lombok组件)略
-
新建包com.nacoseconsumer.config,类BeanManagerConfig
1 @Component 2 class BeanManagerConfig { 3 /** 4 * Spring框架提供的RestTemplate类可用于在应用中调用rest服务 5 */ 6 @Bean 7 public RestTemplate getRestTemplate(){ 8 return new RestTemplate(); 9 } 10 }
- 新建包com.nacoseconsumer.controller,类NacosConsumerController
1 @RestController 2 @RequestMapping("/consumer") 3 public class NacosConsumerController { 4 /** 5 * Spring框架提供的RestTemplate类可用于在应用中调用rest服务 6 */ 7 @Autowired 8 private RestTemplate restTemplate; 9 /** 10 * @Description 请求第三方远程接口 11 * @param 12 * @return 13 */ 14 @GetMapping("/entityInfo/{entityId}") 15 public String queryEntityInfo(@PathVariable("entityId") String entityId){ 16 String url = "http://localhost:8000/provider/entityInfo/"+entityId; 17 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); 18 return forEntity.getBody(); 19 } 20 }
- 启动服务测试/posman访问:http://localhost:9000/consumer/entityInfo/11
遗留问题(缺点)
- 手动的维护所有的服务访问ip地址列表。
- 单个服务实现负载均衡需要自己搭建(keepalive+Ngix)
使用注册中心能够实现服务治理,服务动态扩容,以及服务调用的负载均衡。
Nacos入门实战
- Nacos 官网(下载、文档、安装、启停服务*附录)
- 父工程新增依赖
1 <!-- SpringCloud依赖 --> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-dependencies</artifactId> 5 <version>2020.0.1</version> 6 <type>pom</type> 7 <scope>import</scope> 8 </dependency> 9 <!-- SpringCloudAlibaba依赖 --> 10 <dependency> 11 <groupId>com.alibaba.cloud</groupId> 12 <artifactId>spring-cloud-alibaba-dependencies</artifactId> 13 <version>2021.1</version> 14 <type>pom</type> 15 <scope>import</scope> 16 </dependency>
- nacos-provider-8000 新增pom依赖
1 <!-- 基于SpringCloud alibaba提供的针对Nacos的组件:服务注册与发现 --> 2 <dependency> 3 <groupId>com.alibaba.cloud</groupId> 4 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 5 </dependency>
- nacos-consumer-9000 新增pom依赖
<!-- 基于SpringCloud alibaba提供的针对Nacos的组件:服务注册与发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 负载均衡依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
说明:Spring Cloud LoadBalancer是一个客户端负载均衡器,类似于Ribbon,但是由于Ribbon已经进入维护模式,并且Ribbon 2并不与Ribbon 1相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容。
Nacos内部已经整合Ribbon(负载均衡器),所以RestTemplate与Nacos整合使用时,管理RestTemplate的bean推荐使用LoadBalancer。
- 优化RestTmplate的bean管理,新增注解
1 @Bean 2 @LoadBalanced 3 public RestTemplate getRestTemplate(){ 4 return new RestTemplate(); 5 }
- 更改Cotroll,使用服务名称实现远程调用(通过注册中的服务名称实现调用,摈弃维护IP、端口)
1 @GetMapping("/entityInfo/{entityId}") 2 public String queryEntityInfo(@PathVariable("entityId") String entityId) { 3 String url = "http://nacos-provider/provider/entityInfo/" + entityId; 4 System.out.println(url); 5 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); 6 return forEntity.getBody(); 7 }
说明:不使用注解,不使用LoadBalancer,直接改URL的IP为服务提供者的服务名称调用会报错java.net.UnknownHostException: nacos-provider
原因:Nacos内部已经整合Ribbon(负载均衡器),RestTemplate与Nacos整合使用时,需要开启负载均衡,因此管理RestTemplate的bean必须使用注解@LoadBalanced,表示开启负载均衡。否则无法直接通过“服务提供者的服务名”访问。
2.必须使用IP访问肿么办?
可以注入LoadBalancerClient,根据服务名称获取ServiceInstance,再获取IP+PORT即可,此时维护RestTemplate是就无需使用@LoadBalanced。
可以注入DiscoveryClient (服务发现工具类),根据服务名获取列表List<ServiceInstance>(通常服务名唯一,所以列表如果不为null长度也是1).
1 @RestController 2 @RequestMapping("/consumer") 3 public class NacosConsumerController { 4 /** 5 * Spring框架提供的RestTemplate类可用于在应用中调用rest服务 6 */ 7 @Autowired 8 private RestTemplate restTemplate; 9 /** 10 * 负载均衡客户端 11 */ 12 @Autowired 13 private LoadBalancerClient loadBalancerClient; 14 /** 15 * 服务发现客户端 16 */ 17 @Autowired 18 private DiscoveryClient discoveryClient; 19 20 /** 21 * @param 22 * @return 23 * @Description 请求第三方远程接口 24 */ 25 @GetMapping("/entityInfo/{entityId}") 26 public String queryEntityInfo(@PathVariable("entityId") String entityId) { 27 String url = "http://nacos-provider/provider/entityInfo/" + entityId; 28 29 // 使用以下方式,则需要干掉restTemplate负载均衡注解,开启负载均衡,Ncose中就只能通过服务名调用服务了 30 // 负载均衡发现服务 31 ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider"); 32 String uri = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort(); 33 url = uri + "/provider/entityInfo/" + entityId; 34 // 注册与发现,发现服务客户端获取服务 35 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("nacos-provider"); 36 serviceInstanceList.get(0).getPort(); 37 serviceInstanceList.get(0).getHost(); 38 serviceInstanceList.get(0).getUri(); 39 40 System.out.println(serviceInstanceList.get(0).getUri()); 41 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); 42 return forEntity.getBody(); 43 } 44 }
附录
Nacos
- 下载
登入Nacos官网,登入GitHub,也可以直接进入GitHub搜索“Nacos”
2. 安装
理论上直接解压即可,只要下对了宝宝!
3.启停
启停分为单机版(入门常规)、集群版(高可用)
windows命令:
1 startup.cmd -m standalone
命令说明:startup.cmd 启动程序,双击或DOS命令均可(双击启动请继续看完)
参数说明:-m 模式模型,standalone 标识-单机模式启动
双击启动文件启动(需手动修改启动文件)
1 原:cluster标识集群模式 2 set MODE="cluster" 3 修改为:standalone标识单机模式 4 set MODE="standalone"
4.基本配置
单体架构VS微服务
不同点 | 微服务架构 | 单体架构 |
---|---|---|
团队规模 | 微服务架构可以将传统模式下的单个应用,拆分为多个独立的服务,每个微服务都可以单独开发、部署和维护。每个服务从设计、开发到维护所需的团队规模小,团队管理成本小。 | 单体架构的应用程序通常需要一个大型团队,围绕一个庞大的应用程序工作,团队管理的成本大。 |
数据存储方式 | 不同的微服务可以使用不同的数据存储方式,例如有的用 Redis,有的使用 MySQL。 | 单一架构的所有模块共享同一个公共数据库,存储方式相对单一。 |
部署方式 | 微服务架构中每个服务都可以独立部署,也可以独立于其他服务进行扩展。如果部署得当,基于微服务的架构可以帮助企业提高应用程序的部署效率。 | 采用单体架构的应用程序的每一次功能更改或 bug 修复都必须对整个应用程序重新进行部署。 |
开发模式 | 在采用微服务架构的应用程序中,不同模块可以使用不同的技术或语言进行开发,开发模式更加灵活。 | 在采用单体架构的应用程序中,所有模块使用的技术和语言必须相同,开发模式受限。 |
故障隔离 | 在微服务架构中,故障被隔离在单个服务中,避免系统的整体崩溃。 | 在单体架构中,当一个组件出现故障时,故障很可能会在进程中蔓延,导致系统全局不可用。 |
项目结构 | 微服务架构将单个应用程序拆分为多个独立的小型服务,每个服务都可以独立的开发、部署和维护,每个服务都能完成一项特定的业务需求。 | 单体架构的应用程序,所有的业务逻辑都集中在同一个工程中。 |
SpringCloud与SprigBoot版本关系
2021.0.x aka Jubilee |
2.6.x |
2020.0.x aka Ilford |
2.4.x, 2.5.x (Starting with 2020.0.3) |
2.2.x, 2.3.x (Starting with SR5) |
|
2.1.x |
|
2.0.x |
|
1.5.x |
|
1.5.x |
SpringCloud 对比 Dubbo
功能 | Dubbo | SpringCloud |
---|---|---|
服务注册中心 | Zookeeper | Eureka(主流)、Consul、zookeeper |
服务调用方式 | RPC基于Dubbo协议 | REST API 基于Http协议 |
服务监控 | Dubbo-Monitor | Spring Boot Admin |
熔断器 | 不完善 | Spring Cloud Netflix Hystrix |
服务网关 | 无 | Spring Cloud Netflix Zuul、Gateway |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth+Zipkin(一般) |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
信息总线 | 无 | Spring Cloud Bus |