Spring Cloud Alibaba 教程

目录

目录

  • 微服务架构演变过程
    • 传统架构
    • 分布式架构
    • ESB企业服务总线
  • 基于IDEA快速构建Web Service
    • Web Service服务器端
  • 微服务架构
    • 微服务架构产生的原因
    • 微服务架构模式
  • 微服务架构基本概念
    • 微服务架构与SOA架构的不同
    • 微服务架构会产生那些问题
    • 为什么Alibaba要推出SpringCloud组件
    • SpringCloud与Spring Cloud Alibaba的区别
    • 服务注册与发现nacos
    • 传统的rpc远程调用中存在哪些问题
    • 服务注册中心的概念
    • 微服务调用接口常用名词
    • Nacos的基本的介绍
  • Nacos 整合 SpringCloud
    • Maven 依赖信息
    • 会员服务(生产者)

微服务架构演变过程

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

传统架构

传统架构: 就是我们在以前所学习到SSM、SSH 、分层架构模式。
com.baojiaren.controller --控制层 控制页面跳转 整合ftl/jsp 渲染页面
com.baojiaren.service —业务逻辑
com.baojiaren.dao—数据访问层。 mybatis、hibernate等。
前端到后端都是一个人开发的
将所有的业务逻辑代码全部都放入在同一个jar包中,没有实现解耦,
如果中间有一个小的模块,引发宕机的情况下,会导致整个系统无法使用。
优点:
1.部署简单、开发容易(不需要学习分布式技术 比如 rpc框架 分布式解决方案)
无法实现抗高并发。
应用场景:政府项目、管理系统、ERP、OA、人事管事系统 并发量比较少。
缺点:
2.没有实现解耦、不适合于多团队人数开发,容易引发代码提交冲突问题。

传统的架构,也就是为单点应用,也就是大家在早期所学习的JavaEE知识SSH或者SSM架构模式,会采用分层架构模式:数据库访问层、业务逻辑层、控制层,从前端到后台所有的代码都是一个开发者去完成。
该架构模式没有对我们业务逻辑代码实现拆分,所有的代码都写入到同一个工程中里面,适合于小公司开发团队或者个人开发。
com.baojiaren.controler—springmvc 视图层 jsp/ftl
com.baojiaren.service—业务逻辑层
com.baojiaren.dao—数据库访问层
将项目的代码都放入到同一个项目,部署在同一个Tomat中。

该架构模式存在哪些优缺点:
优点:开发简单、运维简单
缺点:该架构模式没有对我们的业务逻辑实现拆分,所有的代码都写入到同一个项目中,
只适合小团队或者个人形式开发,不适合团队模式协同工作开发

这种架构模式最大的缺点,如果该系统一个模块出现不可用、会导致整个系统无法使用。
应用场景:政府项目、管理系统、crm、oa适合于个人小团队开发。

分布式架构

分布式架构模式基于传统架构演变过来的,会根据不同的业务实现拆分n多个不同子系统。
会员系统–
订单系统
支付系统
秒杀系统
交易系统。
案例:京东官网。
每个子系统中都有自己的团队来实现开发,具有独立数据库、独立缓存、独立mq。
降低我们系统的耦合度,从而可以实现多团队开发。
系统:----- 管理系统+前台用户使用系统
京东官网:
www.jd.com
https://jiadian.jd.com/– 京东家电子系统
https://miaosha.jd.com/ 秒杀子系统
https://auction.jd.com/home.html 拍卖子系统

www.jd.com— 顶级域名
子域名
Pay.baojiaren.com —支付系统 解析ip
最终实际根据多个不同域名实现跳转整合成一个大项目。

优点:
可以实现解耦、如果某子系统宕机的情况下,不会影响其他的子系统,适合于多团队人数实现开发。
缺点:
部署比较复杂的、开发难度比较大、需要有团队沟通成本。

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

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

会员系统:memner.baojiaren.com
支付系统pay.baojiaren.com
命名系统化:包含服务和视图层
SOA面向服务架构

SOA面向服务架构模式,面向接口开发 面向业务逻辑层开发。
就是将整个项目中共同的业务逻辑抽取成一个单独的项目,该项目命名是为
服务,提供给其他的服务实现调用,调用的过程中就会设计到RPC远程调用技术。

RPC调用技术:feign、httpclient、gpc、基于netty手写dubbo、dubbo
优点:
减少我们代码冗余性问题。
SOA架构特征:
1.传输协议http+xml格式 soap协议 xml数据交换格式传输 可能比较占用带宽,
影响到传输的效率问题。
2.技术实现基于webservice实现

Webservice CXF-----
Webservice 只有在一些银行类、保险

注意:服务与系统命名有那些区别?

会员系统—会员管理平台—会员门户网站—会员服务接口 视图层和接口
会员服务----接口 没有视图层。

