Spring Cloud

随堂笔记

这是随堂笔记, 详细内容请参考在线笔记:
https://blog.csdn.net/weixin_38305440

笔记乱码问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VUYUWw5L-1606731518849)(note.assets/image-20200613174552258.png)]

课程安排(17到18天)

  1. Spring Cloud(6)
  2. RabbitMQ(2)
  3. Lucene Solr(1)
  4. Docker(2)
  5. Kubernetes(3)
  6. 分布式事务(3)
  7. RocketMQ(1)

王海涛

Spring Cloud

环境

  • IDEA 或 Eclipse(STS插件)

  • Lombok

  • Maven

    • 如果下载依赖有问题,更换阿里仓库和中央仓库
    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                              https://maven.apache.org/xsd/settings-1.0.0.xsd">
    	<localRepository>D:\home\java\maven_repository</localRepository>
    
    	<mirrors>
    		<!--  打开阿里仓库,使用阿里仓库更新依赖
                  注释调用阿里仓库,使用中央仓库更新依赖
            -->
    		<mirror>
    			<id>alimaven</id>
    			<name>aliyun maven</name>
    			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    			<mirrorOf>central</mirrorOf>
    		</mirror>
    
    	</mirrors>
    </settings>
    
  • 微信:wanght6666666

  • 笔记:code.tarena.com.cn

  • csdn 笔记:https://blog.csdn.net/weixin_38305440/article/details/108609574

  • 代码仓库:https://gitee.com/benwang6/cgb2007

spring cloud是什么

  • spring cloud 是一个工具集

    • 集成多个工具,来解决微服务中的各种问题
    • 微服务全家桶
  • spring cloud 不是什么?

    • spring cloud 不是一个解决单一问题的工具
  • 远程调用 - RestTemplate

  • 负载均衡 - Ribbon

  • 重试 - Ribbon

  • 降级、熔断、限流 - Hystrix

  • 监控 - Hystrix Dashboard、Turbine、Sleuth、Zipkin

  • 配置中心 - Config server

  • 课程要求

    必须严格按照笔记做

    笔记中都是完整代码

    做的过程中不能直接 cv ,要自己手敲!!!

    如果遇到问题解决不了时,把前面做的一步代码cv一遍!!!

    业务模块

    02-item

    03-user

    04-order

    1. 工具类 - 不用自己写,在gitee或github搜索

      CookieUtil、JsonUtil、JsonResult

    2. TypeReference

      指定转换的类型: new TypeReference<List>() {}

    3. @RequestBody

      用来接收参数,从请求的协议体,完整接收协议体数据

    注册和发现

    注册中心产品:

    ​ zookeeper、eureka、nacos、consul、etcd…

    eureka

    1. 注册

      服务提供者启动时,向eureka一次次反复注册,直到注册成功为止

    2. 拉取注册表

      服务发现者每30秒拉取一次注册表(刷新注册表)

    3. 心跳

      服务提供者每30秒发送一次心跳数据

      eureka连续3次收不到一个服务的心跳,会删除这个服务

    4. 自我保护模式

      特殊情况

      如果由于网络不稳定或中断,15分钟内,85%以上服务器出现心跳异常,就会自动进入保护模式。

      在保护模式下,所有服务都不删除

      网络恢复后,可以自动退出保护模式,恢复正常

      开发期间很容易达到保护模式的条件,会影响测试,在开发期间可以关闭保护模式

      eureka 和 zookeeper 区别:

      • eureka:
        • 强调AP(可用性)
        • 集群结构:对等结构
      • zookeeper:
        • 强调CP(一致性)
        • 集群结构:主从结构

    搭建eureka服务器

    1. 新建 springboot 项目
    2. 添加 eureka server 依赖
    3. yml配置
      1. 主机名
      2. 禁用保护模式
      3. 针对单台服务器,配置不向自己注册,也不从自己拉取注册表
    4. 启动类注解 @EnableEurenaServer,通过注解触发自动配置

    单台 eureka 服务器启动后报错: Connect to localhost:8761 timed out

