热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringCloudAlibaba史上最全电子书(阿里云学习中心整理)

《SpringCloudAlibaba》2020本电子书内容来源于每特教育在阿里云学习中心上架课程《精通SpringCloudAlibaba》,主讲人:

 

Spring Cloud Alibaba》2020

本电子书内容来源于每特教育在阿里云学习中心上架课程《精通Spring Cloud Alibaba》,主讲人:余胜军,由开发者社区志愿者黄良诗、李美儒进行整理

史上最全SpringCloudAlibaba视频教程 百度云(含视频和文档)

链接:https://pan.baidu.com/s/1OHX3B2Q97gn1K6wfZsURLw

密码:00yk

SpringCloudAlibaba史上最全电子书(阿里云学习中心整理)电子书(只包含文档不包含视频)

链接:https://pan.baidu.com/s/1uQc9-Bs7ArOqCz-_KnNc1g 

提取码:n14n


Spring Cloud Alibaba课程说明

Spring Cloud Alibaba由每特教育|蚂蚁课堂出品

该课程主要讲解Spring Cloud Alibaba核心组件 Nacos(服务注册与发现和分布式配置中心)、Sentinel(服务保护框架)、Seata(分布式事务解决框架)、阿里云OSS、Alibaba Cloud SchedulerX等。

注意事项:该课程需要有一定的SpringBoot基础知识,如果对SpringBoot不了解的话、可以在蚂蚁课堂中学习SpringBoot基础内容。


微服务架构演变过程

传统单体架构——分布式架构——SOA面向服务架构——微服务架构模式


传统架构

传统的架构,也就是为单点应用,也就是大家在早期所学习的JavaEE知识SSH或者SSM架构模式,会采用分层架构模式:数据库访问层、业务逻辑层、控制层,从前端到后台所有的代码都是一个开发者去完成。

该架构模式没有对我们业务逻辑代码实现拆分,所有的代码都写入到同一个工程中里面,适合于小公司开发团队或者个人开发。

com.mayikt.controler---springmvc 视图层 jsp/ftl

com.mayikt.service---业务逻辑层

com.mayikt.dao---数据库访问层

将项目的代码都放入到同一个项目,部署在同一个Tomat中。

该架构模式存在哪些优缺点:

优点:开发简单、运维简单

缺点:该架构模式没有对我们的业务逻辑实现拆分,所有的代码都写入到同一个项目中,

只适合小团队或者个人形式开发,不适合团队模式协同工作开发

这种架构模式最大的缺点,如果该系统一个模块出现不可用、会导致整个系统无法使用。

应用场景:政府项目、管理系统、crm、oa适合于个人小团队开发。


分布式架构

分布式架构模式是基于传统的架构模式演变过来,将传统的单点项目根据业务模块实现拆分、会拆分为会员系统、订单系统、支付系统、秒杀系统等。 从而降低我们项目的耦合度,这种架构模式开始慢慢的适合于互联网公司开发团队。 

如果项目团队人数较多需要进行项目拆分。需要把单体项目不同的系统。大型公司和大型开发团队多用这种团队开发的模式。

不同的系统如何连成一块呢?需要通过域名跳转。

会员系统:memner.mayikt.com

支付系统pay.mayikt.com

命名系统化:包含服务和视图层


SOA面向服务架构

不同系统间的会话是如何进行绑定的呢?需要用到SSO单点登入系统。

 

SOA架构模式也称作为:面向服务架构模式、俗称面向与接口开发,将共同存在的业务逻辑抽取成一个共同的服务,提供给其他的服务接口实现调用、服务与服务之间通讯采用rpc远程调用技术。

通过SSO系统能解决代码冗余的问题。

服务:只是有接口 没有控制层 没有视图层

com.mayikt.service

com.mayikt.dao

 

这种模式叫作SOA面向业务逻辑的开发。

SOA架构模式特点:


  1. SOA架构通讯中,采用XML方式实现通讯、在高并发下通讯过程中协议存在非常大冗余性,所以在最后微服务架构模式中使用JSON格式替代了XML。
  2. SOA架构模式实现方案为Web Service或者是ESB企业服务总线 底层通讯协议SOAP协议(Http+XML)实现传输。

 

传统政府、银行项目还是保留的在使用Web Service

互联网公司肯定采用http+json形式实现运输


基于IDEA快速构建Web Service

Web Service服务器

@WebService
public class UserService {@WebMethodpublic String getUser(Long id) {return "mayikt用户:" + id;}public static void main(String[] args) {Endpoint.publish("http://192.168.18.218:8089/service/UserService", new UserService());System.out.println("服务发布成功");}
}