创建一个会员pc端项目—
com.baojiaren.controler—springmvc 视图层 jsp/ftl
com.baojiaren.service—业务逻辑层
com.baojiaren.dao—数据库访问层

创建一个会员H5端项目—
com.baojiaren.controler—springmvc 视图层 jsp/ftl
com.baojiaren.service—业务逻辑层
com.baojiaren.dao—数据库访问层

唯一区别就是在控制层、跳转不同端(来源PC还是H5)展示页面有可能有一些区别。

创建一个会员pc端 web项目—
com.baojiaren.controler—springmvc 视图层 jsp/ftl

创建一个会员H5web端项目—
com.baojiaren.controler—springmvc 视图层 jsp/ftl

-----将该业务逻辑层抽取单独的一个项目
com.baojiaren.service—业务逻辑层
com.baojiaren.dao—数据库访问层

不同系统间的会话是如何进行绑定的呢?需要用到SSO单点登入系统。
Spring Cloud Alibaba 教程_第1张图片
SOA架构模式也称作为:面向服务架构模式、俗称面向与接口开发,将共同存在的业务逻辑抽取成一个共同的服务,提供给其他的服务接口实现调用、服务与服务之间通讯采用rpc远程调用技术。

通过SSO系统能解决代码冗余的问题。
服务:只是有接口 没有控制层 没有视图层
com.baojiaren.service
com.baojiaren.dao
这种模式叫作SOA面向业务逻辑的开发。

SOA架构模式特点:
1.SOA架构通讯中,采用XML方式实现传输数据、在高并发下通讯过程中协议存在非常大冗余性,所以在最后微服务架构模式中使用JSON格式替代了XML。
SOA架构模式实现方案为Web Service或者是ESB企业服务总线 底层通讯协议SOAP协议(Http+XML)实现传输。
Spring Cloud Alibaba 教程_第2张图片
传统政府、银行项目还是保留的在使用Web Service
互联网公司肯定采用http+json形式实现运输

ESB企业服务总线

解决多系统之间跨语言通讯,数据协议的转换,提供可靠消息传输。

基于IDEA快速构建Web Service

Web Service服务器端

@WebService
public class UserService {