这是自动配置的一个默认集群服务器,但是这个默认服务器不存在,所以出错

后面自己搭建了集群服务,默认服务器就不会再自动配置

作业

1. **提前下载最新依赖**

课前资料\pom.xml

新建一个 maven 项目,把 pom.xml 代码粘进去,修改版本

  • springboot:2.4.0

  • springcloud: 2020.0.0-M5

    • pom.xml末尾添加
      <repositories>
            <repository>
              <id>spring-milestones</id>
                <name>Spring Milestones</name>
              <url>https://repo.spring.io/milestone</url>
            </repository>
      </repositories>
    

    然后更新依赖

    1. 安装新版 VMware

先卸载旧版本(江哥虚拟机镜像不会受影响)

再安装新版本

尽量用最新VMware,新版本对资源使用、运行效率都会有优化。

课前资料中提供了两个版本

  • 15.5.2

  • 12.x - 旧电脑cpu不支持虚拟化技术,可以使用12.x

官网还有有最新的 16 版本

Springboot 和 Springcloud 版本

  • springboot: 2.3.5.RELEASE
  • springcloud: Hoxton.SR9

02、03、04、05,都改

服务提供者

修改hosts文件,添加 eureka1 和 eureka2 的映射配置

C:\Windows\System32\drivers\etc\hosts

127.0.0.1  eureka1
127.0.0.1  eureka2

修改 02、03、04 这三个项目

  1. 添加 eureka client 依赖
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>
				spring-cloud-starter-netflix-eureka-client
			</artifactId>
		</dependency>
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Hoxton.SR9</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
  1. yml配置eureka的注册连接地址: http://eureka1:2001/eureka
eureka:
  client:
    service-url:
      defaultZone: http://eureka1:2001/eureka

sp02商品,和 sp05 eureka 集群

在另一个端口上再启动一个商品服务

java -jar item.jar  # 根据application.yml的配置来启动

# 指定端口启动
java -jar item.jar --server.port=8002  # 命令行参数可以覆盖yml配置

远程调用

RestTemplate

springboot 提供的远程调用工具

类似于 HttpClient,可以发送 http 请求,并处理响应。RestTemplate简化了Rest API调用,只需要使用它的一个方法,就可以完成请求、响应、Json转换

方法:

  • getForObject(url, 转换的类型.class, 提交的参数)
  • postForObject(url, 协议体数据, 转换的类型.class)

RestTemplate 和 Dubbo 远程调用的区别:

  • RestTemplate:
    • http调用
    • 效率低
  • Dubbo:
    • RPC调用,Java的序列化
    • 效率高

Ribbon

Springcloud集成的工具,作用是负载均衡,和重试

负载均衡

Ribbon 对 RestTemplate 做了封装,增强了 RestTemplate 的功能

  1. 获得地址表
  2. 轮询一个服务的主机地址列表
  3. RestTemplate负责执行最终调用

添加负载均衡

  1. ribbon依赖
  2. @LoadBalanced 注解,对 RestTemplate 进行功能增强
  3. 修改调用地址,使用 服务id,而不是具体主机地址

Ribbon 重试

一种容错机制,当调用远程服务失败,可以自动重试调用

添加重试:

  1. 添加 spring-retry 依赖

  2. 配置重试参数

    1. 在yml中配置
    • MaxAutoRetries:单台服务器的
    • MaxAutoRetriesNextServer:更换服务器的次数
    1. 在java代码中设置
    • ConnectTimeout:与远程服务建立网络连接的超时时间
    • ReadTimeout:连接已建立,请求已发送,等待响应的超时时间

Hystrix

系统容错工具

  • 降级
    • 调用远程服务失败(宕机、500错、超时),可以降级执行当前服务中的一段代码,向客户端返回结果
    • 快速失败
  • 熔断
    • 当访问量过大,出现大量失败,可以做过热保护,断开远程服务不再调用
    • 限流
    • 防止故障传播、雪崩效应

