springCloud-系统学习3- 创建微服务工程2

2023-11-18

2.11、 Feign应用

  1. 是对下面代码的优化
    在这里插入图片描述

  2. 自动根据参数拼接http请求地址

2.11.1、 操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

效果

在这里插入图片描述

2.12、Feign负载均衡及熔断

  1. Feign集成了ribbon配置项和Hystrix熔断的Fallback配置项,可以使用Feign来配置他。

  2. 为了方便测试,我们将一切的ribbon配置项和Hystrix项全部注释掉

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

2.12.1 Feign 负载均衡

在这里插入图片描述

在这里插入图片描述

2.12.2 Feign 服务熔断

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

关闭user-service看效果

在这里插入图片描述

2.12.3、 请求压缩

在这里插入图片描述

feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能

    compression:
      request:
        enabled: true # 开启请求压缩
        mime-types: text/html,application/xml,application/json # 设置压缩的数据类型
        min-request-size: 2048 # 设置触发压缩的大小下限
      response:
        enabled: true # 开启响应压缩

2.12.4、 日志级别

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

01、Feign 的Level级别
  1. NONE:不记录任何日志信息,这是默认值。
  2. BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  3. HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  4. FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。
02、测试结果

在这里插入图片描述

2.13、 Spring Cloud Gateway

  1. 基于Filter链提供网关基本功能:安全、监控、埋点、限流等。
  2. 为微服务架构提供简单、有效且统一的API路由管理方式。
  3. 是替代Netflix Zuul的一套解决方案。
  4. 组件的核心是一系列的过滤器
    1. 通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。
  5. 是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从
    而加强安全保护。
  6. 本身也是一个微服务,需要注册到Eureka服务注册中心。
  7. 核心功能
    1. 过滤
    2. 路由

2.13.1、 架构

在这里插入图片描述

  1. 不管是来自于客户端(PC或移动端)的请求,还是服务内部调用。一切对服务的请求都可经过网关,然后再由网关来实现鉴权、动态路由等等操作。
  2. Gateway就是我们服务的统一入口。

2.13.2、 概念

01、路由(route)
  1. 由一个ID、一个目的URL、一组断言工厂、一组Filter组成。
  2. 如果路由断言为真,说明请求URL和配置路由匹配。
02、断言(Predicate)
  1. Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。
  2. Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于Http Request中的任何
    信息比如请求头和参数。
03、过滤器(Filter)
  1. 一个标准的Spring WebFilter。
  2. Spring Cloud Gateway中的Filter分为两种类型
    1. Gateway Filter
    2. Global Filter。
  3. 过滤器Filter将会对请求和响应进行修改处理。

2.14、搭建网关服务,实现以下功能

  1. 搭建gateway-demo
  2. 将包含有/user的请求路由到user-service服务中

2.14.1、操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.14.2、结果

在这里插入图片描述

2.14.3、问题

  1. 我们现在可以直接通过网关访问user-service服务,那么consumer-demo已经没用了,那还需要consumer-demo吗?
    1. 个人理解consumer-demo已经没有用了。

2.15、面向服务的路由

  1. 在刚才的路由规则中,把路径对应的服务地址写死了!如果同一服务有多个实例的话,这样做显然不合理。
  2. 应该根据服务的名称,去Eureka注册中心查找服务对应的所有实例列表,然后进行动态路由!

2.15.1、操作

在这里插入图片描述

  1. lb 之后编写的服务名必须要在eureka中注册才能使用
  2. 动态路由:lb user-service(服务名)
    1. gateway将使用 LoadBalancerClient把user-service通过eureka解析为实际的主机和端口,并进行ribbon负载均衡。

2.15.2、结果

  1. 启动 user-service9091
  2. 启动 user-service9092
  3. 启动 gateway-demo
  4. 启动 eureka-server

在这里插入图片描述

在这里插入图片描述

2.16、路由前缀处理

  1. 可以对请求到网关服务的地址添加或去除前缀

2.16.1、添加前缀

  1. 对请求地址添加前缀路径之后再作为代理的服务地址
  2. http://127.0.0.1:10010/8 --> http://user-service/user/8
    1. 前缀路径/user

在这里插入图片描述

在这里插入图片描述