http://192.168.18.218:8089/service/UserService?wsdl  获取wsdl

wsdl文件描述接口的调用地址 服务的接口 方法 参数等。

Web Service客户端

 

public class WebServiceClient {public static void main(String[] args) throws ServiceException, RemoteException {UserServiceServiceLocator userServiceServiceLocator = new UserServiceServiceLocator();UserService userService = userServiceServiceLocator.getUserServicePort();String result = userService.getUser(10L);System.out.println("result:" + result);}
}

 


微服务架构

微服务架构产生的原因

微服务架构基于SOA架构演变过来的

在传统的Web Service架构中有如下问题:


  1. 依赖中心化服务发现机制
  2. 使用Soap通讯协议,通常使用XML格式来序列化通讯数据,xml格式非常喜欢重,比较占宽带传输。
  3. 服务化管理和治理设施不完善

微服务架构模式

SOA架构模式存在哪些缺点:

1、采用SOAP协议实现通讯,xml传输非常重,效率比较低。

2、服务化管理和治理设施不够完善

3、依赖与中心服务发现机制

4、不适合于前后分离架构模式

前端分离技术就是对我们控制层和业务层逻辑实现区分,

前端控制可以采用vue调用我们后端接口(http+json)

微服务架构基本概念

微服务架构模式是从SOA架构模式演变过来, 比SOA架构模式粒度更加精细,让专业的人去做专业的事情(专注),目的是提高效率,每个服务与服务之间互不影响,微服务架构中

每个服务必须独立部署、互不影响,微服务架构模式体现轻巧、轻量级、适合于互联网公司开发模式。

微服务架构倡导应用程序设计程多个独立、可配置、可运行和可微服务的子服务。

服务与服务通讯协议采用Http协议,使用restful风格API形式来进行通讯,数据交换格式轻量级json格式通讯,整个传输过程中,采用二进制,所以http协议可以跨语言平台,并且可以和其他不同的语言进行相互的通讯,所以很多开放平台都采用http协议接口。

微服务架构与SOA架构的不同

1.微服务架构基于 SOA架构 演变过来,继承 SOA架构的优点,在微服务架构中去除 SOA 架构中的 ESB 企业服务总线,采用 http+json(restful)进行传输。

2.微服务架构比 SOA 架构粒度会更加精细,让专业的人去做专业的事情(专注),目的提高效率,每个服务于服务之间互不影响,微服务架构中,每个服务必须独立部署,微服务架构更加轻巧,轻量级。

3.SOA 架构中可能数据库存储会发生共享,微服务强调独每个服务都是单独数据库,保证每个服务于服务之间互不影响。

4.项目体现特征微服务架构比 SOA 架构更加适合与互联网公司敏捷开发、快速迭代版本,因为粒度非常精细。

 

ESB企业服务总线:解决多系统之间跨语言无法实现通讯的问题,对我们数据协议实现转换,可以提供可靠的消息传输,第三方框架实现。

一般情况下都是采用Http+JSON格式传输,所以没有必要使用ESB企业服务总线。

微服务架构产生那些问题

分布式事务解决方案(rabbitmq/rocketmq/lcn(已经淘汰)/ Seata)

分布式任务调度平台(XXL-Job、阿里Scheduler)

分布式日志采集系统ELJ+Kafka

分布式服务注册中心 eureka、Zookeeper、consule、nacos等。

分布式服务追踪与调用链Zipkin等。

非常重要的概念:独立部署、可配置、动态化

为什么我们要使用SpringCloud

SpringCloud并不是rpc远程调用框架,而是一套全家桶的微服务解决框架,理念就是解决我们在微服务架构中遇到的任何问题。

服务治理:eureka

分布式配置:config

客户端调用工具rest/feign客户端 rpc远程调用

说明:阿里巴巴、腾讯、百度

注意:大家如果去一些比较大型的互联网公司中,整个公司内部实现rpc通讯的框架、服务助治理都是内部自己研发

Rpc远程调用框架有哪些?

Httpclient、dubbo、feign、grpc、基于netty手写rpc

SpringCloud第一代与第二代的区别

 

SpringCloud第一代:

SpringCloud Config 分布式配置中心

SpringCloud Netflix 核心组件

Eureka:服务治理

Hystrix:服务保护框架

Ribbon:客户端负载均衡器

Feign:基于ribbon和hystrix的声明式服务调用组件

Zuul: 网关组件,提供智能路由、访问过滤等功能。

SpringCloud第二代(自己研发)和优秀的组件组合:

Spring Cloud Gateway 网关

Spring Cloud Loadbalancer 客户端负载均衡器

