springcloud 之 Ribbon Hystrix Feign bus 动态修改配置

Ribbon 是微服务架构图中负责负载均衡的 组件。

    @Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}

测试如下:

    //微服务方式 Ribbon方式@GetMapping("ribbon/{name}")public String RibbonTest(@PathVariable String name) {
//        ip和域名 更换成 微服务名称String url = "http://user-service/hello?name="+name;String forObject = restTemplate.getForObject(url, String.class);return forObject;}

Hystrix 熔断:

1、熔断器:当某个服务的失败率达到一定阈值时,Hystrix会打开熔断器,停止对该服务的调用,从而防止故障进一步扩散。熔断器开启后,Hystrix会快速失败并返回备选结果或降级数据,以提高系统的响应速度。
2、资源隔离:Hystrix可以对调用远程服务的线程池进行资源隔离,限制调用分布式服务的资源使用。这样,即使某个服务出现故障,也不会影响其他服务的调用。
3、服务降级:当服务调用失败或资源不足时,Hystrix可以进行降级处理。降级后可以配合降级接口返回托底数据,以保证系统的正常运行。
4、缓存:Hystrix提供了请求缓存和请求合并的实现。通过缓存请求的结果,可以减少对后端服务的调用,提高系统的性能。同时,通过将多个相同类型的请求合并为一个批量请求,可以减少网络开销。
5、监控和告警:Hystrix可以监控服务的调用情况,如调用次数、成功率、响应时间等,并提供告警功能。这样,开发人员可以及时发现并处理潜在的问题。

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

在application中加入 @EnableCircuitBreaker注解

@EnableDiscoveryClient 
@SpringBootApplication
@EnableCircuitBreaker //开启熔断 hytrix
public class ClientServiceApplication {public static void main(String[] args) {SpringApplication.run(ClientServiceApplication.class, args);}

使用方式如下:
方案一: 方法级别的指定