2.16.2、去除前缀

  1. 将请求地址中路径去除一些前缀路径之后再作为代理的服务地址

  2. http://127.0.0.1:10010/api/user/8 --> http://user-service/user/8

    1. 去除前缀路径/api
  3. 通过StripPrefix=n 来指定了路由要去掉的n个前缀,案例

    1. StripPrefix=1
      1. http://localhost:10010/api/user/8 --》http://user-servic/user/8
    2. StripPrefix=2
      1. http://localhost:10010/api/user/8 --》http://user-servic/8

在这里插入图片描述

在这里插入图片描述

2.17、Gateway的过滤器

  1. 命名规则
    1. XXXXGatewayFilterFactory

2.17.1、Gateway常见自带过滤器

  1. AddRequestHeader
    1. 对匹配上的请求加上Header
  2. AddRequestParameters
    1. 对匹配上的请求路由添加参数
  3. AddResponseHeader
    1. 对从网关返回的响应添加Header
  4. StripPrefix
    1. 对匹配上的请求路径去除前缀

在这里插入图片描述

2.17.2、过滤器类型

  1. 局部过滤器
    1. 通过 spring.cloud.gateway.routes.filters 配置在具体路由下
    2. 只作用在当前路由上;
    3. 自带的过滤器都可以配置或者自定义按照自带过滤器的方式。
      1. 如果配置spring.cloud.gateway.default-filters上会对所有路由生效
        1. 算是全局的过滤器;
    4. 实现上都要实现GatewayFilterFactory接口。
  2. 全局过滤器
    1. 不需要在配置文件中配置
    2. 作用在所有的路由上
    3. 实现 GlobalFilter 接口即可。

2.17.3、执行生命周期

  1. Gateway的Filter的生命周期也类似Spring MVC的拦截器
    1. 有两个:“pre"和"post”,分别会在请求被执行前和被执行后调用
    2. “pre"和"post”,可以通过过滤器的GatewayFilterChain执行filter方法前后来实现。

在这里插入图片描述

2.17.4、常见使用场景

  1. 请求鉴权:
    1. GatewayFilterChain 执行filter方法前,如果发现没有访问权限,直接就返回空。
  2. 异常处理:
    1. GatewayFilterChain执行filter方法后,记录异常并返回。
  3. 服务调用时长统计
    1. GatewayFilterChain执行filter方法前后根据时间统计。

2.17.5、配置全局默认过滤器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.17.6、自定义局部过滤器

在这里插入图片描述

在这里插入图片描述

结果

在这里插入图片描述

在这里插入图片描述

	package fei.zhou.gatewaydemo.filter;

	import java.util.Arrays;
	import java.util.List;

	import org.springframework.cloud.gateway.filter.GatewayFilter;
	import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
	import org.springframework.http.server.reactive.ServerHttpRequest;
	import org.springframework.stereotype.Component;

	@Component
	public class MyParam11GatewayFilterFactory extends AbstractGatewayFilterFactory<MyParam11GatewayFilterFactory.Config> {
		
		static final String PARAM_NAME = "param";
		
		public MyParam11GatewayFilterFactory() {
			super(Config.class);
		}
		
		@Override
		public List<String> shortcutFieldOrder() {
			return Arrays.asList(PARAM_NAME);
		}
		
		@Override
		public GatewayFilter apply(Config config) {
			return (exchange, chain) -> {
				// http://localhost:10010/user/8?name=userId config.param ==> name
				// 获取请求参数中param对应的参数名 的参数值
				ServerHttpRequest request = exchange.getRequest();
				if (request.getQueryParams().containsKey(config.param)) {
					request.getQueryParams().get(config.param).forEach(
							value -> System.out.println("------------局部过滤器-------参数名字:" + config.param + "--参数值:" + value));
				}
				return chain.filter(exchange);
			};
		}
		
		public static class Config {
			// 对应在配置过滤器的时候指定的参数名
			private String param;
			
			public String getParam() {
				return param;
			}
			
			public void setParam(String param) {
				this.param = param;
			}
		}
	}