Spring Cloud r4j(Resilience4J) 服务保护

Spring Cloud Alibaba Nacos 服务注册

Spring Cloud Alibaba Nacos 分布式配置中心

Spring Cloud Alibaba Sentinel服务保护 

SpringCloud Alibaba Seata分布式事务解决框架

Alibaba Cloud OSS 阿里云存储

Alibaba Cloud SchedulerX 分布式任务调度平台

Alibaba Cloud SMS 分布式短信系统

为什么Alibaba要推出SpringCloud组件

目的就是为了对阿里云的产品实现扩展。

SpringCloud与Spring Cloud Alibaba的区别

Spring Cloud Alibaba实际上对我们的SpringCloud实现了拓展组件能够完美整合到SpringCloud rpc远程调用整合。

1、nacos分布式注册中心,分布式配置中心SpringCloudEureka+Config组合

2、目的是为了推广阿里云产品,如果使用了Spring Cloud Alibaba建议最好使用Alibaba Mq rocketmq

分布式任务调度

总结:Spring Cloud Alibaba实际上对我们的SpringCloud做拓展组件开发naoocs、setata分布式解决框架、scheduler、Alibaba Cloud OSS等目的推广阿里云产品。


服务注册与发现nacos

Nacos产生的背景

Nacos分布式注册与发现功能|分布式配置中心

产生背景rpc远程调用中,服务的url的治理

Rpc的远程调用框架 HttpClient、gprc、dubbo、rest、openfeign等。

传统的rpc远程调用中存在哪些问题

1、超时的问题

2、安全的问题

3、服务与服务之间URL地址管理

在我们微服务架构通讯,服务之间依赖关系非常大,如果通过传统的方式管理我们服务的url地址的情况下,一旦地址发生变化的情况下,还需要人工修改rpc远程调用地址。


每个服务的url管理地址发出复杂,所以这是我们采用服务url治理技术,可以实现对我们整个实现动态服务注册与发现、本地负载均衡、容错等。


服务治理基本的概念

服务治理概念: 

在RPC远程调用过程中,服务与服务之间依赖关系非常大,服务Url地址管理非常复杂,所以这时候需要对我们服务的url实现治理,通过服务治理可以实现服务注册与发现、负载均衡、容错等。

rpc远程调用中,地址中 域名和端口号/调用的方法名称:

域名和端口号/调用的方法名称

192.168.212.110:8080/getUser

把每个服务器地址信息和端口人工存放到数据库表中

Id  serviced           ip     端口号

Mayikt-member    192.168...   8082

Mayikt-member    192.168...   8081

基于数据库形式实现服务url治理

缺点:维护成本非常高、没有完全绝对实现动态智能

思考是否有更好的方案?  微服务中的注册中心

整个微服务架构中最为核心的肯定是 注册中心。

注册中心:实际就是存放我们的服务的地址信息,能够实现动态感知。

注册中心:Dubbo依赖Zookeeper、Eureka、Consul、Nacos、Redis、数据库

 


服务注册中心的概念

每次调用该服务如果地址直接写死的话,一旦接口发生变化的情况下,这时候需要重新发布版本才可以该接口调用地址,所以需要一个注册中心统一管理我们的服务注册与发现。

注册中心:我们的服务注册到我们注册中心,key为服务名称、value为该服务调用地址,该类型为集合类型。Eureka、consul、zookeeper、nacos等。

服务注册:我们生产者项目启动的时候,会将当前服务自己的信息地址注册到注册中心。

服务发现: 消费者从我们的注册中心上获取生产者调用的地址(集合),在使用负载均衡的策略获取集群中某个地址实现本地rpc远程调用。


微服务调用接口常用名词

面试的过程:Nacos与Eureka区别、Eureka与Zookeeper

整个微服务的注册中心实现原理

生产者:提供接口被其他服务调用

消费者:调用生产者接口实现消费

服务注册:将当前服务地址注册到

服务发现:

 

服务注册原理实现:

1、生产者启动的时候key=服务站的名称 value ip 和端口号 注册到我们的微服务注册中心上。

Mayikt-member  192.168.212.110:8080

Mayikt-member  192.168.212.110:8081

 

2、注册存放服务地址列表类型:key唯一,列表是list集合。

May

{

Mayikt-member:["192.168.212.110.8080"]

}

 

3、我们的消费者从我们注册中心上根据服务名称查询服务地址列表(集合)

Mayikt-member===["192.168.212.110.8080" "192.168.212.110.8081"]

 

4、消费者获取到集群列表之后,采用负载均衡器选择一个地址实现rpc远程调用