    @GetMapping("ribbon/{name}")@HystrixCommand(fallbackMethod = "ribbonTestFail")public String RibbonTest(@PathVariable String name) {
//        ip和域名 更换成 微服务名称String url = "http://user-service/hello?name="+name;String forObject = restTemplate.getForObject(url, String.class);return forObject;}
//    服务降级处理 配合使用    @HystrixCommand(fallbackMethod = "ribbonTestFail") 入参出入要一和对应方法一直public String ribbonTestFail(String name){return "请求失败";}

方案二 类级别方案的指定:

@RestController
@RequestMapping("client")
@DefaultProperties(defaultFallback = "TestControllerRequestFail") //指定访问失败时的方法
public class TestController {//微服务方式 Ribbon方式@GetMapping("ribbon/{name}")@HystrixCommandpublic String RibbonTest(@PathVariable String name) {
//        ip和域名 更换成 微服务名称String url = "http://user-service/hello?name="+name;String forObject = restTemplate.getForObject(url, String.class);return forObject;}//统一处理,配合 @DefaultProperties(defaultFallback = "TestControllerRequestFail") 来使用public String TestControllerRequestFail(){return "Controller 请求失败";}

yml 配置:

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 1000circuitBreaker:errorThresholdPercentage: 50 #触发熔断错误比例阈值,默认值50号sleepWindowInMilliseconds: 10000 #熔断后休眠时长,默认值5秒requestVolumeThreshold: 10 #熔断触发最小请求次数,默认值是20

Feign

是一个声明式的 HTTP 客户端,它使得编写 HTTP 客户端变得更简单,通过注解和接口的方式定义和调用远程服务。
pom 加入依赖:

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

最佳实践:

创建一个 xxx-api模块。(Feign 模块由被调用端编写)

     <groupId>com.zll</groupId><artifactId>user-api</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>3.1.5</version></dependency></dependencies>
</project>

用于单独存放,Feign 接口,以及 出入参对象。

@Data
public class User {private String name;private Integer age;
}
@FeignClient("user-service")
public interface UserControllerApi {@GetMapping("/hello")public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name);@PostMapping("/save_user")public String saveUser(User u);
}

被调用端:
user-service:
加入pom

        <dependency><groupId>com.zll</groupId><artifactId>user-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

使用API中的入参出参

@Controller
public class UserController {@GetMapping("/hello")@ResponseBodypublic String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {return "Hello " + name;}@PostMapping("/save_user")@ResponseBodypublic String saveUser(User u) {return "user will save: name=" + u.getName() + ", age=" + u.getAge();}

调用端:
第一步:加入pom

        <dependency><groupId>com.zll</groupId><artifactId>user-api</artifactId></dependency>

第二步:开启feign 扫描

@EnableFeignClients(basePackages={"com.zll.api"}) //开启feign功能 并且加入xxx-api的扫描包路径
@SpringBootApplication(basePackages={"com.zll.client","com.zll.api"})
public class ClientServiceApplication {public static void main(String[] args) {SpringApplication.run(ClientServiceApplication.class, args);}

第三步:

public class ClientUserController {//引入xxx-api的接口对象@ResourceUserControllerApi userControllerApi;@GetMapping("/hello")public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name){//像调用方法一下,调用请求接口String hello = userControllerApi.hello(name);return hello;}@PostMapping("/save_user")public String saveUser(User u){//像调用方法一下,调用请求接口String s = userControllerApi.saveUser(u);return s;}

注意,使用该种模式,就不支持服务降级处理。

Gateway

创建一个新Module
在这里插入图片描述
GateWayApplication

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

pom 部分代码

    <parent><groupId>com.zll</groupId><artifactId>zll-springcloud-demo</artifactId><version>0.0.1-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency></dependencies>

yml

server:port: 9000
spring:application:name: api-gatewaycloud:gateway:routes:- id: user-service-route  #路由id 随意编写uri: http://127.0.0.1:9092  #代理服务器地址predicates:   #路由断言: 可以匹配映射路径- Path=/client/**
eureka:client:service-url:defaultZone: http://127.0.0.1:8000/eureka
#========================选配内容 更具需要来定===================instance:
#    服务续约时间 默认30秒lease-renewal-interval-in-seconds: 5
#    服务时效时间 默认90秒lease-expiration-duration-in-seconds: 5
#    优先使用ipprefer-ip-address: true
#============================================================

gateway网关的规则:

添加路径
所有路径加前缀:

spring:application:name: api-gatewaycloud:gateway:routes:- id: user-service-route  #路由id 随意编写uri: lb://client-service  #微服务服务注册名称。lb 表示loadBalancerpredicates:- Path=/**filters:- PrefixPath=/client #在路径前面添加  /client

实际下过如下:例如:
访问路径: localhost:9000/hello
实际路径:localhost:9000/client/hello

删除路径

    gateway:routes:- id: user-service-route  #路由id 随意编写uri: lb://client-service #微服务服务注册名称。lb 表示loadBalancerpredicates:- Path=/api/client/**filters:- StripPrefix=1 #1表示删除一个路径  2表示两个路径
#            - PrefixPath=/client #在路径前面添加  /client

示范入戏
访问路径:http://localhost:9000/api/client/hello
实际路径:http://localhost:9000/client/hello

gateway自定义局部拦截器:

第一步在:yml添加拦截器名称和要拦截的参数 拦截器名称 为 MyParam 拦截参数 name
在这里插入图片描述
第二步:创建 MyParam拦截器:MyParam + GatewayFilterFactory = MyParamGatewayFilterFactory 前缀 MyParam +固定命名方式,否则会报错Unable to find GatewayFilterFactory with name MyParam
在这里插入图片描述
第三步:


/*** 局部拦截,需要在yml 的fiter 配置* spring:*   cloud:*     gateway:*       routes:*           uri: lb://client-service #微服务服务注册名称。lb 表示loadBalancer*           predicates:*             - Path=/client/***           filters:*             - MyParam=name*/
@Component
public class MyParamGatewayFilterFactory extends AbstractGatewayFilterFactory<MyParamGatewayFilterFactory.Config> {public MyParamGatewayFilterFactory() {super(Config.class);}public List<String> shortcutFieldOrder() {return Arrays.asList("param");}public static class Config{private String param;public String getParam() {return param;}public void setParam(String param) {this.param = param;}}@Overridepublic GatewayFilter apply(Config config) {return ((exchange, chain) ->{ServerHttpRequest request = exchange.getRequest();if(request.getQueryParams().containsKey(config.param)){request.getQueryParams().get(config.param).forEach(item-> System.out.printf("%s==%s",config.param,item));}return chain.filter(exchange);});}
}

好了,局部拦截器完成。

gateway全局拦截器:

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("======================MyGlobalFilter====================");
//        String token = exchange.getRequest().getQueryParams().getFirst("name");String token = exchange.getRequest().getHeaders().getFirst("Token");if(StringUtils.isBlank(token)){exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {//值越小,执行优先级越高。return 100;}
}

gateway跨域解决:

在这里插入图片描述
微服务内部,使用feign 外部调用gateway 就用nginx

配置中心

pom

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

第二步:
在git 创建一个仓库,任意分支创建一个 user-dev.yml 文件,这里以 master 分支为例
user-dev.yml 中随便写你想要的配置
在这里插入图片描述

例如:

server:port: 9091
spring:application:name: user-server
eureka:client:service-url:defaultZone: http://127.0.0.1:8000/eureka

回到项目的yml中:
配置git 地址

server:port: 10000
spring:application:name: config-servercloud:config:server:git:uri: https://gitee.com/leonzhang2013/configuration-center.git  #这里写你自己的git 地址default-label: master #不写默认值,config会报NoSuchLabelException: No such label: main。
eureka:client:service-url:defaultZone: http://127.0.0.1:8000/eureka

项目中开启配置功能:
在这里插入图片描述
最后启动项目:
访问你编写的git 文件,例如:
在这里插入图片描述
其他项目读取配置:
添加配置pom

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId><version>2.1.1.RELEASE</version></dependency>

如果报错:
在这里插入图片描述
就再加入下面的包:(新版本这个包被排除了,需要添加这包)

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

更换启动文件:
applicaton.yml ⇒ bootstrap.yml

spring:cloud:config:name: user  # 要与仓库中配置的profile保持一致  例如 user-dev.ymlprofile: dev # 要与仓库中配置的profile保持一致  例如 user-dev.ymllabel: master #分支名称discovery:enabled: trueservice-id: config-server #配置中心的名称eureka:client:service-url:defaultZone: http://127.0.0.1:8000/eureka

启动配置中心和注册中心服务,最后启动项目,就可以完美读到配置了。项目运行正常
user-server 读到配置,端口为配置的9091
在这里插入图片描述

实时动态同步配置(无需重启服务):spring cloud bus
第一步: 安装RabbitMQ
需要配合 RabbitMQ服务使用 ( RabbitMQ for Window 安装指南)

第二步:Config-server服务 添加 actuator 和 rabbit库

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream-binder-rabbit</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

第三步:Config-server 配置完成
添加 rabbit 配置和actutor 的 management 的路径解封。不然访问不到

server:port: 10000spring:application:name: config-servercloud:config:server:git:uri: https://gitee.com/leonzhang2013/configuration-center.gitdefault-label: master
eureka:client:service-url:defaultZone: http://127.0.0.1:8000/eurekarabbitmq:host: localhostport: 5672username: guestpassword: guestmanagement:endpoints:web:exposure:include: "*"

配置使用端 user-server
第一步:添加 pom

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-bus</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-stream-binder-rabbit</artifactId></dependency>

第二步:添加rabbit 配置 applition.yml 中:
在这里插入图片描述
第三步:添加@RefreshScope 属性注解,表示该类,中的属性需要动态刷新(test.name)
在这里插入图片描述
测试:
启动 注册中心,config-server ,user-server 三个服务。
1、修改git 上的配置:例如 test.name =lisi 修改为 zhangsan
2、访问 user-servier 服务中的 测试链接 localhost:9091 查看数据,此时数据应该是 lisi
3、通过postman 访问 config-server 的刷新配置路径 http://localhost:10000/actuator/busrefresh
4、再次访问 localhost:9091 查看数据,此时数据应该是 zhangsan 测试结束。

关于第三步,老版本的是 bus-refresh 新版是 busrefresh
具体是那个可以访问:http://localhost:10000/actuator/mappings 去搜索一下 refresh 看看你的路径是那个。

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

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

相关文章

大模型所谓的参数是什么?大模型为什么需要训练?大模型训练到底干了什么?

“ 大模型的本质是机器学习&#xff0c;机器学习的本质就是一种数学模型。” 我们经常能听到这样的说法&#xff0c;某某大模型有多少参数&#xff0c;某某大模型参数量又提升了&#xff0c;这里所说的参数到底是什么&#xff1f; 我们知道大模型是训练出来的&#xff0c;那么…

中小学校活动怎样投稿给媒体报道宣传?

身为一名学校老师,同时承担起单位活动向媒体投稿的宣传重任,我深知每一次校园活动背后的故事,都承载着师生们的辛勤汗水与教育的无限可能。起初,我满怀着对教育的热情,希望通过文字传递校园的温暖与光芒,却在投稿的道路上遇到了前所未有的挑战。 最初,我选择了最传统的路径——…

【RSGIS数据资源】中国多时期土地利用遥感监测数据集(CNLUCC)

文章目录 数据基本信息摘要数据说明数据引用方式 数据基本信息 数据时间&#xff1a; 多时期(1970年代末期以来11期) 空间位置&#xff1a; 中国 数据格式&#xff1a; 矢量与栅格 空间分辨率&#xff1a; 30m 主题分类&#xff1a; 中国土地利用遥感监测数据 DOI标识&#xf…

UNION的使用

UNION的使用 给出将多条查询语句组合成单个结果集&#xff0c;两个表对应的列数和数据类型必须相同 UNION操作符&#xff1a; 返回两个查询结果集的并集&#xff0c;并去除重复记录 UNION ALL操作符 返回两个查询的结果集的并集。不去掉两个结果集的重复部分&#xff0c;重…

存储方式 - 前端学习

1. cookie是什么&#xff1f;你了解cookie吗&#xff1f; 在计算机领域中&#xff0c;特指一种由服务器发送到用户浏览器并保存在用户计算机上的小型文本文件。这个文件可以被服务器用来识别用户身份、跟踪用户活动、保存用户设置等。它通常由名称、值、域名、路径、过期时间等…

【漏洞复现】号卡极团分销管理系统 ue_serve.php 任意文件上传漏洞

0x01 产品简介 号卡极团分销 管理系统&#xff0c;同步对接多平台&#xff0c;同步订单信息&#xff0c;支持敢探号一键上架&#xff0c;首页多套U|商品下单页多套模板&#xff0c;订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定&#xff0c;内置敢探号、172平台…

CLIP源码详解:clip.py 文件

前言 这是关于 CLIP 源码中的 clip.py 文件中的代码带注释版本。 clip.py 文件的作用&#xff1a;封装了 clip 项目的相关 API&#xff0c;通过这些 API &#xff0c;我们可以轻松使用 CLIP 项目预训练好的模型进行自己项目的应用。 另外不太容易懂的地方都使用了二级标题强…

【机器学习300问】101、1x1卷积有什么作用?

卷积神经网络最重要的操作就是卷积层的卷积操作&#xff0c;之前文章中介绍过&#xff0c;卷积核filter往往都是3x3或者5x5什么的&#xff0c;但有一种非常特殊的卷积——1x1卷积。他在CNN中扮演着非常重要的角色。 一、通道维度的降维/升维 这是1x1卷积最显著的作用之一。通过…

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文介绍了 IP-Adapter&#xff0c;一种 高效地将预训练的图像到图像转换模型适应到新领域 的方法。它通过在预训练模型的 输入端 添加一个…

如果任务过多,队列积压怎么处理?

如果任务过多,队列积压怎么处理? 1、内存队列满了应该怎么办2、问题要治本——发短信导致吞吐量降低的问题不能忽略!!3、多路复用IO模型的核心组件简介1、内存队列满了应该怎么办 如图: 大家可以看到,虽然现在发短信和广告投递,彼此之间的执行效率不受彼此影响,但是请…

SpringBoot 上传文件示例

示例效果&#xff1a; 前端代码&#xff1a; <html> <head><title>上传文件示例</title></head> <body> <h2>方式一&#xff1a;普通表单上传</h2> <form action"/admin/upload" method"post" enctyp…

【Android14 ShellTransitions】(五)启动Transition

这一节的内容涉及WMCore以及WMShell&#xff0c;主要是启动Transition。 回到ActivityStarter.startActivityUnchecked方法&#xff1a; 看下最后启动Transition的部分&#xff0c;在ActivityStarter.handleStartResult中&#xff1a; 只关注我们要关注的部分。 首先是如果这…

网络原理-HTTP协议

HTTP协议 HTTP协议全称为超文本传输协议,除了能传输字符串,还能传输图片、视频、音频等。 当我们在访问网页的时候,浏览器会从服务器上下载数据,这些数据都会放在HTTP响应中,然后浏览器再根据这个HTTP响应显示出网页信息。 抓包 抓包工具本质上是一个代理工具,即我们将构造…

STM32H743+USBHID+CubeMX配置

一、环境准备 电脑系统&#xff1a;Windows 10 专业版 20H2 IDE&#xff1a;Keil v5.35、STM32CubeMX v6.5.0 测试硬件&#xff1a;正点原子阿波罗STM32H743 二、测试步骤 1、使用用例工程 配置STM32H743定时器功能-CSDN博客https://blog.csdn.net/horse_2007s/article/d…

HR招聘面试测评,哪些工作岗位需要测评创新能力?

什么是创新能力&#xff1f; 创新能力指在现有的物质基础上&#xff0c;通过某些特定的条件&#xff0c;促成满足未来社会发展的新事物。无论是个人还是国家都需要巨大的创新能力&#xff0c;因为创新是一切发展的根基&#xff0c;离开了创新&#xff0c;所有的发展都是原地踏…

每日复盘-20240527

今日关注&#xff1a; 六日涨幅最大: ------1--------300956--------- 英力股份 五日涨幅最大: ------1--------300956--------- 英力股份 四日涨幅最大: ------1--------301361--------- 众智科技 三日涨幅最大: ------1--------301361--------- 众智科技 二日涨幅最大: ----…

CAS原理技术

CAS原理技术 背景介绍结构体系术语接口原理基础模式1. 首次访问集成CAS Client的应用2. 再次访问集成CAS Client的同一应用3. 访问集成CAS Client的其他应用 代理模式1. 用户在代理服务器上执行身份认证2. 通过代理应用访问其他应用上授权性资源 背景 本文内容大多基于网上其他…

开机必启截图标注类神器Snipaste,基本使用及技巧

目录 一、软件简介二、基本安装三、自启设置四、快捷操作五、使用技巧 一、软件简介 Snipaste 是一款简单高效的截图工具。只需按下 F1 即可截图&#xff08;可进行自主设置&#xff09;&#xff0c;再按 F3 即可将截图置顶显示&#xff08;贴图功能&#xff09;。你还可以将剪…

反射器与联邦实验

要求&#xff1a; 1、AS1存在两个环回, 一个地址为192.168.1.0/24该地址不能在任何协议中宣告AS3存在两个环回, 一个地址为192.168.2.0/24该地址不能在任何协议中宣告 最终要求这两个环回可以互相通讯; AS1的另一个环回为10.1.1.0/24 AS3的另-个环回为10.1.2.0/24 2、整个AS2的…

JMeter 测试单节点与集群的并发异常率

一. JMeter 测试单节点与集群的并发异常率 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 单个tomcat测试结果(2000个用户&#xff0c;每个用户访问100次) nginx集群负载均衡tomcat结果(2000个用户&#xff0c;每个用户访问100次)