2.17.7、 自定义全局过滤器

  1. 定义一个全局过滤器检查请求中是否携带有token参数
    1. 是:通过
    2. 否:不通过,告诉客户端401提示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

	package fei.zhou.gatewaydemo.filter;

	import org.apache.commons.lang.StringUtils;
	import org.springframework.cloud.gateway.filter.GatewayFilterChain;
	import org.springframework.cloud.gateway.filter.GlobalFilter;
	import org.springframework.core.Ordered;
	import org.springframework.http.HttpStatus;
	import org.springframework.stereotype.Component;
	import org.springframework.web.server.ServerWebExchange;

	import reactor.core.publisher.Mono;

	@Component
	public class MyGlobal11Filter implements GlobalFilter, Ordered {
		@Override
		public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
			System.out.println("--------------全局过滤器MyGlobal11Filter------------------");
			String token = exchange.getRequest().getQueryParams().getFirst("token");
			if (StringUtils.isBlank(token)) {
				// 设置响应状态码为未授权
				// UNAUTHORIZED(401, "Unauthorized"),
				exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
				return exchange.getResponse().setComplete();
			}
			return chain.filter(exchange);
		}
		
		@Override
		public int getOrder() {
			// 值越小越先执行
			return 1;
		}
	}

2.17.8、Gateway 负载均衡和熔断

  1. Gateway中默认集成了Ribbon负载均衡和Hystrix熔断机制。
  2. 所有的超时策略都是走的默认值,比如熔断超时时间只有1S,很容易就触发了。因此建议手动进行配置:

在这里插入图片描述

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            # 服务提供者的超时时间,2秒,如果请求服务提供者超过2秒,就服务降级和线程隔离
            timeoutInMilliseconds: 6000
ribbon:
  ConnectTimeout: 1000 # 连接超时时长
  ReadTimeout: 2000 # 数据通信超时时长
  MaxAutoRetries: 0 # 当前服务器的重试次数
  MaxAutoRetriesNextServer: 0 # 重试多少次服务
  OkToRetryOnAllOperations: false # 是否对所有的请求方式都重试

2.17.9、Gateway 跨域配置

  1. 一般网关都是所有微服务的统一入口,必然在被调用的时候会出现跨域问题。
  2. 可以在网关服务器中通过配置解决,允许哪些服务是可以跨域请求的。
01、跨域概念
  1. 在js请求访问中,如果访问的地址与当前服务器的域名、ip或者端口号不一致则称为跨域请求。
    1. http://localhost:8080中的js —访问—> http://localhost:9091的数据,因为端口不同,是跨域请求。
  2. 若不解决则不能获取到对应地址的返回结果。
02、解决跨域的配置

在这里插入图片描述

