Spring Cloud Alibaba入门篇
阅读原文时间:2022年05月11日阅读:1

学习条件

  • 了解web三层架构
  • 熟练应用SSM架构
  • 了解Maven管理工具的使用
  • 熟练使用SpringBoot,以及了解SpringBoot基本原理。
  • 了解部分术语:应用、工具、耦合、负载等

温馨提示:注意版本问题,不复杂,就是呀呀的版本选不好,Game Over…..

没有从入门开始写,这点应该能入门,装x用的文章,首次编写,有疑问留言(看到也不想回你),没疑问,谢谢惠顾!喜欢就点个赞!!!

什么是微服务?谈谈个人理解….

  引文:单体架构是微服务架构出现之前,最经典的软件架构类型,许多早期的项目采用的也都是单体架构。单体架构将应用程序中所有业务逻辑都编写在同一个工程中,最终经过编译、打包,部署在一台服务器上运行。

  微:体积小,简单

  服务:功能实现。

  微服务 = 体量小,复杂程度低的功能实现模块

  微服务架构:微服务是一种全新的系统架构设计风格,每个服务只专注于做好一件事(三十六行,行行出状元)“专业的人做专业的事”。简单来说:就是把单体服务,拆了再拆,构建成体量小的模块,每个模块构成一个服务,多个服务的集合就是微服务架构。SpringCloud的诞生,就是来管理这些微小服务之间沟通的(不止于SpringCloud、Dubbo等)。

  面试题:见附录

  引文:“工具”指一些列功能的集合体,泛指工作时所需用的器具

  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 包含了多种开发分布式微服务系统的必需组件

  • 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服务中的代码怎么办?跟着重复更新….维护比较麻烦。注册中心可以解决这一问题。

  注册中心能干什么?

  

  服务注册,服务发现是什么东东?怎么理解?

    简单理解,服务提供方把自己的服务名+端口告诉了注册中心,注册中心,统一定义,统一管理。这一过程就是服务注册。反之服务发现,自己能理解吧!不能就百度…

主要功能

  1. 服务发现和服务健康监测

  2. 动态配置服务

  3. 动态DNS服务

  4. 服务及其元数据管理

【项目简介】

  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
    2 http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 4.0.0 6 7 org.example 8 spingcloud-nacos 9 pom 10 1.0-SNAPSHOT 11 12 13 nacos-provider-8000 14 15 16 17 18 8 19 8 20 2.4.2 21 22 23 24 25 26 27 org.springframework.boot 28 spring-boot-dependencies 29 ${springbootstart.version} 30 pom 31 import 32 33 34 35 org.projectlombok 36 lombok 37 1.18.22 38 39 40 41

新建子模块nacos-provider-8000

  • 创建子模块:nacos-provider-8000

      

      

  • nacos-provider-8000子模块:pom依赖如下

    1 2 8 3 8 4
    5 6 7 8 org.springframework.boot 9 spring-boot-starter-web 10 11 12 13 org.projectlombok 14 lombok 15 16

注意事项:

  • 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 forEntity = restTemplate.getForEntity(url, String.class);
    18 return forEntity.getBody();
    19 }
    20 }

  • 启动服务测试/posman访问:http://localhost:9000/consumer/entityInfo/11

遗留问题(缺点)

  1. 手动的维护所有的服务访问ip地址列表。
  2. 单个服务实现负载均衡需要自己搭建(keepalive+Ngix)

使用注册中心能够实现服务治理,服务动态扩容,以及服务调用的负载均衡。

Nacos入门实战

  1. Nacos 官网(下载、文档、安装、启停服务*附录

  2. 父工程新增依赖

    1
    2 3 org.springframework.cloud 4 spring-cloud-dependencies 5 2020.0.1 6 pom 7 import 8
    9
    10 11 com.alibaba.cloud 12 spring-cloud-alibaba-dependencies 13 2021.1 14 pom 15 import 16

  3. nacos-provider-8000 新增pom依赖

    1
    2 3 com.alibaba.cloud 4 spring-cloud-starter-alibaba-nacos-discovery 5

  4. nacos-consumer-9000 新增pom依赖


    com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery


    org.springframework.cloud spring-cloud-starter-loadbalancer

    说明:Spring Cloud LoadBalancer是一个客户端负载均衡器,类似于Ribbon,但是由于Ribbon已经进入维护模式,并且Ribbon 2并不与Ribbon 1相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容。

    Nacos内部已经整合Ribbon(负载均衡器),所以RestTemplate与Nacos整合使用时,管理RestTemplate的bean推荐使用LoadBalancer。

  5. 优化RestTmplate的bean管理,新增注解

    1 @Bean
    2 @LoadBalanced
    3 public RestTemplate getRestTemplate(){
    4 return new RestTemplate();
    5 }

  6. 更改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 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(通常服务名唯一,所以列表如果不为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 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 forEntity = restTemplate.getForEntity(url, String.class);
    42 return forEntity.getBody();
    43 }
    44 }

附录

  1. 下载

        登入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.基本配置

不同点

微服务架构

单体架构

团队规模

微服务架构可以将传统模式下的单个应用,拆分为多个独立的服务,每个微服务都可以单独开发、部署和维护。每个服务从设计、开发到维护所需的团队规模小,团队管理成本小。

单体架构的应用程序通常需要一个大型团队,围绕一个庞大的应用程序工作,团队管理的成本大。

数据存储方式

不同的微服务可以使用不同的数据存储方式,例如有的用 Redis,有的使用 MySQL。

单一架构的所有模块共享同一个公共数据库,存储方式相对单一。

部署方式

微服务架构中每个服务都可以独立部署,也可以独立于其他服务进行扩展。如果部署得当,基于微服务的架构可以帮助企业提高应用程序的部署效率。

采用单体架构的应用程序的每一次功能更改或 bug 修复都必须对整个应用程序重新进行部署。

开发模式

在采用微服务架构的应用程序中,不同模块可以使用不同的技术或语言进行开发,开发模式更加灵活。

在采用单体架构的应用程序中,所有模块使用的技术和语言必须相同,开发模式受限。

故障隔离

在微服务架构中,故障被隔离在单个服务中,避免系统的整体崩溃。

在单体架构中,当一个组件出现故障时,故障很可能会在进程中蔓延,导致系统全局不可用。

项目结构

微服务架构将单个应用程序拆分为多个独立的小型服务,每个服务都可以独立的开发、部署和维护,每个服务都能完成一项特定的业务需求。

单体架构的应用程序,所有的业务逻辑都集中在同一个工程中。

2021.0.x aka Jubilee

2.6.x

2020.0.x aka Ilford

2.4.x, 2.5.x (Starting with 2020.0.3)

Hoxton

2.2.x, 2.3.x (Starting with SR5)

Greenwich

2.1.x

Finchley

2.0.x

Edgware

1.5.x

Dalston

1.5.x

功能

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