降级

  1. hystrix依赖
  2. 启动类添加注解 @EnableCircuitBreaker
  3. 添加降级代码
// 当调用远程服务失败,跳转到指定的方法,执行降级代码
@HystrixCommand(fallbackMethod="方法名")
远程调用方法() {
	restTemplate.getForObject(url,......);
}

Hystrix超时

Hystrix有默认的超时时间:1秒

Hystrix超时要大于ribbon总的重试时间,否则,ribbon重试可能无效

Hystrix 熔断

短路器打开的条件:

  • 10秒内20次请求(必须首先满足)
  • 50%失败,执行了降级代码

短路器打开后,所有请求直接执行降级代码

断路器打开几秒后,会进入半开状态,客户端调用会尝试向后台服务发送一次调用,

如果调用成功,断路器可以自动关闭,恢复正常

如果调用仍然失败,继续保持打开状态几秒钟

Hystrix 故障监控 - Hystrix Dashboard

Hystrix 利用 Actuator 工具,来暴露 Hystrix 的故障日志

Actuator

springboot 提供的日志监控工具,可以暴露项目中多种监控信息

  • 健康状态
  • 系统环境变量
  • spring容器中所有的对象
  • spring mvc映射的所有路径

添加 actuator

  1. 添加 actuator 依赖
  2. yml 配置暴露监控数据
    • m.e.w.e.i="*" 暴露所有的监控
    • m.e.w.e.i=health 只暴露健康状态
    • m.e.w.e.i=[“health”, “beans”, “mappings”] 暴露指定的多个监控

搭建 Hystrix Dashboard

仪表盘项目可以是一个完全独立的项目,与其他项目都无关,也不用向注册表注册

  1. hystrix dashboard 依赖
  2. @EnableHystrixDashboard
  3. yml - 允许对哪台服务器开启监控
hystrix:
  dashboard:
    proxy-stream-allow-list: localhost

Feign

远程调用:RestTemplate

ribbon

hystrix

集成工具

  • 远程调用:声明式客户端
  • ribbon 负载均衡和重试
  • hystrix 降级和熔断

声明式客户端接口

只需要声明一个抽象接口,就可以通过接口做远程调用,不需要再使用 RestTemplate 来调用

// 调用远程的商品服务,获取订单的商品列表
// 通过注解,配置:
// 1. 调用哪个服务
// 2. 调用服务的哪个路径
// 3. 向路径提交什么参数数据
@FeignClient(name="item-service")
public interface ItemClient {
    @GetMapping("/{orderId}")
    JsonResult<List<Item>> getItems(@PathVariable String orderId);
}

在这里使用 @GetMapping("/{orderId}"), 指定的是向远程服务调用的路径

Feign 集成 Ribbon

0配置,已经启用了负载均衡和重试

默认重试参数:

  • MaxAutoRetries: 0
  • MaxAutoRetriesNextServer: 1
  • ReadTimeout: 1000

虚拟机

  1. 解压缩虚拟机

课前资料\虚拟机\

  • centos-7-1908.zip

    适用于 VMware 15 以上的虚拟机

  • centos-7-1908-vmware-12.zip

    使用与 VMware 12 或以上的虚拟机

  1. 双击 centos-7-1908.vmx 文件(三个窗口图标)

  2. 启动这个虚拟机

    按提示选择“已复制虚拟机”

  3. 登录

    username: root

    password: root (输入密码时没有人反应,实际已经输入成功,直接回车)

重置 VMware 虚拟网络

VMware 的虚拟网络非常不稳定,经常出现问题

  • 没有ip
  • 没有网卡
  • 一切正常,但ping不通

重置VMware虚拟网络环境:

删除所有的虚拟网卡,再重新创建,初始化网络

  1. 编辑 - 虚拟网络编辑器
  2. 点右下角“更改设置”获得管理员权限
  3. 左下角“还原默认设置”按钮

设置 NAT 网络网段: 192.168.64.0

编辑 - 虚拟网络编辑器

选择 VMnet8 网卡

下面网段设置成 192.168.64.0

设置 centos7-1908 的ip