spring: 
  cloud:
    gateway: 
      globalcors:
        corsConfigurations:
          '[/**]':
            #allowedOrigins: * # 这种写法或者下面的都可以,*表示全部
            allowedOrigins:
              - "http://docs.spring.io"
            allowedMethods:
              - GET
  1. 可以允许来自 http://docs.spring.io 的get请求方式获取服务数据。
  2. allowedOrigins
    1. 指定允许访问的服务器地址,如http://docs.spring.io。
  3. ‘[/**]’
    1. 表示对所有访问到网关服务器的请求地址

2.17.10、 Gateway的高可用

  1. 启动多个Gateway服务,自动注册到Eureka,形成集群。
    1. 服务内部访问
      1. 访问Gateway,自动负载均衡,没问题。
    2. 外部访问(PC端、移动端…)
      1. 它们无法通过Eureka进行负载均衡,那么该怎么办?,Gateway怎么高可用?
        1. 可以使用Nginx来对Gateway进行代理

2.17.11、Gateway与Feign的区别

  1. Gateway
    1. 作为整个应用的流量入口,接收所有的请求,如PC、移动端等,并且将不同的请求转发至不同的处理微服务模块,其作用可视为nginx;
    2. 大部分情况下用作权限鉴定、服务端流量控制
  2. Feign
    1. 将当前微服务的部分服务接口暴露出来
    2. 主要用于各个微服务之间的服务调用

2.18、 Spring Cloud Config分布式配置中心

2.18.1、 分布式配置中心

  1. 支持配置文件放在配置服务本地
  2. 也支持放在远程Git仓库(GitHub、码云)
  3. 项目从配置中心拉取配置

2.18.2、 架构

在这里插入图片描述

2.18.3、 搭建配置中心微服务

01、创建码云的远程公开git仓库:spring_cloud_config
02、将user-Service的配置文件放到git仓库中,命名为userService-dev.yml
  1. 配置文件的2种命名方式
    1. {application}-{profile}.yml
    2. {application}-{profile}.properties
  2. 配置文件说明
    1. application:为应用名称
    2. profile:用于区分开发环境,测试环境、生产环境等
    3. 案例userService-dev.yml
      1. 微服务user-Service开发环境下使用的配置文件
03、搭建配置中心微服务

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

结果

在这里插入图片描述

2.18.4、 获取配置中心配置

  1. 改造用户微服务user-service,配置文件信息不再由微服务项目提供,而是从配置中心获取
01、 user-service 操作
  1. japplication.yml 备份为 application.yml.back
  2. 删除application.yml文件
  3. 新增bootstrap.yml文件

在这里插入图片描述

在这里插入图片描述

spring:
  cloud:
    config:
      # 要与仓库中的配置文件的application保持一致
      name: userService
      # 要与仓库中的配置文件的profile保持一致
      profile: dev
      #  git仓库中的配置文件所属的分支
      label: master
      discovery:
        # 使用配置中心
        enabled: true
        # 配置中心服务名
        service-id: config-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka

结果

在这里插入图片描述

2.19、 Spring Cloud Bus

  1. Spring Cloud Bus是用轻量的消息代理将分布式的节点连接起来,可以用于广播配置文件的更改或者服务的监控管理。
    1. 也就是消息总线可以为微服务做监控,也可以实现应用程序之间相互通信。
    2. Spring Cloud Bus可选的消息代理有RabbitMQ和Kafka。

2.19.1、 原先的配置中心修改了配置,不能及时同步到各个微服务

01、git 添加属性

在这里插入图片描述

02、user-service 设置打印属性

在这里插入图片描述

03、重启user-service 后,请求数据有返回

在这里插入图片描述

04、修改git属性,不重启user-service

在这里插入图片描述

在这里插入图片描述

2.19.2、 git仓库的配置文件更新,在不重启系统的情况下实现及时同步到各个微服务

01、 架构

在这里插入图片描述

02、 config-server配置操作

在这里插入图片描述

在这里插入图片描述

03、 user-service配置操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

04、更新配置

在这里插入图片描述

05、发布MQ通知

在这里插入图片描述

http://127.0.0.1:12000/actuator/bus-refresh
 
映射的配置
# 暴露触发消息总线的地址
    include: bus-refresh
06、查看结果(有实时更新)

在这里插入图片描述

代码地址
https://gitee.com/DanShenGuiZu/spring_cloud_config.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springCloud-系统学习3- 创建微服务工程2 的相关文章

随机推荐

  • oracle如修改表字段的类型(表中有数据)

    如何在数据表有数据的情况下 修改字段类型 看到如何修改表字段类型 我想大多数人都觉得直接用修改语句 ALTER TABLE 表名 MODIFY 列名 类型 如果是修改多个字段就在后面继续 modify ALTER TABLE 表名 MODI
  • Reactive的方式访问Redis

    前言 本文主要大概介绍一下响应式 反应式编程方式访问 redis 不能解决很多生产问题 只是帮助大家对响应式编程有一个认识 本文是以Reactive 对方式访问 Redis 当然也可以访问mongodb 以及部分关系型数据库 例如 Post
  • Channel的定义、写入、读取、关闭与遍历

    目录 1 Channel基础 为什么要引入Channel Channel简介 channel的定义 声明 channel的数据类型 引用类型 向channel中写入数据 从channel中读取数据 2 channel的遍历与关闭 chann
  • 51单片机按键控制数码管0~9_基于proteus的51单片机开发实例24-矩阵键盘(行列式键盘)...

    1 基于proteus的51单片机开发实例24 矩阵键盘 1 1 实验目的 图1 矩阵键盘电路 本实例我们来学习矩阵键盘 行列式键盘 的电路设计 编程实现 目的是通过较少的I O口来识别多个按键 1 2 设计思路 我们在前面已经学习过独立按
  • Maya_to_Unity工作流程

    注意事项 1 maya的place2Dtexture不起作用 只能使用pbs节点的uv调整 只能调整scale offect 所以贴图的rotate只能使用uv工具进行调整 2 Unity项目第一步将色彩空间设置为liner 3 灯光材质与
  • Keil中如何生成bin文件

    一般借助fromelf工具 安装好Keil后默认会在安装目录中找到fromelf工具 一般在windows平台很难像Linux平台一样使用命令的方式启动格式转换 但是类似IAR 或Keil等带编译器的IDE 都会有编译选项 即编译器或编译后
  • 秒杀详解!!秒杀竟有这些问题?再有人问秒杀,把这篇文章丢给他!!!

    什么是秒杀 seckill seckill是一个老生常谈的场景 它一般出现在电商系统中 在某些特定的节日 限定特定商品数量以超低折扣进行促销引流 按照秒杀的特性 特价商品一般在一两秒内被抢光 剩下的人只会出现售罄页面 这一两秒会出现一个瞬间
  • shadow文件中密码的加密方式

    shadow文件中密码的加密方式 1 查看shadow文件的内容 cat etc shadow 可以得到shadow文件的内容 限于篇幅 我们举例说明 root 1 Bg1H 4mz X89TqH7tpi9dX1B9j5YsF 14838
  • GANSS ALT71D键盘使用说明

    Ganss ALT71D键盘使用说明 两个月之前入手了这款双模键盘 到现在基本只使用蓝牙连接了 数据线太多了 太乱了 用了两个月之后有了一点经验 记录在这里 首先高斯键盘是有官网的 输入www ganss cn就可以看到两把104键的键盘了
  • 技术博客笔记大汇总

    hello 小伙伴们大家好 今天给小伙伴们推荐的开源项目是 YCBlogs 这个开源项目整合博客笔记等资料信息 15年10月到至今 包括Java基础及深入知识点 Android技术博客 Python Go学习笔记等等 还包括平时开发中遇到的
  • 高性能MySQL学习笔记(1) —— MySQL架构

    MySQL架构 1 MySQL逻辑架构 这里分为三层 1 连接层 连接与线程处理 这一层并不是MySQL独有 一般的基于C S架构的都有类似组件 比如连接处理 授权认证 安全等 2 SQL处理层 也叫MySQL服务器层 包括缓存查询 解析器
  • python——pip 安装出现ERROR: Exception: Traceback (most recent call last):的问题

    用pip安装东西 总会提示 当我按照指示输入 python m pip install upgrade pip 命令时 用100次pip 99次会报下面的错误之前看了很多前人的办法 有说是因为网络不好 建议多次暴力尝试的 还有建议说使用ea
  • AI时代你需要知道的:知识图谱技术原理(必读)

    知识图谱是什么 知识图谱最早由谷歌发布 为了提升搜索引擎返回答案的质量以及用户查询的效率 在知识图谱辅助下 搜索引擎可以洞察到用户查询背后的一个语义信息 然后返回更为精准结构化的信息 从而更大可能的去满足用户的一个查询需求 当我们进行搜索时
  • mysql集群

    3 mysql集群 3 1 企业中常用的数据库解决方案 3 2 mysql常见的几种集群方式 3 2 1 MYSQl MMM Master Master Replication Manager for MySQL MySQL MMM 是 M
  • idea debug到一半停止_使用IDEA的Debug调试功能,查看程序的运行过程

    Debug追踪 使用IDEA的断点调试功能 查看程序的运行过程 知乎视频 www zhihu com 1 在有效代码行 点击行号右边的空白区域 设置断点 程序执行到断点将停止 我们可以手动来运行程序 2 点击Debug运行模式 3 程序停止
  • C语言printf打印的奥秘

    基础补充 想完全掌握C语言的 printf 函数 你就得明白C语言中的基本类型及其所占字节数 位 字节 字的概念大家自己百度了解 下面我只给其关系 8位 1字节 2字节 1字 代码示例 作为一个刚入门的小白 我们玩的数据都是十分小的 一般不
  • kubernetes最佳实践(三) - kubedns部署

    1 服务发现 kubernetes 提供了 service 的概念可以通过 VIP 访问 pod 提供的服务 但是在使用的时候还有一个问题 怎么知道某个应用的 VIP 比如我们有两个应用 一个 app 一个 是 db 每个应用使用 rc 进
  • Spring boot的配置文件中属性值有特殊符号,比如@的怎么解决

    用双引号将值引起来就可以识别 例子
  • 【Zabbix实战之运维篇】Zabbix监控模板的配置管理

    Zabbix实战之运维篇 Zabbix监控模板的配置管理 一 检查Zabbix平台的状态 1 检查Zabbix各组件容器状态 2 检查Zabbix的web页面 二 查看系统的默认模板信息 1 查看系统的所有监控模板 2 搜索某个监控模板 3
  • springCloud-系统学习3- 创建微服务工程2

    2 11 Feign应用 是对下面代码的优化 自动根据参数拼接http请求地址 2 11 1 操作 效果 2 12 Feign负载均衡及熔断 Feign集成了ribbon配置项和Hystrix熔断的Fallback配置项 可以使用Feign