注册中心Eureka

  • Eureka-Server:就是服务注册中心(可以是一个集群),对外暴露自己的地址。

  • 提供者:启动后向Eureka注册自己信息(地址,服务名称等),并且定期进行服务续约

  • 消费者:服务调用方,在使用的时候去拉取一次,之后会定期去Eureka拉取服务列表,然后使用负载均衡算法选出一个服务进行调用。

  • 心跳(续约):提供者和消费者定期通过http方式向Eureka刷新获取(默认30秒)

 如果消费者之前已经调用过注册中心获取过提供者的地址信息,那么注册中心宕机后,在提供者地址不变的前提下,不影响服务直接调用

引入SpringCloud为eureka提供的starter依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

 编写一个启动类

给eureka-server服务编写一个启动类,一定要添加一个@EnableEurekaServer注解,开启eureka的注册中心功能:

@SpringBootApplication
@EnableEurekaServer  //开启eureka的注册中心功能
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}
}

编写一个application.yml文件,内容如下:

server:port: 10086
spring:application:name: eureka-server
eureka:client:service-url: defaultZone: http://127.0.0.1:10086/eurekaregister-with-eureka: false # 自己不注册到eureka中fetch-registry: false #自己不从eureka中拉取别的服务

启动微服务,然后在浏览器访问:http://127.0.0.1:10086

 将微服务注册到注册中心->引入依赖->编写配置文件,名字要指定

spring:application:name: userservice
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

Ribbon负载均衡

@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}//注册RestTemplate,第三方的类,交给IOC容器管理@Bean@LoadBalanced//自动负载均衡public RestTemplate restTemplate() {return new RestTemplate();}
}

@LoadBalanced 

在远程调用的RestTemplate,上添加了@LoadBalanced注解,即可实现负载均衡功能

原理:SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。

 SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:

基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1

  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service

  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表

  • eureka返回列表,localhost:8081、localhost:8082

  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081

  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

Hystrix 熔断器

雪崩问题

微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,会形成非常复杂的调用链路:Hystix解决雪崩问题的手段主要是服务降级和线程隔离;

服务降级的演示

第一步:导依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

第二步:在引导类上开启Hystrix  


@EnableCircuitBreaker//开启断路器
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}//注册RestTemplate,第三方的类,交给IOC容器管理@Bean@LoadBalanced//自动负载均衡public RestTemplate restTemplate() {return new RestTemplate();}}

第三步:开发一个方法作为降级的处理方式要求:方法的参数和返回结果类型要和原方法findById应该一致

public String queryOrderByIdFallback(Long orderId) {return "服务器太忙,请稍后重试........";
}

 第四步:修改原有的方法,在方法上添加注解

 全局降级

 上面的写法中每个方法都需要一个降级方法,很麻烦,我们可以使用一个全局的降级方案

@Service
@DefaultProperties(defaultFallback="allMethodFallBack")
//在类上添加一个注解  @DefaultProperties(defaultFallback="allMethodFallBack")
public class OrderService {@HystrixCommand//指向降级方法public String queryOrderById() {    return "我出错了";}//    全局降级方法public String allMethodFallBack() {return "服务器太太太太太太太忙,请稍后重试.....";}
}

 超时设置

Hystix的默认超时时长为1秒,如果这个微服务响应时间超过1秒,就会报错,降级处理,但是有的方法本身需要执行的时间就长,自定义超时时间

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 3000 # 超时时间3秒

熔断原理

熔断功能:默认5秒内发起20次请求,失败率超过50% 进入熔断状态 5秒内的其他时间都会直接进入降级方法

熔断器有3种状态:open close half-open

状态机有3个状态:

  • Closed:关闭状态(断路器关闭),所有请求都正常访问。

  • Open:打开状态(断路器打开),所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全关闭。默认失败比例的阈值是50%,请求次数最少不低于20次。

  • Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放1次请求通过,若这个请求是健康的,则会关闭断路器,否则继续保持打开,再次进行5秒休眠计时。

 Feign:封装了RestTemple 远程调用

导入依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

创建interface接口


@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")  //这里的返回结果和 url地址一定要和提供方保持一致User findById(@PathVariable("id") Long id);
}
  • 首先这是一个接口,Feign会通过动态代理,帮我们生成实现类。这点跟mybatis的mapper很像

  • @FeignClient,声明这是一个Feign客户端,同时通过value属性指定服务名称

  • 接口中的定义方法,完全采用SpringMVC的注解,Feign会根据注解帮我们生成URL,并访问获取结果

开启Feign功能

@EnableFeignClients//开启Feign
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}}

负载均衡

Feign中本身已经集成了Ribbon依赖和自动配置:

Feign默认也有对Hystix的集成:

feign:hystrix:enabled: true # 开启Feign的熔断功能
  • 首先,我们要定义一个类,是在刚才编写的UserFeignClient,作为fallback的处理类
import cn.itcast.order.pojo.User;
import org.springframework.stereotype.Component;@Component
public class UserClientFallback implements UserFeignClient {@Overridepublic User findById(Long id) {User user = new User();user.setId(0L);user.setUsername("用户查询出现异常!");return user;}
}
  • 然后在UserFeignClient中,指定刚才编写的实现类,就实现了降级方法
