《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架构模式特点:
- SOA架构通讯中,采用XML方式实现通讯、在高并发下通讯过程中协议存在非常大冗余性,所以在最后微服务架构模式中使用JSON格式替代了XML。
- SOA架构模式实现方案为Web Service或者是ESB企业服务总线 底层通讯协议SOAP协议(Http+XML)实现传输。
传统政府、银行项目还是保留的在使用Web Service
互联网公司肯定采用http+json形式实现运输
基于IDEA快速构建Web Service
Web Service服务器端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@WebService public class UserService { @WebMethod public 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客户端
1 2 3 4 5 6 7 8 |
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架构中有如下问题:
- 依赖中心化服务发现机制
- 使用Soap通讯协议,通常使用XML格式来序列化通讯数据,xml格式非常喜欢重,比较占宽带传输。
- 服务化管理和治理设施不完善
微服务架构模式
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<key,list(string)>
{
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依赖信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> </parent> <dependencies> <!-- springboot 整合web组件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>0.2.2.RELEASE</version> </dependency> </dependencies> |
创建工程,需要选择1.8
之后创建生产者,其中版本最好一致,否则会产生报错现象。
如何实现服务的注册?
接口完成后,对会员进行注册。
拿到配置文件,对项目命名
再进行代码测试,自动实现对服务进行注册
会员服务(生产者)
服务接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@RestController public class MemberService { @Value("${server.port}") private String serverPort; /** * 会员服务提供的接口 * * @param userId * @return */ @RequestMapping("/getUser") public String getUser(Integer userId) { return "每特教育,端口号:" + serverPort; } } |
配置文件
application.yml文件
1 2 3 4 5 6 7 8 9 10 |
spring: cloud: nacos: discovery: ###服务注册地址 server-addr: 127.0.0.1:8848 application: name: mayikt-member server: port: 8081 |
订单服务(消费者)
订单调用会员服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
@RestController public class OrderService { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @Autowired private LoadBalancer loadBalancer; /** * 订单调用会员服务 * * @return */ // @RequestMapping("/orderToMember") // public String orderToMember() { // // 从注册中心上获取该注册服务列表 // List<ServiceInstance> 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<ServiceInstance> 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 { /** @Component @Override |
Rpc远程调用设计到本地负载均衡算法
1、从注册中心获取服务集群的列表
2、从列表选择一个 负载均衡算法有哪些
A、一致性hash计算
B、轮训、权重
C、随机
采用什么设计模式 策略模式
假设我们两台服务器集群
访问次数%集群size
1%2=1
2%2=0
3%2=1
4%2=0
1%1=0