Nacos的基本的介绍

 

Nacos可以实现分布式服务注册与发现/分布式配置中心框架。

官网的介绍: https://nacos.io/zh-cn/docs/what-is-nacos.html


Nacos的环境的准备

Nacos可以在linux/windows/Mac版本上都可以安装

具体安装教程地址:https://nacos.io/zh-cn/docs/quick-start.html

 

手动实现服务注册与发现

1.实现服务注册
发送post请求:

'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

2.实现服务发现

http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName

详细步骤操作:https://nacos.io/zh-cn/docs/quick-start.html


Nacos整合SpringCloud

Maven依赖信息

org.springframework.bootspring-boot-starter-parent2.0.0.RELEASE
org.springframework.bootspring-boot-starter-weborg.springframework.cloudspring-cloud-starter-alibaba-nacos-discovery0.2.2.RELEASE

 

创建工程,需要选择1.8

 

之后创建生产者,其中版本最好一致,否则会产生报错现象。

 

 

如何实现服务的注册?

 

 

接口完成后,对会员进行注册。

拿到配置文件,对项目命名

 

再进行代码测试,自动实现对服务进行注册

 


会员服务(生产者)

服务接口

@RestController
public class MemberService {@Value("${server.port}")private String serverPort;/*** 会员服务提供的接口** @param userId* @return*/@RequestMapping("/getUser")public String getUser(Integer userId) {return "每特教育,端口号:" + serverPort;}
}

配置文件

application.yml文件

spring:cloud:nacos:discovery:###服务注册地址server-addr: 127.0.0.1:8848application:name: mayikt-member
server:port: 8081

 


订单服务(消费者)

订单调用会员服务

@RestController
public class OrderService {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@Autowiredprivate LoadBalancer loadBalancer;/*** 订单调用会员服务** @return*/
//    @RequestMapping("/orderToMember")
//    public String orderToMember() {
//        // 从注册中心上获取该注册服务列表
//        List serviceInstanceList = discoveryClient.getInstances("mayikt-member");
//        ServiceInstance serviceInstance = serviceInstanceList.get(0);
//        URI rpcMemberUrl = serviceInstance.getUri();
//        // 使用本地rest形式实现rpc调用
//        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
//        return "订单调用会员获取结果:" + result;
//    }@RequestMapping("/orderToMember")public String orderToMember() {// 从注册中心上获取该注册服务列表List serviceInstanceList = discoveryClient.getInstances("mayikt-member");ServiceInstance serviceInstance = loadBalancer.getSingleAddres(serviceInstanceList);URI rpcMemberUrl = serviceInstance.getUri();// 使用本地rest形式实现rpc调用String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);return "订单调用会员获取结果:" + result;}
}

 

新建项目之后,第一步,根据服务名称从 注册中心获取集群列表地址

;第二步,根据列表任意选择一个 实现本地rpc调用rest

 

 

 

 

注意:RestTeanmlate它不是SpringCloud写的,本身Spring支持Http协议调用  实现Http 调用

负载均衡算法


public interface LoadBalancer {


    /**
     * 根据多个不同的地址 返回单个调用rpc地址
     *
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddres(List serviceInstances);
}

 

@Component
public class RotationLoadBalancer implements LoadBalancer {
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public ServiceInstance getSingleAddres(List serviceInstances) {
        int index = atomicInteger.incrementAndGet() % 2;
        ServiceInstance serviceInstance = serviceInstances.get(index);
        return serviceInstance;
    }
}

 

 

 

 

Rpc远程调用设计到本地负载均衡算法

 

1、从注册中心获取服务集群的列表

2、从列表选择一个  负载均衡算法有哪些

A、一致性hash计算

B、轮训、权重

C、随机

 

采用什么设计模式  策略模式

 

假设我们两台服务器集群

访问次数%集群size

 

1%2=1

2%2=0

3%2=1

4%2=0

 

1%1=0

 

 


推荐阅读
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
  • [我们是谁?] ... [详细]
  • [翻译]微服务设计模式5. 服务发现服务端服务发现
    服务之间需要互相调用,在单体架构中,服务之间的互相调用直接通过编程语言层面的方法调用就搞定了。在传统的分布式应用的部署中,服务地 ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • TiDB | TiDB在5A级物流企业核心系统的应用与实践
    TiDB在5A级物流企业核心系统的应用与实践前言一、业务背景科捷物流概况神州金库简介二、现状与挑战神州金库现有技术体系业务挑战应对方案三、TiDB解决方案测试迁移收益问题四、说在最 ... [详细]
author-avatar
火影魂XJ_710
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有