# 在 /root/ 主目录下准备了两个脚本程序: ip-static 和 ip-dhcp
# 里面修改网卡的配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33
ll

cat ip-static
cat ip-dhcp

# 动态分配ip
./ip-dhcp
ifconfig

# 指定固定ip
./ip-static
ip: 192.168.64.8

ifconfig

如果网络服务 network.service 服务无法启动,可能是和 NetworkManager 服务发生冲突,可以禁用 NetworkManager

# 停止 NetworkManager 服务
systemctl stop NetworkManager

# 禁用 NetworkManager
systemctl disable NetworkManager

Rabbitmq 虚拟机

  1. 从 centos-7-1908 克隆: rabbitmq
  2. 设置 ip
./ip-static
ip: 192.168.64.140
  1. 用 mobaxterm 连接 rabbitmq

  2. 上传rabbitmq的离线安装文件

    1. 解压 rabbitmq-install.zip
    2. 上传 rabbitmq-install 文件夹到 /root/

Feign 集成 Hystrix

Feign默认不启用Hystrix,不推荐启用Hystrix(后面再分析)

启用Hystrix基础配置:

  1. hystrix起步依赖
  2. yml中配置启用hystrix
feign.hystrix.enabled=true
  1. 启动类添加注解 @EnableCircuitBreaker

添加降级代码:

@FeignClient(name="item-service", fallback=降级类.class)
public interface ItemClient {
    @GetMapping("/{orderId}")
    JsonResult<List<Item>> getItems(@PathVariable String orderId);
}

降级类需要实现声明式客户端接口,在实现的抽象方法中添加降级代码,

降级类需要添加 @Component 注解

Feign 集成 Hystrix,添加监控

  1. 添加 actuator 依赖
  2. 暴露 hystrix.stream 监控端点
  3. 查看监控日志
    1. 重启09
    2. 访问 http://localhost:3001/actuator/

订单中添加 feign,调用商品和用户

  1. 添加依赖
    • feign
    • hystrix
    • actuator
  2. yml
    • feign.hystrix.enabled=true
    • m.e.w.e.i=hystrix.stream
  3. 启动类注解
    • @EnableFeignClients
    • @EnableCircuitBreaker

Turbine

聚合 Hystrix 监控数据

连接多台服务器,抓取日志数据,进行聚合,

交给仪表盘在同一个监控界面进行展现

搭建 Turbine 服务

  1. 添加 Turbine、eureka client 依赖
  2. yml 配置
    • 聚合的服务id:order-service, aa, bb, cc
    • 为聚合的监控数据命名: cluster-name=new String(“default”)
  3. 启动类添加注解 @EnableTurbine

消息服务器

分布式系统中广泛应用消息服务

消息服务器:

  • rabbitmq
  • activemq
  • rocketmq
  • tubemq

Zuul

API 网关

  • 微服务系统统一的调用入口
  • 统一的权限校验
  • 集成ribbon
  • 集成hystrix

