springcloud 基础

SprinbCloud微服务简介

架构发展历史

SpringBoot由baiPivotal团队在2013年开始研发、2014年4月发布第一个du版本的全新开源的轻量级框架。

它基zhi于Spring4.0设计,不dao仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决

在2014 年底, Spring 团队推出 Spring Cloud, 目标使其成为Java 领域微服务架构落地的标准

微服务架构概述

应用架构的发展

软件架构有三种架构类型,分别是业务架构、应用架构、技术架构。它们之间的关系是业务架构决定应用架构,技术 架构支撑应用架构。架构的发展历程是从单体架构、分布式架构、SOA 架构再到微服务架构。

单体应用架构

单体架构在Java领域,就是一个war包,包含了所有的应用功能。按照mvc结构,是从controller到service到dao。

单体架构的优点:
  1. 易千开发:开发人员使用当前开发工具在短时间内就可以开发出单体应用。
  2. 易于测试:因为不需要依赖其他接口,测试可以节约很多时间。
  3. 易于部署:你只需要将目录部署在运行环境中即可。
单体架构的缺点:
  1. 灵活度不够:如果程序有任何修改,修改的不只是一个点,而是自上而下地去修改,
    测试时必须等到整个程序部署完后才能看出效果。在开发过程可能需要等待其他开发
    人员开发完成后才能完成部署,降低了团队的灵活性。
  2. 降低系统的性能:原本可以直接访问数据库但是现在多了一层。即使只包含一个功能 点,也需要在各个层写上代码。
  3. 系统启动慢:一个进程包含了所有业务逻辑,涉及的启动模块过多,导致系统的启动
    时间延长。
  4. 系统扩展性比较差:增加新东西的时候不能针对单个点增加,要全局性地增加。牵一 发而动全身
分布式架构

按照业务垂直切分,每个应用都是单体架构,通过API 互相调用

面向服务的SOA架构

SOA 是不同业务建立不同的服务,服务之间的数据交互粗粒度可以通过服务接口分级,这样松散耦合提高服务的可重用性,也让业务逻辑变得可组合,并且每个服务可以根据使用情况做出合理的分布式部署,从而 让服务变得规范,高性能,高可用

SOA 架构中有两个主要角色: 服务提供者 ( Pro vider ) 和服务消费者 ( Consumer )。阿里开源的 Dubbo 是 SOA 的典型实现。

SOA 架构的优点:
  1. 把模块拆分,使用接口通信,降低模块之间的耦合度。
  2. 把项目拆分成若干个子项目,不同的团队负责不同的子项目。
  3. 增加功能时只需要增加一个子项目,调用其他系统的接口即可。
  4. 可以灵活地进行分布式部署。
SOA 架构的缺点:

系统之间的交互需要使用远程通信, 接口开发增加工作量

微服务架构

微服务是一种架构风格, 对于一个大型复杂的业务系统,它的业务功能可以拆分为多个相互独立的微服务,各个微服务之间是松耦合的, 通过各种远程协议进行同步/异步通信,各微服务均可以被独立部署、扩/缩容以及升/降级

基于SpringCloud 的 微服务解决方案

Spring Cloud 的技术选型是中立的, 因此可以随需更换搭配使用

服务发现:Eureka Consul etcd、阿里 Nacos
共用组件:服务间调用组件Feign、负载均衡组件 Ribbon、熔断器 Hytrix
网关:性能低: Zuul; 性能高: Spring Cloud Gateway 自研网关中间件
配置中心:Spring Cloud Config、携程阿波罗、阿里 Nacos
全链路监控:zikpin 、Pinpoint 、Skywalking

基于Dubbo 实现微服务解决方案

什么是Sp ring Cloud

Spring Cloud 也是一个中间件,Spring 官方开发维护, 基千 Spring Boot 开发, 提供一套完整的微服务解决方案。包括服务注册与发现、配置中心、全链路监控、API 网关、熔断器等选型中立的开源组件, 可以随需扩展和替换组装.

SpringCloud回顾一下哈

SpringCloud都有哪些组件