    @WebMethod
    public String getUser(Long id) {
        return "宝家人用户:" + 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客户端
Spring Cloud Alibaba 教程_第3张图片
注意:一定要启动服务发布者,在启动客户端生成调用webservice类。

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、不适合于前后分离架构模式

微服务项目架构:SpringCloud+ Vue
前后端分离架构:

拆分
前端和后端不在是一个人开发,分成多个不同人开发。
前端架构—
后端架构-----

前端:vue技术
后端:java/php/.net---- http协议+json格式+restfu
前端分离技术就是对我们控制层和业务层逻辑实现拆分,
前端控制可以采用vue调用我们后端接口(http+json)

微服务架构基本概念

1.项目架构模式:
前后端分离:

2.粒度拆分:
微服务架构模式是从SOA架构模式演变过来, 比SOA架构模式粒度更加精细,让专业的人去做专业的事情(专注),目的是提高效率,每个服务与服务之间互不影响,微服务架构中
每个服务必须独立部署、互不影响,微服务架构模式体现轻巧、轻量级、适合于互联网公司开发模式。
3.协议:
服务与服务通讯协议采用Http协议,使用restful风格API形式来进行通讯,数据交换格式轻量级json格式通讯,整个传输过程中,采用json,所以http协议可以跨语言平台,并且可以和其他不同的语言进行相互的通讯,所以很多开放平台都采用http协议接口。
Spring Cloud Alibaba 教程_第4张图片

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

1.微服务架构基于 SOA架构 演变过来,继承 SOA架构的优点,在微服务架构中去除 SOA 架构中的 ESB 企业服务总线,采用 http+json(restful)进行传输。
2.微服务架构比 SOA 架构粒度会更加精细,让专业的人去做专业的事情(专注),目的提高效率,每个服务于服务之间互不影响,微服务架构中,每个服务必须独立部署,微服务架构更加轻巧,轻量级。
3.SOA 架构中可能数据库存储会发生共享,微服务强调独每个服务都是单独数据库,保证每个服务于服务之间互不影响。
4.项目体现特征微服务架构比 SOA 架构更加适合与互联网公司敏捷开发、快速迭代版本,因为粒度非常精细。

ESB企业服务总线:解决多系统之间跨语言无法实现通讯的问题,对我们数据协议实现转换,可以提供可靠的消息传输,第三方框架实现。
一般情况下都是采用Http+JSON格式传输,所以没有必要使用ESB企业服务总线。

微服务架构会产生那些问题

优点:
让专业的人做专业的事情,前后端分离架构模式,可以提高效率 适合于互联网敏捷开发模式。
缺点:
部署、运维、管理非常复杂。

1.分布式事务-------seata解决
2.服务治理— 解决服务接口地址依赖关系 nacos eureka
3.分布式服务追踪
4.分布式任务调度平台 分片定时任务 xxl-job
5.分布式日志采集 elk
6.分布式配置中心 动态化管理配置文件 nacos

分布式事务解决方案(rabbitmq/rocketmq/lcn(已经淘汰)/ Seata)
分布式任务调度平台(XXL-Job、阿里Scheduler)
分布式日志采集系统ELk+Kafka
分布式服务注册中心 eureka、Zookeeper、consule、nacos等。
分布式服务追踪与调用链Zipkin等。
非常重要的概念:独立部署、docker/k8s/可配置、动态化

为什么大厂不使用SpringCloud

1.在知名互联网企业中,基本上不会使用springcloud 内部根据自己业务自己定制分布式框架。
2.在大厂互联网公司中,基本上所有分布式基础设施组件都是自己写的,因为需要根据自己
公司内部的业务定制框架,所有分布式框架架构设计思想基本上都是一样。
注意:如果在后期去大厂面试的同学记得,一定要学习微服务架构思想和原理
为什么我们要使用SpringCloud
SpringCloud并不是rpc远程调用框架,而是一套全家桶的微服务解决框架,理念就是解决

我们在微服务架构中遇到的任何问题。
服务治理:eureka
分布式配置:config
客户端调用工具rest/feign客户端 rpc远程调用

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

Rpc远程调用框架有哪些?
Httpclient、dubbo、feign、grpc、基于netty手写rpc
SpringCloud第一代与第二代的区别
Spring Cloud Alibaba 教程_第5张图片

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治理技术,可以实现对我们整个实现动态服务注册与发现、本地负载均衡、容错等。
Spring Cloud Alibaba 教程_第6张图片
服务治理基本的概念
服务治理概念:
在RPC远程调用过程中,服务与服务之间依赖关系非常大,服务Url地址管理非常复杂,所以这时候需要对我们服务的url实现治理,通过服务治理可以实现服务注册与发现、负载均衡、容错等。

Spring Cloud Alibaba 教程_第7张图片
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、数据库
Spring Cloud Alibaba 教程_第8张图片

服务注册中心的概念

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

注册中心:我们的服务注册到我们注册中心,key为服务名称、value为该服务调用地址,该类型为集合类型。Eureka、consul、zookeeper、nacos等。
服务注册:我们生产者项目启动的时候,会将当前服务自己的信息地址注册到注册中心。

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

微服务调用接口常用名词

面试的过程:Nacos与Eureka区别、Eureka与Zookeeper
整个微服务的注册中心实现原理
生产者:提供接口被其他服务调用
消费者:调用生产者接口实现消费
服务注册:将当前服务地址注册到
服务发现:
Spring Cloud Alibaba 教程_第9张图片
服务注册原理实现:
1、生产者启动的时候key=服务站的名称 value ip 和端口号 注册到我们的微服务注册中心上。
Mayikt-member 192.168.212.110:8080
Mayikt-member 192.168.212.110:8081

2、注册存放服务地址列表类型:key唯一,列表是list集合。
May
{
baojiaren-member:[“192.168.212.110.8080”]
}

3、我们的消费者从我们注册中心上根据服务名称查询服务地址列表(集合)
baojiaren-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
Spring Cloud Alibaba 教程_第10张图片

Nacos 整合 SpringCloud

Maven 依赖信息

<parent>
<groupId>org.springframework.bootgroupId>
     <artifactId>spring-boot-starter-parentartifactId>
     <version>2.0.0.RELEASEversion>
 parent>
<dependencies>
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        <version>0.2.2.RELEASEversion>
    dependency>
dependencies>

创建工程,需要选择1.8

Spring Cloud Alibaba 教程_第11张图片
![在这里插入图片描述](https://img-blog.csdnimg.cn/ef00fc0c67cc4ee38986b1ab8f39a11a.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4MTUyNDIz,size_16,color_FFFFFF,t_70在这里插入图片描述
如何实现服务的注册?

package com.baojiaren;

/**
 * @author ✎ℳ๓₯㎕.倾心❀、
 * @create 2021-07-30-21:09
 */
public class MemberService {

    /**
     * 会员服务提供的接口被订单服务调用
     *
     * @param userId
     * @return
     */
    public String getUser(Integer userId) {

        return "baojiaren";
    }
}

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

spring:
  cloud:
    nacos:
      discovery:
        server-addr: http://nacos.baojiarenteshan.com
application:
    name: baojiaren-service-api #服务名称
server:
  port: 9090        

接口完成后,对会员进行注册。
拿到配置文件,对项目命名

会员服务(生产者)

服务接口

@RestController
public class MemberService {
    @Value("${server.port}")
    private String serverPort;
     /**
     * 会员服务提供的接口
     * @param userId
     * @return
     */

每周末更新

你可能感兴趣的:(spring,cloud)