@FeignClient(value = "userservice", fallback = UserClientFallback.class)
public interface UserFeignClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

Gateway网关

网关的核心功能是:路由和过滤(鉴权)

  •  搭建网关
<dependencies><!--引入gateway 网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>
</dependencies>
  • 编写启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ApiGatewayApplication {public static void main(String[] args) {SpringApplication.run(ApiGatewayApplication.class,args);}}
  • 编写配置
server:port: 10010
spring:application:name: api-gatewaycloud:# 网关配置gateway:# 路由配置:转发规则routes: #集合。# id: 唯一标识。默认是一个UUID# uri: 转发路径# predicates: 条件,用于请求网关路径的匹配规则- id: userserviceuri: http://localhost:8081/predicates:- Path=/user/**

application.yml 中的uri是写死的,就是Gateway-静态路由

Gateway-动态路由

<dependency><--添加注册中心Eureka--> <groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

 修改配置文件

server:port: 10010
spring:application:name: api-gatewaycloud:# 网关配置gateway:# 路由配置:转发规则routes: #集合。# id: 唯一标识。默认是一个UUID# uri: 转发路径# predicates: 条件,用于请求网关路径的匹配规则- id: user-serviceuri: lb://userservice # lb负载均衡predicates:- Path=/user/**eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka

Gateway-过滤器

GatewayFilter:局部过滤器,针对单个路由 GlobalFilter :全局过滤器,针对所有路由

全局过滤器

  • GlobalFilter 全局过滤器,不需要在配置文件中配置,系统初始化时加载,并作用在每个路由上。

  • Spring Cloud Gateway 核心的功能也是通过内置的全局过滤器来完成。

  • 自定义全局过滤器步骤:

    1. 定义类实现 GlobalFilter 和 Ordered接口

    2. 复写方法

    3. 完成逻辑处理