1.服务的注册和发现 eureka
2.服务的负载和调用 ribbon\restTemplate LoadBlance Fengin
3.服务熔断和降级 hystris
4.服务网关 Zuul and GatetWay
5.服务分布式配置 手动刷新 自动刷新 读取本地配置文件
6.SpringCloudAlibaba

springcloud 回顾 (二)

1)eureka 单机环境、
2)eureka集群环境
3)消费端调用 单一的服务端 ribbon+restTemplate
4)消费端调用 集群的服务端 ribbon+restTemplate +loadbance + 通过服务名调用 ;在集群环境中,服务端save接口需要新增注解@RequestBoday
5)eureka 自我保护机制是什么 ?默认是开启自我保护机制的,验证自我保护机制
6)修改ribbon负载均衡规则 ,他有哪些负载均衡规则,负载均衡的实现原理是什么?
7)服务发现,discoveryclient,获取注册到eureka上的服务信息
8)restTemplate getForObject/postForObject getForEntity/postForEntity
9) 服务注册到eureka上显示服务名称和ip信息
10)使用zookeeper作为注册中心,将服务端注册到zookeeper,消费端从zookeeper中获取服务信息调用服务端接口。

使用到的注解:
@SpringBootApplication
@EnableEurekaClient
@EnableEurekaServer
@RibbonClient(value = “CLOUD-PAYMENT-SERVICE”,configuration = {MyRibbonConfig.class})
@Configuration
@LoadBlance
@Bean
@RestController
@Slf4j
@Resource
@Autowrite
@RequestBody
@Value
@PostMapping
@GetMapping
@Service
@Mapper

Spring Cloud Eureka

服务发现及注册中心 在微服务时代为什么会出现?

在微服务时代, 底层运维方式发生了巨大的变化 , 随着Docker 的流行, 业务服务不再部署在固定的虚拟机上, 其 ip 地址也不再固定, 这个时候前面的解决方案就显得捉襟见肘了。针对合格问题,不同的思考方式提出了不同的解决方案,这里列举几个。

方案一: 以 Nginx 为例, 在没有引入服务注册中心的时候, 那就是手工或是通过脚本的方式, 在部署的时候去更新 Nginx 的配置文件, 然后 reload。抑或是使用 ngx_http_dyups_module 通过 rest api 来在运行时直接更新upstream 而不需要 reload。

方案二:将服务注册中心作为一个标配的分布式服务组件,网关等都从服务注册中心获取 相关服务的实例信息 , 实现动态路由。比如 consul-template+ Nginx 的方案, 通过 consul 监听服务实例变化, 然后更新 Nginx 的配置文件, 通过 reload 实现服务列表更新。又拍云的slardar 也是这个思路, 不过不是通过 reload 的方式来, 而是通过在运行时通过 consul 获取服务列表来实现动态 upstream 的路由。

由此可见,随着服务架构模式以及底层运维方式的变化,服务注册中心逐步在分布式系统 架构中占据了一个重要的地位

Eureka简介

Eureka 是 Netflix 公司开源的一款服务发现组件, 该组件提供的服务发现可以 为负载均衡、failover 等提供支持 。Eureka 包括 Eureka Server 及Eureka Client。Eureka
Server 提供 REST 服务, 而 Eureka Client 则是使用 Java 编写的客户端, 用千简化与 Eureka
Server 的交互。

Eureka Server 端采用的是P2P 的复制模式, 但是它不保证复制操作一定能成功, 因此它提供的是一个最终一致性的服务实例视图; Client 端在Server 端的注册信息有一个带期限的租约, 一旦 Serv er 端在指定期间没有收到Client 端发送的心跳, 则 Server 端会认为 Client 端注册的服务是不健康的, 定时任务会将其从注册表中删除。

Consul 与 Eureka 不同, Consul 采用
Raft 算法, 可以提供强一致性的保证 , Consul 的 agent 相当千 Netflix Ribbon+ Netflix Eureka。

Client, 而且对应用来说相对透明, 同时相对千Eur eka 这种集中式的心跳检测机制, Consul 的
agent 可以参与到基于 gossip 协议的健康检查,分 散了 Serv er 端的心跳检测压力。除此之外,
Consul 为多数据中心提供了开箱即用的原生支持等。