统一的调用入口

  1. zuul 依赖、eureka client依赖、sp01

  2. yml

    # 配置调用转发规则
    # 下面是 zuul 默认的转发规则
    # 如果不手动配置,zuul可以根据注册表的注册信息进行自动配置
    zuul:
      routes:
        item-service: /item-service/**
        user-service: /user-service/**
        order-service: /order-service/**
    
  3. 启动类注解: @EnableZuulProxy

统一权限校验

通过 zuul 过滤器,可以判断用户是否有权限访问后台服务,如果没有权限可以阻止用户继续访问

判断用户是否登录,登录猜允许访问商品服务

http://localhost:3001/item-service/u45y45435 没有登录不允许访问

http://localhost:3001/item-service/u45y45435?token=y45343t4 有token认为登录过,允许访问

添加过滤器

  1. 继承 ZuulProxy
  2. 添加 @Component

zuul 会对过滤器进行自动配置

zuul 集成 ribbon

默认启用了 ribbon 的负载均衡

默认不启用重试,zuul不推荐启用重试

启用重试:

  1. spring-retry 依赖

  2. yml

    zuul.retryable=true
    
  3. 重试参数

    有默认参数,可以根据需要进行调整

zuul 集成 hystrix

0配置,已经启用了hystrix

添加降级代码

  1. 实现 FallbackProvider 接口,在子类中实现降级代码
  2. @Component

zuul的自动配置,会自动配置降级类

Zuul 和 Feign

  • 都可以调用后台服务
  • 都可以集成 ribbon
  • 都可集成 hystrix

zuul

  • 部署在所有微服务项目之前

  • 网关一般是一个独立的服务,与业务无关

  • 不推荐启用重试

    会造成后台服务压力翻倍

    重试尽量不部署在最前面,越往后越好

feign

  • 部署在微服务内部,服务和服务之间调用

  • 不推荐启用 hystrix

    一般在最前面进行降级和熔断,类似于电箱断路器,只在入户位置部署,

    不在微服务内部部署hystrix,否则会引起混乱

准备仓库

  1. 新建module: config,当做一个文件夹,用来存放配置文件
  2. 把 2,3,4,11 项目的配置文件,放到 config 文件夹
  3. springcloud1 工程目录创建本地仓库
    1. VCS - Import into version control - Create git repository
    2. 选择 springcloud1 工程目录设置成本地仓库
  4. 把本地仓库提交推送到gitee远程仓库
    1. ctrl + k 或 VCS - commit
    2. 勾选要提交的文件,填写提交信息,点击提交
    3. ctrl+shift+k 或 VCS - git - push
    4. 点击左上角 define remote

配置中心

  1. config server 依赖

  2. yml

    远程仓库 uri: https://gitee.com/ningning1599510557/springcloud1
    搜索的子目录: config
    
    如果是私有仓库,还要提供用户名和密码
    
  3. @EnableConfigServer

配置中心客户端

修改 2,3,4,11 项目

  1. config client 依赖

  2. 新建配置文件: bootstrap.yml

    bootstrap.yml 是引导配置文件,它先于application.yml加载

  3. bootstrap.yml 添加配置

    1. 连接eureka, 从注册表得到配置中心的地址
    2. 连接配置中心
    3. 从配置中心下载指定的配置文件

rabbitmq工作模式

合理分发消息

  1. 通过回执,通知服务器消息处理完成

    • 通过回执,服务器可以知道消费者有没有处理完消息
  2. qos=1

    每次只从服务器抓取一条消息,这条消息处理完成之前,不会抓取下一条,

    必须在手动ACK模式下 qos设置才有效

消息持久化

防止服务器崩溃、重启造成消息丢失,需要把消息保存在磁盘

  1. 队列持久化

    c.queueDeclare(“队列名”, true, …

  2. 消息持久化

    c.basicPublish("", “队列名”, MessageProperties.PERSISTENT_TEXT_PLAIN, 消息)

导入拼多商城项目

  1. 导入数据库
    1. sqlyog 右键点击连接
    2. 选择“从sql转储文件导入”
    3. 亿发课前资料\solr\04-拼多数据库\pd.sql
    4. 导入完成后,右键点击连接,刷新
  2. 新建 Empty Project:pd
  3. 导入模块
    1. D:\home\lesson\课前资料\亿发课前资料\solr\06-拼多项目\pd-web.zip
    2. 解压到 pd 工程目录
    3. 按两下shift,搜索 add maven(添加maven)
    4. 选择 pd-web 下的pom.xml 导入
  4. 数据库连接
    1. 如果用 oracle mysql 8 需要调整数据库驱动和连接参数
    2. 驱动用新版本 8.0.21
    3. yml 中驱动类改成 com.mysql.cj.jdbc.Driver
    4. 连接参数添加 &serverTimezone=GMT%2B8
  5. mapper.xml
    1. 项目中mapper.xml直接放在了java目录下
    2. 需要把xml文件移动到 resources 目录下
  6. 设置工程的jdk
  7. 启动配置,设置 working directory,设置成pd-web模块目录
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值