/*** 自定义全局过滤器*/
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {//需求 :请求参数中带有token 内容,就放行,否则提示未授权@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//        获取请求对象ServerHttpRequest request = exchange.getRequest();
//        获取参数MultiValueMap<String, String> valueMap = request.getQueryParams();List<String> valList = valueMap.get("token");if(CollectionUtils.isEmpty(valList)){//异常情况,没有token参数// 获取响应对象ServerHttpResponse response = exchange.getResponse();// 返回响应码response.setStatusCode(HttpStatus.FORBIDDEN);//401// 完成响应return response.setComplete();}return chain.filter(exchange);//放行}@Overridepublic int getOrder() {return 0;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/79525.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/79525.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/79525.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker —— 隔离的基本操作(2)

Docker —— 隔离的基本操作&#xff08;2&#xff09; unshareunshare 命令详解基本语法常用选项常用示例实际应用场景注意事项与 Docker 的关系1. 执行命令2. 修改主机名3. 退出命名空间4. 验证宿主机主机名关键原理类比 Docker 容器总结 实战操作一&#xff08;PID 隔离&…

Java List分页工具

PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分页工具类*…

中阳策略:如何从K线行为中提取交易逻辑信号?

中阳策略&#xff1a;如何从K线行为中提取交易逻辑信号&#xff1f; 在量化趋势研究中&#xff0c;中阳形态常被视作市场动能变化的重要标志。它不仅代表价格的强势上行&#xff0c;更隐含着主力资金换手与情绪转换的信号。将“中阳”这一结构元素抽象为模型中的“强动能突破”…

Java SE(8)——继承

1.继承的概念&作用 在Java中&#xff0c;继承是面向对象编程的三大基本特性之一&#xff08;还有封装和多态&#xff09;&#xff0c;允许一个类&#xff08;子类/继承类&#xff09;继承另一个类&#xff08;父类/基类&#xff09;的属性和方法 继承的核心目的是&#xf…

Python爬虫(18)反爬攻防战:动态IP池构建与代理IP实战指南(突破95%反爬封禁率)

目录 引言一、背景&#xff1a;为什么代理IP是爬虫的“第二生命”&#xff1f;1.1 反爬系统的IP检测三把刀1.2 代理IP的核心价值 二、基础实战&#xff1a;快速搭建代理IP系统2.1 免费代理IP的获取与筛选2.2 代理IP的智能容错机制 三、高阶攻防&#xff1a;突破企业级反爬封锁3…

LFU算法解析

文章目录 LFU缓存中关键变量的访问与更新机制1. min_freq - 最小频率访问时机更新时机更新示例 2. capacity - 缓存容量访问时机更新时机访问示例 3. key_to_node - 键到节点的映射访问时机更新时机更新示例 4. freq_to_dummy - 频率到链表哑节点的映射访问时机更新时机更新示例…

ByteArrayInputStream 类详解

ByteArrayInputStream 类详解 ByteArrayInputStream 是 Java 中用于从字节数组读取数据的输入流&#xff0c;位于 java.io 包。它允许将内存中的字节数组当作输入流来读取&#xff0c;是处理内存数据的常用工具。 1. 核心特性 内存数据源&#xff1a;从字节数组&#xff08;b…

rvalue引用()

一、先确定基础:左值(Lvalue)和右值(Rvalue) 理解Rvalue引用,首先得搞清楚左值和右值的概念。 左值(Lvalue):有明确内存地址的表达式,可以取地址。比如变量名、引用等。 复制代码 int a = 10; // a是左值 int& ref = a; // ref也是左值右值(Rval…

吴恩达深度学习作业 RNN模型——字母级语言模型

一. 简单复习一下RNN RNN RNN适用于处理序列数据&#xff0c;令是序列的第i个元素&#xff0c;那么就是一个长度为的序列&#xff0c;NLP中最常见的元素是单词&#xff0c;对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时&#xff0c;为了表示序列的…

基于python的哈希查表搜索特定文件

Python有hashlib库&#xff0c;支持多种哈希算法&#xff0c;比如MD5、SHA1、SHA256等。通常SHA256比较安全&#xff0c;但MD5更快&#xff0c;但可能存在碰撞风险&#xff0c;得根据自己需求决定。下面以SHA256做例。 import hashlib import os from typing import Dict, Lis…

idea创建springboot项目无法创建jdk8原因及多种解决方案

idea创建springboot项目无法创建jdk8原因及多种解决方案 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&#x…

【C++进阶十】多态深度剖析

【C进阶十】多态深度剖析 1.多态的概念及条件2.虚函数的重写3.重写、重定义、重载区别4.C11新增的override 和final5.抽象类6.虚表指针和虚表6.1什么是虚表指针6.2指向谁调用谁&#xff0c;传父类调用父类&#xff0c;传子类调用子类 7.多态的原理8.单继承的虚表状态9.多继承的…

面向网络安全的开源 大模型-Foundation-Sec-8B

1. Foundation-Sec-8B 整体介绍 Foundation-Sec-8B 是一个专注于网络安全领域的大型语言模型 (LLM),由思科的基础人工智能团队 (Foundation AI) 开发 。它基于 Llama 3.1-8B 架构构建,并通过在一个精心策划和整理的网络安全专业语料库上进行持续预训练而得到增强 。该模型旨在…

Python爬虫的基础用法

Python爬虫的基础用法 python爬虫一般通过第三方库进行完成 导入第三方库&#xff08;如import requests &#xff09; requests用于处理http协议请求的第三方库,用python解释器中查看是否有这个库&#xff0c;没有点击安装获取网站url&#xff08;url一定要解析正确&#xf…

WHAT - Tailwind CSS + Antd = MetisUI组件库

文章目录 Tailwind 和 Antd 组件库MetisUI 组件库 Tailwind 和 Antd 组件库 在 WHAT - Tailwind 样式方案&#xff08;不写任何自定义样式&#xff09; 中我们介绍了 Tailwind&#xff0c;至于 Antd 组件库&#xff0c;我们应该都耳熟能详&#xff0c;官网地址&#xff1a;htt…

Day 4:牛客周赛Round 91

好久没写了&#xff0c;问题还蛮多的。听说这次是苯环哥哥出题 F题 小苯的因子查询 思路 考虑求因子个数&#xff0c;用质因数分解&#xff1b;奇数因子只需要去掉质数为2的情况&#xff0c;用除法。 这里有个比较妙的细节是&#xff0c;提前处理出数字x的最小质因数&#xff0…

使用直觉理解不等式

问题是这个&#xff1a; 题目 探究 ∣ max ⁡ b { q 1 ( z , b ) } − max ⁡ b { q 2 ( z , b ) } ∣ ≤ max ⁡ b ∣ q 1 ( z , b ) − q 2 ( z , b ) ∣ |\max_b\{q_1(z,b)\}-\max_b\{q_2(z,b)\}|\le\max_b|q_1(z,b)-q_2(z,b)| ∣maxb​{q1​(z,b)}−maxb​{q2​(z,b)}∣≤…

恶心的win11更新DIY 设置win11更新为100年

‌打开注册表编辑器‌&#xff1a;按下Win R键&#xff0c;输入regedit&#xff0c;然后按回车打开注册表编辑器。‌12‌导航到指定路径‌&#xff1a;在注册表编辑器中&#xff0c;依次展开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings‌新建DWORD值‌&…

嵌入式驱动学习

时钟 定义 周期型的0、1信号 时钟信号由“心脏”时钟源产生&#xff0c;通过“动脉”时钟树传播到整个芯片中。 SYSCLK系统时钟&#xff0c;由HSI、HSE、PLLCLK三选一。 HCLK是AHB总线时钟&#xff0c; PCLK是APB总线时钟。 使用某个外设&#xff0c;必须要先使能该外设时钟系统…

Java:从入门到精通,你的编程之旅

Java&#xff0c;一门历久弥新的编程语言&#xff0c;自诞生以来就以其跨平台性、面向对象、稳定性和安全性等特性&#xff0c;在企业级应用开发领域占据着举足轻重的地位。无论你是初学者还是经验丰富的开发者&#xff0c;Java 都能为你提供强大的工具和广阔的舞台。 为什么选…