那么基于什么考虑因素可以选择Eureka 呢, 主要有如下几点:
  1. 如果团队是Ja va 语言体系的, 则偏好Java 语言开发的, 技术体系上比较统一, 出问题也好排查修复,对组件的掌控力较强,方便扩展维护。

  2. 当然除此之外 , 更主要的是 Eureka 是 Netfli x 开源套件的一部分 , 跟 zu ul , ri bbon 等
    整合的比较好。

Spring Cloud Eureka 案例代码

根项目 springclouddemo pom.xml

  4.0.0
  springclouddemo
  chapter2-1
  0.0.1-SNAPSHOT
  pom
  
  	chapter2-1-eureka-server
  	chapter2-1-eureka-client
  
  
  
        org.springframework.boot
        spring-boot-starter-parent
        2.0.3.RELEASE
         
    

    
        UTF-8
        UTF-8
        1.8
        Finchley.RELEASE
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            spring-snapshots
            Spring Snapshots
            https://repo.spring.io/snapshot
            
                true
            
        
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/milestone
            
                true
            
        
    

    
        
            spring-snapshots
            Spring Snapshots
            https://repo.spring.io/snapshot
            
                true
            
        
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/milestone
            
                true
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    
  

Client
chapter2-1-eureka-client pom.xml

  4.0.0
  
    springclouddemo
    chapter2-1
    0.0.1-SNAPSHOT
  
  chapter2-1-eureka-client

	
		UTF-8
		UTF-8
		1.8
	

	
		
			org.springframework.cloud
			spring-cloud-starter-netflix-eureka-client
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	
  

chapter2-1-eureka-client application.yml
spring:
  profiles:
    active: demo
chapter2-1-eureka-client application-demo.yml.yml
server:
  port: 8081

spring:
  application:
    name: demo-client1

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
chapter2-1-eureka-client 启动类ChapterEurekaClientApplication
package cn.springcloud.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class ChapterEurekaClientApplication {
	public static void main(String[] args) {
		SpringApplication.run(ChapterEurekaClientApplication.class,args);
	}
}

Server
chapter2-1-eureka-server pom.xml

  4.0.0
  
    springclouddemo
    chapter2-1
    0.0.1-SNAPSHOT
  
  chapter2-1-eureka-server

	
		UTF-8
		UTF-8
		1.8
		Finchley.RELEASE
	

	
		
			org.springframework.cloud
			spring-cloud-starter-netflix-eureka-server
		
	

	
		
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

chapter2-1-eureka-server application.yml
spring:
  profiles:
    active: standalone #激活哪个配置文件 
  jackson:
    date-format: yyyy-mm-dd HH:mm:ss  #设置时间格式
    serialization:
      FAIL_ON_EMPTY_BEANS: false  # 忽略无法转换的对象
eureka:
  server:
    use-read-only-response-cache: false  #是否使用只读的response-cache 默认true
    response-cache-auto-expiration-in-seconds: 10 #设置readWriteCacheMap的expireAfterWrite参数,指定写入多长时间后过期 默认 180s
management:  
  endpoints:
    web:
      exposure:
        include: '*'     # 公开所有的监控端点
chapter2-1-eureka-server application-standalone.yml
server:
  port: 8761   #server 存在的端口号

eureka:
  instance:
    hostname: localhost  # eureka server 存活的ip
  client:
    registerWithEureka: false # 表示是否将自己注册到Eureka Server,默认为true。由于当前这个应用就是Eureka Server,故而设为false
    fetchRegistry: false  #表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
  server:
      waitTimeInMsWhenSyncEmpty: 0  #当从其他节点同步实例信息为空时等待的时间   默认 5 * 60 * 1000
      enableSelfPreservation: false #是否开启自我保护  默认 true
chapter2-1-eureka-server 启动类ChapterEurekaServerApplication
package cn.springcloud.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class ChapterEurekaServerApplication {
	public static void main(String[] args) {
		SpringApplication.run(ChapterEurekaServerApplication.class,args);
	}
}

springcloud 基础_第1张图片

eureka-server

https

eureka-admin

metadata 路由实例

结合ribbon,实现灰度发布或者不宕机升级

SpringCloud ribbon负载均衡规则继承关系

