注册中心集群 服务负载均衡 雪崩效应Hystrix
集群
为什么需要集群?
如果只有一个注册中心服务器,会存在单点故障所以要集群。
什么是集群?
一组协同工作的服务实体,用以提供比单一服务实体更具扩展性和可用性的服务平台。
多台服务器集中在一起,实现同一业务
集群原理图
怎么做?
生产环境把Eureka部署多个服务器
服务提供者和服务消费者修改
eureka:client:serviceUrl:defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/ #注册中心地址instance:prefer-ip-address: true #使用ip地址注册instance-id: user-server1 #指定服务的id
server:port: 2000
spring:application:name: user-server
注意:instance-id需要修改 , 而 spring.application.name 不需要修改 , 端口需要修改
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
总结:
如果是只有一个Eureka注册中心,会存在单点故障,要做集群,做了集群后,服务提供者和消费者注册服务或发现服务时要配置集群(把多个Eureka都配置上).
为什么需要负载均衡
为了提供并发量,有时同一个服务提供者可以部署多个(商品服务)。这个客户端在调用时要根据一定的负责均衡策略完成负载调用
负载均衡原理图
重启注册中心,和两个服务提供者,如以下效果就ok
服务消费者常见负载均衡实现技术
Ribbon
Ribbon是Netflix发布的云中间层服务开源项目,主要功能是提供客户端负载均衡算法
简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法
负载均衡测试
1.创建项目
普通maven项目
2.导入jar
<!--公共代码依赖--><dependency><groupId>cn.itsource.springcloud</groupId><artifactId>User_interface</artifactId><version>1.0-SNAPSHOT</version></dependency><!--springboot支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--eureka客户端,服务消费者也要从注册中心获取可用服务列表--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--客户端负载均衡实现 ribbon-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
yml 配置
server:port: 9002
eureka:client:registerWithEureka: false #不注册到Eureka,不在注册中心显示service-url:#defaultZone: http://localhost:7001/eurekadefaultZone: http://eureka-7001.com:7001/eureka,http://eureka-7002.com:7002/eureka
负载均衡的类 MyConfig.java
@Configuration
public class MyConfig {/*** SpringMvc 提供的一个基于Rest风格的http调用工具* @LoadBalanced :ribbon的负载均衡标签,赋予RestTemplate有负债均衡的能力*/@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}/*** 使用随机策略 RandomRule()*//* @Beanpublic IRule rule(){return new RandomRule();}*/
}
订单消费服务Controller
/*订单消费者服务
* */
@RestController
public class OrderConsumerController {@Autowiredprivate RestTemplate restTemplate;/** 订单消费者方法 浏览器调用* @HystrixCommand 开启方法的短路功能,如果方法出现异常 fallbackMethod* 指向的方法,然后返回托底数据* */@HystrixCommand(fallbackMethod = "getEmployeeByIdFallback")@GetMapping("/order/employee/{id}")public JsonResult getEmployeeById (@PathVariable("id")Long id){System.out.println("OrderConsumerController.getEmployeeById被调用了......");//String url = "http://localhost:2000/employee/"+id;String url = "http://employee-server/employee/"+id;Employee employee = restTemplate.getForObject(url, Employee.class);return JsonResult.me().setData(employee);}
测试
浏览器输入url localhost:3000/order/employee/1
负载均衡策略
ribbon通过服务名获取到服务列表后,要根据一定规则来选择一个服务实例来完成调用.这个规则就叫负载均衡策略.
1)IRule
通过配置不同IRule的子类,可以选择不同负载均衡策略,也就是从服务列表以特定策略选择一个服务来完成调用。当然也可以自定义。所以负载均衡策略可以分为内置和自定义。
2)内置负载均衡策略
在主配置类中 配一个@Bean new出策略即可
Feign
feign底层还是ribbon,只是进行了封装,让我们以接口的方式进行调用
前面的可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还可以忍受,一旦有多个参数的话,这时拼接请求字符串就会效率低下
Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单。Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Feign整合了Ribbon和Hystrix(关于Hystrix我们后面再讲),可以让我们不再需要显式地使用这两个组件。
Feign具有如下特性:
可插拔的注解支持,包括Feign注解和JAX-RS注解;
支持可插拔的HTTP编码器和解码器;
支持Hystrix和它的Fallback;
支持Ribbon的负载均衡;
支持HTTP请求和响应的压缩。
这看起来有点像我们
springmvc模式的Controller层的RequestMapping映射
Feign是用@FeignClient来映射服务的。
操作
1)创建项目-copy
2)导入jar
<!--公共代码依赖--><dependency><groupId>cn.itsource.springcloud</groupId><artifactId>User_interface</artifactId><version>1.0-SNAPSHOT</version></dependency><!--springboot支持--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--eureka客户端,服务消费者也要从注册中心获取可用服务列表--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!--feign的支持--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
3)配置yml
eureka:client:serviceUrl:defaultZone: http://peer1:1000/eureka/,http://peer2:1001/eureka/ #注册中心地址instance:prefer-ip-address: true #使用ip地址注册instance-id: employeeWeb-server #指定服务器id
server:port: 4000
spring:application:name: employeeWeb-serverfeign:hystrix:enabled: true #开启熔断支持client:config:remote-service: #服务名,填写default为所有服务connectTimeout: 30000readTimeout: 30000
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 30000
配置类 开启Feign
@SpringBootApplication
@EnableFeignClients("cn.itsource.client")//@EnableFeignClients开启Feign的客户端
public class DeptServerApplication4000
编写Feign的接口
/*** @FeignClient(value="user-server") : 针对于用户服务调用的 Fiegn的客户端接口* value属性就是该接口要调用的目标服务的名字* Feign是如何实现服务调用的:* 1.通过@FeignClient(value="user-server")标签上的服务名字能够找到要调用的目标服务* 2.通过接口中的方法的 @GetMapping的url路径找到目标服务的controller的方法 ,* 所以要保证Feign客户端接口的方法和目标服务的对应的方法要完全一致。**/@FeignClient(value="user-server")public interface UserFeignClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id")Long id);}
Feign客户端接口的方法和目标服务的对应的方法要完全一致
调用
@RestController
public class DeptConsumerController {@Autowiredprivate UserFeignClient userFeignClient ;/*** 该方法是浏览器来调用* @param id* @return*/@GetMapping("/dept/user/{id}")public User getUserById(@PathVariable("id") Long id){User user = userFeignClient.getUserById(id); //使用Feign的接口调用return user;}
}
Hystrix
一.雪崩效应
一个微服务的故障导致整个微服务调用链全部瘫痪
二.Hystrix介绍
解决服务器故障(雪崩)的一个组件 ,它可以实现:隔离 ,熔断 ,降级,缓存
隔离 :包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。
熔断 :当请求次数达到规定的阀值都出现服务故障(超时),Hystrix就把服务标记为短路状态.
正常情况下,断路器处于关闭状态(Closed),如果调用持续出错或者超时,电路被打开进入熔断状态(Open),后续一段时间内的所有调用都会被拒绝(Fail Fast),一段时间以后,保护器会尝试进入半熔断状态(Half-Open),允许少量请求进来尝试,
如果调用仍然失败,则回到熔断状态
如果调用成功,则回到电路闭合状态;降级 :高并发情况下 ,为了保证一些主要的服务有足够的资源不出问题 ,会认为的关掉一些无关紧要的服务,然后返回一些托底的数据,给用户一个友好的提示。
缓存 :Hystrix内部会把请求做缓存
三.Ribbon集成Hystrix - springcloud-order-server-3000
1.导入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
2.controller方法贴注解
/*** 该方法是浏览器来调用* @HystrixCommand :开启方法的短路功能 , 如果方法出现异常,会调用 fallbackMethod* 指向的方法 ,然后返回托底数据*/@HystrixCommand(fallbackMethod = "getUserByIdFallback")@GetMapping("/order/user/{id}")public JsonResult getUserById(@PathVariable("id") Long id){System.out.println("OrderConsumerController.getUserById被调用了......");String url = "http://user-server/user/"+id;User user = restTemplate.getForObject(url, User.class);return JsonResult.me().setData(user);}
3.托底方法
public JsonResult getUserByIdFallback(@PathVariable("id") Long id){return JsonResult.me().setSuccess(false).setMessage("服务展示不可用,请骚后重试[服务降级]");}
注意:托底方法的参数和返回结果要和原方法一致
四.Feign集成Hystrix - springcloud-dept-server-4000
1.开启Hystrix
feign:hystrix:enabled: true #开启熔断支持client:config:remote-service: #服务名,填写default为所有服务connectTimeout: 30000readTimeout: 30000
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 30000
2.修改Fiegn客户端接口
@FeignClient(value="user-server" ,fallback = UserFeignClientFallback.class)
public interface UserFeignClient {@GetMapping("/user/{id}")User getUserById(@PathVariable("id")Long id);
}
fallback = UserFeignClientFallback.class : 该类是当前接口的实现类 ,也是托底数据所在的处理类
3.托底实现
@Component
public class UserFeignClientFallback implements UserFeignClient {@Overridepublic User getUserById(Long id) {System.out.println("托底数据执行....");return new User(-1L,"托底数据","");}
}
注册中心集群 服务负载均衡 雪崩效应Hystrix相关推荐
- 集群服务负载均衡------LVS
个人的理解,以一种通俗易懂的方式讲述出来,如果有哪些地方说的不正确的话,希望大家留言指出来.笔者会非是常的感谢! Cluster服务器集群,直接理解为一些单一的服务器的集合通过某种方式组合起来,为客户 ...
- 源码分析Dubbo Invoker概述----服务发现、集群、负载均衡、路由体系
Invoker,负载网络调用组件,底层依懒与网络通信,Invoker主要负责服务调用,自然与路由(比如集群)等功能息息相关,本节先从整体上把控一下Dubbo服务调用体系,服务发现.集群.负载均衡.路由 ...
- 大话集群和负载均衡,太强了!
作者:阿苍老师 www.cnblogs.com/nullering/p/9311151.html 在"高并发,海量数据,分布式,NoSql,云计算--"概念满天飞的年代,相信不少朋 ...
- Dubbo面试杀招--Dubbo集群容错负载均衡
点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...
- 分布式?集群?负载均衡?(此博客非原创,转载自微信公众号,为避免文章链接消失,copy过来的,如有问题请私信我删除,谢谢)
分布式?集群?负载均衡? 我曾经面试过一家企业,当时描述完我在老东家完成的微服务架构后,面试官问了我一个问题: 面试官:您有做过分布式系统吗? 我:有,刚刚我描述的微服务架构就是分布式的-- 面试官: ...
- 简单的几句话让你理解”什么是备份、容灾、集群、负载均衡”
关于容灾.备份.集群.负载均衡这类概念,很多朋友都容易混淆,到底它们之间有什么区别?今天小编我就给大家分别介绍一下,让大家有个深刻的理解 ! 一.备份概念的理解 "备份"只是将数据 ...
- docker swam 集群实现负载均衡
docker swam 集群实现负载均衡 文章目录 docker swam 集群实现负载均衡 1. 初始化集群 2. 虚拟IP 3. 服务发现 4. 多主机LB和服务发现 1. 初始化集群 第一个节点 ...
- 集群,分布式,负载均衡,负载均衡算法
集群 集群的概念 计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作.在某种意义上,他们可以被看作是一台计算机.集群系统中的单个计算机通常称为节点,通常通过局域网连接, ...
- 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡
转载:https://www.cnblogs.com/xiongze520/p/10308720.html 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟 ...
最新文章
- 自定义类似于listView中Item背景
- SAP UI5 应用的 OData XML 格式的元数据请求解析原理,基于 DOMParser
- 美颜相机window 开源_X-Window系统| 免费和开源软件
- python爬取b站弹幕分析_python爬取B站视频弹幕分析并制作词云
- 网络管理员&MCSE2003之2:使用虚拟机Vmware建立多电脑网络环境
- 2018阿里编程测验题:最短汉密尔顿回路
- 高峰论坛:专家热议物联网行业如何迎风飞扬
- BSS/SSID/BSSID、VAP和ESS
- 短语匹配-match_phrase以及slop参数
- android应用统计获取api,APICloud
- qt离线下载地址5.14.2
- 电脑WiFi图标不见了?!怎么办......≡ (▔﹏▔) ≡
- 树莓派4b学习笔记三--基于Ubuntu搭建Docker 和portainer,基于Docker 搭建Homeassistant、EMQX
- python爬虫论文参考文献格式_Python爬虫进阶必备 | XX文学加密分析实例
- Spring Security系列教程11--Spring Security核心API讲解
- flex布局——最后一行左对齐的实现方式(css功能实现)
- 0基础学RS(十四)VTP(VLAN中继协议)作用及配置
- 蓝桥杯试题 算法训练 绘制地图 C/C++解法 AC(最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情。。。。)
- 后渗透之meterpreter学习笔记
- 刷题记录——动态规划
热门文章
- 推荐一个大佬,文章适合偷偷读!
- 从SOD到OOD(C++编码风格)
- 积分价值调整的两个原因
- Cisco IP Phone 7960/7940 SCCP firmware 转换成SIP firmware过程
- Python数据可视化:香港地图、房价可视化,绘制气泡图
- 墨者学院-在线靶场-HTTP头注入漏洞测试(X-Forwarded-for) Writeup
- 【codeforces 794A】Bank Robbery
- 有趣的网站:河蟹娱乐
- oracle19c安装向导空白页,安装Oracle19c提示Warning问题解决
- 【思维题 阈值 期望】10.3奥义商店