springcloud 基础_第2张图片

springcloud-feign

springcloud开发微服务的时候,各个微服务之间的通信都是以http接口的形式对外提供服务,因此在服务消费者调用服务提供者时,底层还是使用的是http-client的方式访问。
可以使用一下方式:
1.URLConnection
2.Apache HttpClient
3.RestTemplate

Feign的特新

  1. 基于注解方式
  2. 支持http编码器和解码器
  3. 支持http请求的压缩
  4. 支持hystrix和他的fallback
  5. 支持ribbon的负载均衡

feignClient 注解中的fallback = XXXX.class

  1. 验证结果:在FeignClient 中使用的 fallback = XXX.class 这种方式,仅仅能在服务端宕机时起作用,如果客户端中 出现异常,则依旧不会降级 。

SpringCloud Sleuth分布式请求链路追踪

  1. 配置Java环境,下载zipkin-server-2.12.2-exec.jar,java -jar 启动该jar包
    在地址栏访问 http://localhost:9411/zipkin/
  2. 在服务提供者和服务消费者对应的工程的pom中添加
  <dependency>
     <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-zipkin</artifactId>
  </dependency>
  1. 在服务提供者和消费者对应的yml中新增如下篇日志
spring:
	……
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
    probability: 1

springcloud 基础_第3张图片
springcloud 基础_第4张图片

SpringCloudAlibaba 学习笔记


学习地址:

Spring Cloud Alibaba Reference Documentation

seata: http://seata.io/zh-cn/

http://seata.io/zh-cn/docs/overview/what-is-seata.html

sentinel:https://github.com/alibaba/Sentinel

nacos: https://github.com/alibaba/nacos/releases/tag/1.3.0

nacos
服务提供者 2

消费者 1

http://localhost:9001/payment/nacos/1

http://localhost:83/consumer/payment/nacos/1

nacos 既支持Ap 也支持CP

可以通过命令进行切换

配置中心

多项目

多环境

namespace+group+dataid

namespace集群环境

group:

nacos 集群配置 + 持久化配置

linux版本

sentinel
gitbub地址:https://github.com/alibaba/Sentinel

–异常 DegradeException

–sentinel的熔断机制是没有半开的这种状态的,要么死要么活

–先通断后降级

1.默认是懒加载机制,执行一次才能访问,下载jar包,8080端口,查看前台服务

2.初始化工程,簇点链路、流控模式

3.流控规则

基本介绍

流控模式

直接(默认)

直接快速失败 QPS(进入到程序之前) 线程数(进入到程序之后)

在快速访问失败之后,是否有用户自定义的失败提示呢

不一定都是blocked by sentinel (flow limiting ) ????

Blocked by Sentinel (flow limiting)

关联

B惹事情,A挂了

链路

多个请求访问同一个微服务

流控效果

快速失败

预热 冷启动的方式 warm up

一下子启动10万的请求,直接打死微服务

阈值

冷加载因子coldfoctoe 默认是3

:阈值/冷加载因子 才会达到阈

— 秒杀系统

排队等待

匀速排队 — 漏桶算法???

4.降级规则 也叫降级策略

RT

平均相应时长 妙级 + 时间窗口期(QPS>=5) 同时满足 触发该规则

RT最大4900 可以通过命令设置 -Dcsp.sentinel.max.rt=XXXX

异常比例

设置的范围是【0到1】之间

分钟级

QPS>=5 + 异常比例数>阈值 触发降级

时间窗口期 过了之后 关闭降级

异常数

当资源1分钟之内的异常数达到阈值后进行熔断

分钟级

异常数达到阈值就会触发降级

时间窗口期??? 过了之后 关闭降级

5.热点key限流

https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

仅仅支持QPS模式

@SentinelResource 兜底方法

@GetMapping(“/test”)

@SentinelResource(value = “myMethod”,blockHandler = “m2”)

public Result doSomething(@RequestParam(“uid”)String uid ,Required = false ,

@RequestParam(“type”)int type,Required = false)

{

// some logic here…

}

//兜底方法

public Result m2(String uid, int type ,BlockException exception) {

}

—如果没有兜底方法,则显示错误页面

配置索引为0,检测的是请求方法中的第一个参数

路径显示

XXXXXX/test?uid=1111 效果Ok

XXXXXX/test?type=000 效果not ok --因为没有做配置索引

参数例外项:

参数支持:8中基本类型和String类型

在高级选项中做设置

在这种情况下出现异常时,则不做做处理

@SentinelResource:主管配置出错,运行出错则需要走异常处理

6.系统规则

LOAD

RT

线程数

入口QPS

CPU使用率

7.@SentinelResource

按照资源名称限流+后续处理

按照url地址限流+后续处理

兜底方法存在的问题

系统默认的,没有体现出业务要求

代码狗和,不直观

每个业务方法都有一个兜底方法,代码膨胀

全局统一的处理方法没有体现

客户自定义限流处理逻辑

更多注解属性说明

8.服务熔断功能

sentinel整合ribbon+openfeign+fallback

ribbon

启动nacos、sentinel

提供者9003/9004

建module

pom

yml

主启动类

业务类

测试地址

消费者84

配置config类,引入resttemplate

@SentinelResource(value = “myMethod”,blockHandler = “m2”,fallback = “m2”,exceptionsToIngore = {})

openfeign

加pom

yml中增加fengin对sentinel的支持

fengin:

sentinel:

enable:true

主启动了增加openfengin注解支持

新增接口,@FenginClient(value = “”,fallback = XXX.class)

新增fallbackServiceImpl实现类,即XXX

熔断框架比较

9.规则持久化

配置到nacos中

在sentinel中配置的流控规则,重新启动sentinel后,规则就没有了

pom

增加sentinel-datasource-nacos

yml

增加nacos 数据源配置

seata spribgcloudAlibaba分布式事务框架
1.分布式事务的问题

2.seata介绍

http://seata.io/zh-cn/docs/overview/terminology.html

全局事务ID

三个组件:

TC - 事务协调者

维护全局和分支事务的状态,驱动全局事务提交或回滚。

TM - 事务管理器

定义全局事务的范围:开始全局事务、提交或回滚全局事务。

RM - 资源管理器

管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

处理过程

1.TM向TC申请开启一个全局事务.全局事务创建成功并生成一个全局唯一XID

2.XID在微服务调用链路的上下文中传播

3.RM向TC注册分支事务,将其纳入XID对应全局事务管理

4.TM向TC发起针对XID的全局提交或者回滚决议

5.TC调度XID下管辖的全局分支事务完成提交或者回滚请求

3.seata-server安装 相当于一个分布式事务服务器

官网地址

下载版本

修改seataconf中的file.conf中的配置

备份原来的文件

主要修改:自定义事务组名称+事务日志存储模式+数据库连接信息

file.conf

service模块

:自定义事务组名称

store模块

:事务日志存储模式 为DB

在mysql数据库中创建数据库

在创建好的数据库中插入数据(seata 自带的sql)

修改register.conf配置文件

调整seata的注册地址为nacos,配置nacos的地址信息

启动nacos 端口号8848

启动seata

4.订单/库存/业务账户数据库准备

启动nacos、seata两个服务

三个微服务 订单 库存 账户

下订单-扣库存-减余额-该订单状态

创建三个数据库seata_order订单、seata_storage库存、seata_account账户

在三个数据库中创建对应的业务表

按照上述三个库创建对应的回滚日志表:在srata conf有一个叫 db_undo_log.sql

5.订单/库存/业务账户微服务准备

Order_mudule

创建module stata-order-service2001

pom

yml

file.conf

register.conf

domain(传输实体、表实体)

DAO实现

Service接口和实现

Controller

config配置

主启动类

Storge_mudule

Account_mudule

6.test

—树逻辑


高可用、低延迟、高QPS

分布式事务ID

为什么UUID会导致入库性能变差?

1.无需,无法预测他的生成顺序,不能通过递增有序的数字

2.注解,ID作为主键在特定的环境中会存在一些问题

3.索引,B+树索引分裂

数据库自增主键

单机:

集群分布式:

基于redis生成全局唯一ID

increase increaseby

除了设置步长以外,还需要关注过期时间

配置麻烦XXXX

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